【Tensorflow】failed call to cuInit: CUDA_ERROR_MAP_FAILED: mapping of buffer object failed

2021-01-26 16:02:07 浏览数 (1)

今天用户测试 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() 的函数的问题。

未完待续,先吃饭…

0 人点赞