使用tf 时gpu的设置

  • Post author:
  • Post category:其他


使用GPU跑tensorflow程序,默认加载所有的GPU,但计算过程中只会用其中一块。也就是你看着所有GPU都被占用了,以为是在GPU并行计算,但实际上只有其中一块在运行;另外的所有显卡都闲着,但其显存都被占用了,所以别人也用不了。不过这种情况通过在程序之前加三行代码就可以解决:

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = "0"

这行代码加在TensorFlow程序开头,就可以成功屏蔽掉系统中除

gpu0

(当然,这个gpu序号要根据实际情况来定)之外所有的GPU设备了。

如果想使用GPU0和GPU1,可以将第三行代码改为:

os.environ['CUDA_VISIBLE_DEVICES'] = "0,1"

注意,第二行

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"

也很重要,保证程序中的GPU序号是和硬件中的序号是相同的,否则可能会造成不少的麻烦。

如果不想使用GPU,也有办法。这样设置第三行代码

os.environ['CUDA_VISIBLE_DEVICES'] = ""

,这样这个程序就不能看见所有的GPU了。

除此之外,TensorFlow程序会吃掉所用显卡的所有显存,如果想让程序需要多少显存就用多少应该怎么设置呢?创建

session

的时候加一项设置:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)

还可以设置显存的使用量

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9 # 占用GPU90%的显存
session = tf.Session(config=config)

程序跑起来之后还查看显存使用情况:

nvidia-smi

如上面的表格显示我有两块GPU:设备0为quadro K2200,设备1为Tesla K40c。我现在正在跑yolov3的代码,只是用到了1号GPU,进程对应的PID是21971,占用的显存是5631MiB,GPU的浮动利用率是98%。

这里需要注意的是:显存占用和GPU占用是两个不一样的东西。显卡是由GPU和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。我跑yolov3代码的时候显存占得少,GPU占得多。

上面的表格中:

第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速。有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低温(比如我们实验室的服务器是常年放在空调房间里的)。

第二栏的Temp:是温度,单位摄氏度。

第三栏的Perf:是性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能。

第四栏下方的Pwr:是能耗,上方的Persistence-M:是持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态。

第五栏的Bus-Id是涉及GPU总线的东西,domain:bus:device.function。用lspci | grep -i nvidia*命令查看连接到总线的nvidia设备信息,和表格中的Bus-Id是一一对应的。

第六栏的Disp.A是Display Active,表示GPU的显示是否初始化。

第五第六栏下方的Memory Usage是显存使用率。

第七栏是浮动的GPU利用率。

第八栏上方是关于ECC的东西。

第八栏下方Compute M是计算模式。

下面一张表示每个进程占用的显存使用率。



版权声明:本文为william_munch原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。