TF:如果存在两个GPU,则内存分配错误

时间:2018-07-05 21:44:31

标签: python-3.x tensorflow gpu gpu-programming

我在两个pciex16插槽中安装了2个GPU。一种是1080Ti,一种是980。

GPU-Z显示两个设备都存在,并且设备管理器表示两个设备都在正常运行。这是Windows Server 2012操作系统。

如果仅启用了其中一台设备(通过设备管理器,我禁用了其中一台),我可以运行

from tensorflow.python.client import device_lib
local_device_protos = device_lib.list_local_devices()

并查看GPU:0设备。它适用于980和1080ti。我能够运行其他TF代码,并且可以正确使用GPU。

如果同时启用了两个设备,则运行此代码会得到以下CUDA内存不足错误:

InternalError: failed initializing StreamExecutor for CUDA device ordinal 1: Internal: failed call to cuDevicePrimaryCtxRetain: CUDA_ERROR_OUT_OF_MEMORY; total memory reported: 4294967296

尽管GPU-Z显示980的内存使用量为0。

如果我运行sess = tf.Session(),则会收到“无法创建会话”错误。

最后,如果我两次运行两个命令中的任何一个,则python进程死亡(python已停止工作弹出窗口)。

我尝试以较低的内存比例运行

gpu_fraction = 0.1
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

但是此会话也无法启动。

这些错误的原因是什么?我实际上并不关心是否可以将两个GPU都用于特定的python进程,但是我确实希望能够有两个不同的python进程使用一个gpu。

感谢您的帮助!

编辑:

仅添加这样的代码,如果同时启用了两个GPU,则无法为两个GPU创建会话。

with tf.device("/gpu:1"):
    sess2=tf.Session()

Edit2:

根据@RobertCrovella的建议,os.putenv('CUDA_VISIBLE_DEVICES','1') or '0'使我能够在每个进程的单个GPU上成功运行代码。

Edit3:

使用cuda_visible_devices运行tf会导致gpu-z显示不正确的内存使用情况(显示为0)。

0 个答案:

没有答案