【发布时间】: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
标签: python tensorflow gpu nvidia