接受的答案是错误的(安装nvidia-cuda-toolkit)。通过安装工具包,您基本上是在 nvidia 指南中已安装的 cuda 之上安装第二个 CUDA。
问题原来是符号链接的问题。灵感来自这个话题http://queirozf.com/entries/installing-cuda-tk-and-tensorflow-on-a-clean-ubuntu-16-04-install
但实际分辨率不同
所以在CuDNN 安装过程中的某一时刻nvidia 教程会要求你这样做:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
这种方法的问题是使用过滤器libcudnn* 复制文件会破坏复制文件的符号链接。相反,我建议运行以下命令,但它仍然会破坏链接:
sudo cp --preserve=links cuda/lib64/libcudnn* /usr/local/cuda/lib64
您可以通过在/usr/local/cuda/lib64 文件夹中运行ls -lha libcudnn* 来验证链接。如果你碰巧没有看到这样的图片:
lrwxrwxrwx 1 root root 13 May 2 20:02 libcudnn.so -> libcudnn.so.7
lrwxrwxrwx 1 root root 17 May 2 20:02 libcudnn.so.7 -> libcudnn.so.7.6.5
-rwxr-xr-x 1 root root 409M 5月2日20:02 libcudnn.so.7.6.5
-rw-r--r-- 1 root root 386M 5月2日20:02 libcudnn_static.a
然后你就发现了问题。实际的解决方案涉及执行以下操作:
sudo rm /usr/local/cuda/lib64/libcudnn.so
sudo rm /usr/local/cuda/lib64/libcudnn.so.7
cd /usr/local/cuda/lib64/
sudo ln -s libcudnn.so.7.6.5 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so
删除旧的“链接”并创建新的。使用ls -lha libcudnn* 再次验证链接。之后以详细模式运行以下命令:
sudo ldconfig -v
检查日志。我不知道它究竟做了什么,但事实证明这是非常重要的事情。此外,如果日志显示符号链接已损坏或类似情况,则 tensorflow 将继续显示主题中提到的错误。
奖励!确保您将以下路径附加为最后一行nano ~/.bashrc
export PATH=/usr/local/cuda/bin:/opt/nvidia/nsight-compute/2019.4.0${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDADIR=/usr/local/cuda${CUDADIR:+:${CUDADIR}}
export CUDA_HOME=/usr/local/cuda
然后运行命令source ~/.bashrc
以上所有步骤都假设您没有使用nvidia-cuda-toolkit,而是使用了nvidia cuda repo。
另外,在安装 CUDA 时,请确保您的目标不是10.2。在写TF的时候支持到Cuda 10.1的版本,所以下面是安装必要版本的正确方法:
sudo apt-cache policy cuda
sudo apt-get install cuda=10.1.243-1
验证人:
nvcc --version
nvidia-smi
编辑:我发现运行ldconfig 命令后应该避免看到的错误:
/usr/local/cuda-10.1/targets/x86_64-linux/lib:
...
libnppist.so.10 -> libnppist.so.10.2.0.243
libcuinj64.so.10.1 -> libcuinj64.so.10.1.243
> /sbin/ldconfig.real: /usr/local/cuda-10.1/targets/x86_64-linux/lib /libcudnn.so.7 不是符号链接
libcudnn.so.7 -> libcudnn.so.7.6.5
libnppc.so.10 -> libnppc.so.10.2.0.243
libnppicom.so.10 -> libnppicom.so.10.2.0.243
libnvgraph.so.10 -> libnvgraph.so.10.1.243
/usr/lib/x86_64-linux-gnu/libfakeroot:
...
如果您看到它,那么仍然有一些配置错误。