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