在同一GPU上运行多个tensorflow进程是否不安全?

12

我只有一张GPU(Titan X Pascal,12 GB VRAM),希望在同一张GPU上并行地训练多个模型。

我尝试将我的模型封装在一个名为model.py的Python程序中,并在model.py中加入了代码以限制VRAM使用(基于这个示例)。我能够同时在我的GPU上运行3个model.py实例(每个实例占用少于33%的VRAM)。神奇的是,当我尝试使用4个模型时,我收到了一个错误:

2017-09-10 13:27:43.714908: E tensorflow/stream_executor/cuda/cuda_dnn.cc:371] coul d not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR 2017-09-10 13:27:43.714973: E tensorflow/stream_executor/cuda/cuda_dnn.cc:338] coul d not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM 2017-09-10 13:27:43.714988: F tensorflow/core/kernels/conv_ops.cc:672] Check failed : stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNon fusedAlgo<T>(), &algorithms) Aborted (core dumped)

后来我在tensorflow Github上看到,人们似乎认为在同一张GPU上运行超过一个tensorflow进程是不安全的。这是真的吗?出现这种情况的原因是什么?为什么我能有3个tensorflow进程在同一张GPU上运行,而不能有4个?


2
这并不是 TensorFlow 优化的情况。也就是说,Google 中的所有测试和使用都是通过每个 GPU 仅有单个 TensorFlow 进程来完成的。这使得在这种情况下可能存在错误。即使您设法运行它,我也预计它会有显著的成本惩罚——也就是说,在单个 GPU 上并行运行 2 个 TF 进程将比按顺序运行它们慢得多。 - Yaroslav Bulatov
奇怪的是,这并不是事实(至少在我运行的实验中)。例如,在3个进程的情况下,每个进程所需的时间比使用相同VRAM的单个进程长约11%。 - Adamo
1
为什么我可以在同一GPU上运行3个tensorflow进程而不是4个?你自己说每个实例占用“略少于33%”的GPU内存;看起来你只是因为4个进程耗尽了视频内存(我自己也因为内存不足而看到过类似的错误)。 - jdehesa
实际上,只要有足够的资源,TF 就可以在同一设备上的多个实例上正常运行。你可能需要注意的唯一一件事是设置 gpu_options.allow_growth=True,以防止 TF 在创建会话时默认分配大部分 GPU 的 RAM。 - GPhilo
@GPhilo 我并不一定想允许内存增长,因为这可能会使某些情况下的进程运行变慢。我更喜欢在运行进程时预先分配内存块。你有没有一个引用/链接来解释在同一GPU上运行多个TensorFlow进程是安全的?我找不到任何“官方”的信息,指向任何一种方式。 - Adamo
显示剩余4条评论
2个回答

6

实际上并不是绝对安全的。请看我的回答。 - FindOutIslamNow

-2

答案

根据视频内存大小,可能会允许或不允许运行。

对于我的情况,我有总共2GB的视频内存,而单个实例保留了约1.4GB。当我尝试在已经运行语音识别训练的情况下运行另一个tensorflow代码时,就会出现问题。

2018-08-28 08:52:51.279676: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1405] Found device 0 with properties:
name: GeForce 940MX major: 5 minor: 0 memoryClockRate(GHz): 1.2415
pciBusID: 0000:01:00.0
totalMemory: 2.00GiB freeMemory: 1.65GiB
2018-08-28 08:52:51.294948: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1484] Adding visible gpu devices: 0
2018-08-28 08:52:55.643813: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-08-28 08:52:55.647912: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:971]      0
2018-08-28 08:52:55.651054: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:984] 0:   N
2018-08-28 08:52:55.656853: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1409 MB memory) -> physical GPU (device: 0, name: GeForce 940MX, pci bus id: 0000:01:00.0, compute
capability: 5.0)

我在语音识别中遇到了以下错误,导致脚本完全终止:(我认为根据这个链接,这与视频内存不足有关)

2018-08-28 08:53:05.154711: E T:\src\github\tensorflow\tensorflow\stream_executor\cuda\cuda_driver.cc:1108] could not synchronize on CUDA context: CUDA_ERROR_LAUNCH_FAILED ::
Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1278, in _do_call
    return fn(*args)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1263, in _run_fn
    options, feed_dict, fetch_list, target_list, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1350, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.InternalError: GPU sync failed

4
你的程序是否因为GPU内存不足而失败?如果是这样,那并不是原问题所涉及的内容。在原问题的背景下,这些程序已经可以在受限的GPU内存下单独运行,并且总分配量总和小于100%。 - Joshua Chia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接