nvidia-docker 中的 TensorFlow:对 cuInit 的调用失败:CUDA_ERROR_UNKNOWN
Posted
技术标签:
【中文标题】nvidia-docker 中的 TensorFlow:对 cuInit 的调用失败:CUDA_ERROR_UNKNOWN【英文标题】:TensorFlow in nvidia-docker: failed call to cuInit: CUDA_ERROR_UNKNOWN 【发布时间】:2017-10-14 23:46:21 【问题描述】:我一直在努力让一个依赖 TensorFlow 的应用程序作为具有 nvidia-docker
的 docker 容器工作。我已经在tensorflow/tensorflow:latest-gpu-py3
图像之上编译了我的应用程序。我使用以下命令运行我的 docker 容器:
sudo nvidia-docker run -d -p 9090:9090 -v /src/weights:/weights myname/myrepo:mylabel
通过portainer
查看日志时,我看到以下内容:
2017-05-16 03:41:47.715682: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 03:41:47.715896: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 03:41:47.715948: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 03:41:47.715978: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 03:41:47.716002: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
2017-05-16 03:41:47.718076: E tensorflow/stream_executor/cuda/cuda_driver.cc:405] failed call to cuInit: CUDA_ERROR_UNKNOWN
2017-05-16 03:41:47.718177: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:158] retrieving CUDA diagnostic information for host: 1e22bdaf82f1
2017-05-16 03:41:47.718216: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: 1e22bdaf82f1
2017-05-16 03:41:47.718298: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: 367.57.0
2017-05-16 03:41:47.718398: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:369] driver version file contents: """NVRM version: NVIDIA UNIX x86_64 Kernel Module 367.57 Mon Oct 3 20:37:01 PDT 2016
GCC version: gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
"""
2017-05-16 03:41:47.718455: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: 367.57.0
2017-05-16 03:41:47.718484: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:300] kernel version seems to match DSO: 367.57.0
容器似乎可以正常启动,并且我的应用程序似乎正在运行。当我向它发送预测请求时,预测会正确返回 - 但是在 CPU 上运行推理时速度会很慢,所以我认为很明显 GPU 出于某种原因没有被使用。我还尝试在同一个容器中运行nvidia-smi
,以确保它看到我的 GPU,结果如下:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57 Driver Version: 367.57 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GRID K1 Off | 0000:00:07.0 Off | N/A |
| N/A 28C P8 7W / 31W | 25MiB / 4036MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
我当然不是这方面的专家——但从容器内部看来,GPU 确实是可见的。关于如何使用 TensorFlow 进行此操作的任何想法?
【问题讨论】:
有趣的是,答案再简单不过了:我重新启动了主机,现在一切正常!我不记得安装任何更新,所以我认为没有必要重新启动,但确实如此! 重启完成了这项工作,谢谢。 系统重启对我有用 【参考方案1】:我在我的 ubuntu16.04 桌面上运行 tensorflow。
我在几天前使用 GPU 运行代码运行良好。 但是今天我找不到下面代码的gpu设备
import tensorflow as tf
from tensorflow.python.client import device_lib as _device_lib
with tf.Session() as sess:
local_device_protos = _device_lib.list_local_devices()
print(local_device_protos)
[print(x.name) for x in local_device_protos]
当我运行tf.Session()
时,我意识到了以下问题
cuda_driver.cc:406] 调用 cuInit 失败:CUDA_ERROR_UNKNOWN
我在系统详细信息中检查了我的 Nvidia 驱动程序,nvcc -V
、nvida-smi
检查驱动程序、cuda 和 cudnn。一切似乎都很好。
然后我去Additional Drivers查看驱动详情,我发现NVIDIA驱动有很多版本,并且选择了最新版本。但是当我第一次安装驱动时,只有一个。
所以我选择了一个旧版本,并应用更改。
然后我运行tf.Session()
问题也在这里。我想我应该重启我的电脑,重启后这个问题就消失了。
sess = tf.Session()
2018-07-01 12:02:41.336648: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-07-01 12:02:41.464166: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-07-01 12:02:41.464482: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 0 with properties:
name: GeForce GTX 1070 major: 6 minor: 1 memoryClockRate(GHz): 1.8225
pciBusID: 0000:01:00.0
totalMemory: 7.93GiB freeMemory: 7.27GiB
2018-07-01 12:02:41.464494: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2018-07-01 12:02:42.308689: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-01 12:02:42.308721: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929] 0
2018-07-01 12:02:42.308729: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0: N
2018-07-01 12:02:42.309686: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7022 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability:
【讨论】:
【参考方案2】:也许问题与由 GPU 创建的 JIT 缓存文件权限有关。 在 linux 上,默认情况下,缓存文件是在 ~/.nv/ComputeCache 中创建的。 为JIT cache 设置另一个目录可以解决问题。做吧
export CUDA_CACHE_PATH=/tmp/nvidia
在 GPU 上运行之前。
【讨论】:
【参考方案3】:我尝试安装 nvidia-modrpobe,但仍然出现同样的错误。 然后一个简单的系统重启对我有用
【讨论】:
【参考方案4】:在我的例子中,这个命令失败了:
docker run --gpus all --runtime=nvidia -it --rm tensorflow/tensorflow:latest-gpu \
python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
添加--privileged
即可解决问题:
docker run --gpus all --runtime=nvidia --privileged -it --rm tensorflow/tensorflow:latest-gpu \
python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
【讨论】:
以上是关于nvidia-docker 中的 TensorFlow:对 cuInit 的调用失败:CUDA_ERROR_UNKNOWN的主要内容,如果未能解决你的问题,请参考以下文章