正文
return get_default_graph().device(device_name_or_function)
在我们的训练脚本中使用with语句就可以指定接下来的操作在某个GPU上进行。
with tf.device('/gpu:2'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
那么问题来了:
-
在写训练脚本时怎么知道哪个GPU是空闲可用的?
-
同组的人做实验和我冲突怎么办?
-
将来某个时刻运行这个脚本的时候是不是还要根据情况修改?
-
同行用我的代码复现实验,GPU配置环境不一样,他们甚至可能没有GPU,又要改代码?
当然,上道儿的开发者都知道nvidia-smi可以查询显卡信息,查看GPU显存、温度、功率使用,然后选择合适的GPU。
每次训练前执行这个命令,再与良好团队保持良好的沟通可以解决上述1、2两个问题,但是3、4两个问题还是不好解决。
而且经常和师兄弟、同事抢卡岂不是影响效率?
我们需要一种解决方案,能够实现不修改脚本、不需要和组员沟通,自动选择空闲GPU设备。
实现
如何高效获取GPU状态信息
nvidia-smi (https://developer.nvidia.com/nvidia-system-management-interface)
是一个由NVIDIA官方提供的GPU状态管理、监控命令行软件。和其他命令行软件一样,nvidia-smi也有许多argument。
通过阅读
文档
,以及学习
老司机的经验(http://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries)
,我们知道--query-gpu这个option可以指定查询GPU状态信息,并返回格式化信息。
通过执行命令:
nvidia-smi --help-query-gpu
我们得到了所有支持的查询参数(太多了不一一枚举)
最有用的参数老司机给我们总结出来了: