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

Posted

技术标签:

【中文标题】在同一个 GPU 上运行多个 tensorflow 进程是不是不安全?【英文标题】:Is it unsafe to run multiple tensorflow processes on the same GPU?在同一个 GPU 上运行多个 tensorflow 进程是否不安全? 【发布时间】:2018-02-19 01:40:18 【问题描述】:

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

我尝试将我的模型封装在单个 python 程序(称为 model.py)中,并在 model.py 中包含代码以限制 VRAM 的使用(基于this example)。我能够在我的 GPU 上同时运行多达 3 个 model.py 实例(每个实例占用的 VRAM 不到 33%)。奇怪的是,当我尝试使用 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)

我后来观察到on the tensorflow Github,人们似乎认为每个 GPU 运行多个 tensorflow 进程是不安全的。这是真的吗,有没有解释为什么会这样?为什么我能够在同一个 GPU 上运行 3 个 tensorflow 进程而不是 4 个?

【问题讨论】:

TensorFlow 不是针对这种情况进行优化的。 IE,Google 中的所有测试和使用都是通过每个 GPU 只有一个 TensorFlow 进程来完成的。这使得在这种情况下很可能存在错误。即使你让它运行,我预计它也会有很大的成本损失——即,在单个 GPU 上并行运行 2 个 TF 进程将比按顺序运行要慢得多 奇怪的是,情况并非如此(至少在我进行的实验中)。例如,在 3 个进程的情况下,每个进程所用的时间比具有相同 VRAM 使用率的单个进程的情况长约 11%。 我明白了,我怀疑GPU不是这种情况下的瓶颈(即GPU利用率低) “为什么我能够在同一个 GPU 上运行 3 个 tensorflow 进程而不是 4 个?”您自己说过每个实例占用“略低于 33%”的 GPU 内存;似乎您只是用 4 个进程耗尽了视频内存(由于内存不足,我自己也看到过类似的错误)。 实际上,TF 在同一设备上的多个实例中运行良好(当然,只要资源可用)。您可能需要注意的唯一一件事是设置 gpu_options.allow_growth=True 以防止 TF 在您创建会话时默认分配大部分 GPU 的 RAM 【参考方案1】:

简而言之:是的,在同一个 GPU 上运行多个进程是安全的(截至 2017 年 5 月)。以前这样做是不安全的。

Link to tensorflow source code that confirms this

【讨论】:

事实上并不是绝对安全的。看我的回答【参考方案2】:

回答

根据显存大小,是否允许。

就我而言,我的总视频内存为 2GB,而单个实例保留了大约 1.4GB。当我已经在运行the speech recognition training时尝试运行另一个张量流代码。

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)

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

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

【讨论】:

您的程序是否因为 GPU 内存不足而失败?如果是这样,那不是最初的问题。在原始问题的上下文中,程序已经可以单独运行受限的 GPU 内存,并且总分配总和不到 100%。

以上是关于在同一个 GPU 上运行多个 tensorflow 进程是不是不安全?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow只能在装有gpu的机器上运行

Tensorflow 未在 jupyter notebook 的 GPU 上运行

Tensorflow 会自动使用多个 CPU 吗?

无法在 GPU 上运行 tensorflow

如何在没有 GPU 的情况下运行 tensorflow?

如何在 CPU 上运行 TensorFlow