当前位置:  开发笔记 > 编程语言 > 正文

共享GPU上的Tensorflow:如何自动选择未使用的GPU

如何解决《共享GPU上的Tensorflow:如何自动选择未使用的GPU》经验,为你挑选了2个好方法。

我可以通过ssh访问n个集群的GPU.Tensorflow自动给它们命名为gpu:0,...,gpu:(n-1).

其他人也可以访问,有时他们会随机访问gpus.我没有任何tf.device()明确的说明,因为这很麻烦,即使我选择了gpu编号j,并且有人已经在gpu编号j上会有问题.

我想通过gpus使用,找到第一个未使用的,只使用这个.我猜有人可以nvidia-smi用bash 解析输出并获得变量i并将该变量i作为要使用的gpu的数量提供给tensorflow脚本.

我从未见过这样的例子.我想这是一个非常普遍的问题.最简单的方法是什么?是一个纯粹的张量流可用吗?



1> Yaroslav Bul..:

我不知道纯TensorFlow解决方案.问题是TensorFlow配置的现有位置是会话配置.但是,对于GPU内存,GPU内存池是为进程内的所有TensorFlow会话共享的,因此Session配置将是添加它的错误位置,并且没有进程全局配置的机制(但是应该也是如此)能够配置进程全局特征线程池).因此,您需要使用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\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\d+)\D+?(?P\d+).+[ ](?P\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在首次tensorflow导入之前将其放入TensorFlow脚本中并设置GPU .IE

import utils
import os
os.environ["CUDA_VISIBLE_DEVICES"] = str(utils.pick_gpu_lowest_memory())
import tensorflow


因此,显然,“ nvidia-smi”可以在某些情况下提供不匹配的设备编号,看来您必须将其“ lspci”组合起来才能获得正确的编号,如[152]中所述(https://github.com/tensorflow/ tensorflow /问题/ 152#issuecomment-273555972)

2> Trisolorians..:

可以在https://github.com/bamos/setGPU上获得与Yaroslav Bulatov解决方案类似的实现。

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有