天天看点

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

今天用户测试 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
【Tensorflow】failed call to cuInit: CUDA_ERROR_MAP_FAILED: mapping of buffer object failed

从报错信息看,就是 cuda init 的一个函数有问题。具体可以定位到错误代码,如下。

https://github.com/tensorflow/tensorflow/blob/v2.1.0/tensorflow/stream_executor/cuda/cuda_driver.cc#L351
【Tensorflow】failed call to cuInit: CUDA_ERROR_MAP_FAILED: mapping of buffer object failed

其实根据代码,顺藤摸瓜,还挺清楚的,就是执行

cuInit()

这个函数报错了,于是就会打印出

failed to call to cuInit...

这个错误日志上,然后就执行

LogDiagnosticInformation()

这个函数了,再去看看这个函数。

https://github.com/tensorflow/tensorflow/blob/v2.1.0/tensorflow/stream_executor/cuda/cuda_diagnostics.cc#L129
【Tensorflow】failed call to cuInit: CUDA_ERROR_MAP_FAILED: mapping of buffer object failed

这个函数也不复杂,按照报错信息,也就是

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

一下,编个二进制出来运行一下。

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

很明显,这里也有问题,那我高度怀疑 cuda 版本的问题,但反正看官方文档,也看不出来 Tensorflow 报这个错是个啥问题,真是糟糕的文档。

https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html
【Tensorflow】failed call to cuInit: CUDA_ERROR_MAP_FAILED: mapping of buffer object failed

很显然就是这个

cuInit()

的函数的问题。

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

未完待续,先吃饭…