今天用户测试 python 3.6 tensorflow-gpu 2.1 和 nvidia driver 418.87.00,遇到下面的问题,然后我们的环境是在 k8s 和 nvidia-docker 上,所以本地可以看到 GPU 设备是 /dev/nvidia3/
,正好落在第四块显卡上(因为是从0开始计数的)。
关于查询这些软硬件版本的方法可以参考这个文档。
https://blog.csdn.net/s_sunnyy/article/details/64121826
从报错信息看,就是 cuda init 的一个函数有问题。具体可以定位到错误代码,如下。
https://github.com/tensorflow/tensorflow/blob/v2.1.0/tensorflow/stream_executor/cuda/cuda_driver.cc#L351
其实根据代码,顺藤摸瓜,还挺清楚的,就是执行 cuInit()
这个函数报错了,于是就会打印出 failed to call to cuInit...
这个错误日志上,然后就执行 LogDiagnosticInformation()
这个函数了,再去看看这个函数。
https://github.com/tensorflow/tensorflow/blob/v2.1.0/tensorflow/stream_executor/cuda/cuda_diagnostics.cc#L129
这个函数也不复杂,按照报错信息,也就是 GetDevNodePath()
出错了,这里的报错其实是没啥意义的,因为这里当然找不到 /dev/nvida0
,原因在开头也说了,这是在 nvidia-docker 的环境下,这里做的 Dignose 诊断,其实只是想读一下设备在不在而已,但是这个跟我们这个问题关系就不大了,因为本身就没有 /dev/nvidia0
这个设备。
按照以往的经验,就是查一遍 cuda 的地址,然后跑一下 cuda 的 sample 程序看看有没有问题。关于 sample 其实是可以测试出来很多东西的,一定要注意一下。/usr/local/cuda/extras/CUPTI/samples/
安装正常的 cuda 的 sample 程序应该是在这个文件夹(cuda 9版本是 sample 少个 s…),很简单,找个程序进去 make
一下,编个二进制出来运行一下。
很明显,这里也有问题,那我高度怀疑 cuda 版本的问题,但反正看官方文档,也看不出来 Tensorflow 报这个错是个啥问题,真是糟糕的文档。
https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html
很显然就是这个 cuInit()
的函数的问题。
未完待续,先吃饭…