我可以通过ssh访问n个集群的GPU。 Tensorflow自动给它们命名为gpu:0,...,gpu:(n-1)。
其他人也可以访问,有时他们会随机访问gpus。
我没有明确地放置任何tf.device()
,因为这很麻烦,即使我选择了gpu编号j,并且有人已经在gpu编号j上存在问题。
我想通过gpus使用并找到第一个未使用的并且只使用这个。
我猜有人可以使用bash解析nvidia-smi
的输出并得到一个变量i并将该变量i作为要使用的gpu的数量提供给tensorflow脚本。
我从未见过这样的例子。我想这是一个非常普遍的问题。最简单的方法是什么?是一个纯粹的张量流吗?
答案 0 :(得分:13)
我不知道纯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<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
并在导入第一个tensorflow
之前在TensorFlow脚本中设置GPU。 IE
import utils
import os
os.environ["CUDA_VISIBLE_DEVICES"] = str(utils.pick_gpu_lowest_memory())
import tensorflow
答案 1 :(得分:5)
在https://github.com/bamos/setGPU上可以找到Yaroslav Bulatov解决方案的实施方案。