автоматически выберите устройство keras tensorflow [duplicate]

Как насчет другого пути?

Проверьте erecruit TypeScript Translator . Он поставляется с готовой поддержкой C #, но на самом деле основан на шаблонах (использует Nunjucks для рендеринга), что означает, что он может генерировать что-нибудь еще - VB.NET, F #, C ++, XML, SQL - все, что вы можете кодировать с помощью шаблона.

Работает как консольная программа .NET, программа NodeJS (для тех, кто не находится в Windows), или как расширение Visual Studio , в комплекте с функцией генерации при сохранении. И включает поддержку MSBuild, просто чтобы сделать ваш сервер сборки счастливым. : -)

6
задан jean 13 January 2017 в 13:27
поделиться

2 ответа

Мне не известно о решении pure-TensorFlow. Проблема в том, что существующее место для конфигураций TensorFlow является конфигурацией сеанса. Однако для памяти GPU пул памяти GPU используется для всех сеансов TensorFlow в рамках процесса, поэтому конфигурация сеанса будет неправильным местом для его добавления, и нет механизма для глобальной конфигурации процесса (но также должно быть способный конфигурировать процесс-глобальный Eigen threadpool). Таким образом, вам нужно сделать на уровне процесса с помощью переменной среды CUDA_VISIBLE_DEVICES.

Что-то вроде этого:

import subprocess, re

# Nvidia-smi GPU memory parsing.
# Tested on nvidia-smi 370.23

def run_command(cmd):
    """Run command, return output as string."""
    output = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
    return output.decode("ascii")

def list_available_gpus():
    """Returns list of available GPU ids."""
    output = run_command("nvidia-smi -L")
    # lines of the form GPU 0: TITAN X
    gpu_regex = re.compile(r"GPU (?P<gpu_id>\d+):")
    result = []
    for line in output.strip().split("\n"):
        m = gpu_regex.match(line)
        assert m, "Couldnt parse "+line
        result.append(int(m.group("gpu_id")))
    return result

def gpu_memory_map():
    """Returns map of GPU id to memory allocated on that GPU."""

    output = run_command("nvidia-smi")
    gpu_output = output[output.find("GPU Memory"):]
    # lines of the form
    # |    0      8734    C   python                                       11705MiB |
    memory_regex = re.compile(r"[|]\s+?(?P<gpu_id>\d+)\D+?(?P<pid>\d+).+[ ](?P<gpu_memory>\d+)MiB")
    rows = gpu_output.split("\n")
    result = {gpu_id: 0 for gpu_id in list_available_gpus()}
    for row in gpu_output.split("\n"):
        m = memory_regex.search(row)
        if not m:
            continue
        gpu_id = int(m.group("gpu_id"))
        gpu_memory = int(m.group("gpu_memory"))
        result[gpu_id] += gpu_memory
    return result

def pick_gpu_lowest_memory():
    """Returns GPU with the least allocated memory"""

    memory_gpu_map = [(memory, gpu_id) for (gpu_id, memory) in gpu_memory_map().items()]
    best_memory, best_gpu = sorted(memory_gpu_map)[0]
    return best_gpu

Затем вы можете поместить его в utils.py и установить GPU в вашем скрипте TensorFlow перед первым tensorflow импортом. IE

import utils
import os
os.environ["CUDA_VISIBLE_DEVICES"] = str(utils.pick_gpu_lowest_memory())
import tensorflow
8
ответ дан Yaroslav Bulatov 19 August 2018 в 01:32
поделиться
  • 1
    Спасибо за этот блестящий ответ! – jean 14 January 2017 в 21:27
  • 2
    Таким образом, очевидно, что nvidia-smi может привести к несоответствующим номерам устройств в некоторой ситуации, похоже, что вы должны объединить его lspci, чтобы получить правильные числа, как описано в 152 – Yaroslav Bulatov 18 January 2017 в 19:43
  • 3
    Я проверю это благодаря! Но пока ваше решение, похоже, отлично работает для меня! – jean 19 January 2017 в 10:08
  • 4
    Если он перестает работать, обходным путем он устанавливает переменную среды: export CUDA_DEVICE_ORDER = PCI_BUS_ID – Yaroslav Bulatov 20 January 2017 в 00:21
  • 5
    Я видел это на github. Еще раз спасибо ! – jean 20 January 2017 в 16:45

Реализация по пути решения Ярослава Булатова доступна на https://github.com/bamos/setGPU .

2
ответ дан Tal 19 August 2018 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: