一杯茶一包烟,一个环境配一天

某天上网冲浪的时候,看到一种说法 TensorFlow1.14 对新版本的兼容性会更好,于是在大作业之前手贱升级了一下,结果发现再也不能调用 GPU 运算了,接着就有了这篇踩坑记录。 原环境:

  • Win10 1909
  • Anaconda 3
  • Python 3.6.8
  • TensorFlow 1.12
  • CUDA 10.1

本文涉及到 TensorFlow 的指定版本升级、CUDA 的卸载重装与 cuDNN 的重装。


TensorFlow

首先升级 TensorFlow,启动 Anaconda,激活相应环境,启动命令行,使用pip install tensorflow==1.14.0pip install tensorflow-gpu==1.14.0命令安装指定版本 TensorFlow。

最早配置的服务器是清华源,而当天不知道什么原因下载非常不稳定,于是尝试换成中科大源,但是仍然下载失败。

pip install --channel https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ tensorflow-gpu==1.14.0

神秘的是,吃了晚饭回来网络就恢复正常了。

下载之后出现提示,“Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问”,谷歌后解决方案如下。

解决方法: C:\Users\xxx> 中的 xxx 不是管理员,或者说就是权限不够;在 conda 在的路径里,……\Anaconda3 右击属性->安全->user 选中现在的用户,修改权限至所有权限;重新打开命令行,即可。

来自:http://www.zzkook.com/content/anaconda-zai-win10xia-zhuang-shi-yong-wen-ti-jie-jue-ban-fa-hui-zong-duo-tu

安装完之后记得使用conda info命令检查一下版本,同时升级的时候需要注意 CPU 和 GPU 版本之间的顺序。之前有次安装失败没注意看终端,结果装完了 CUDA 发现 TensorFlow 版本还没跟上。

如果使用 CPU 版本的话应该就到此顺利结束了,但是为了使用 GPU 加速,任务还没完。加载环境后可以使用如下代码测试是否能调用 GPU,这一次很可惜不能。

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

CUDA

根据 TensorFlow 官方给出的“经过测试的构建配置”,可以看到 TensorFlow1.14 对应的推荐 CUDA 版本是 10.0,和当前版本不符,显然为了稳定运行还需要降级 CUDA。

来自:[https://www.tensorflow.org/install/source#tested_build_configurations](https://www.tensorflow.org/install/source#tested_build_configurations)

首先是 CUDA 卸载,参考下面这篇博客,在控制面板中卸载含有相关关键词的程序。

CUDA 的卸载:控制面板-卸载程序(不要用 360 等杀毒软件,找不到对应程序的),按照安装时间排序,最上面这几个带版本号的,就是刚才安装的 CUDA 了,挨个卸载即可

来自:https://blog.csdn.net/XunCiy/article/details/89070315

然后是安装包的重新下载,在英伟达官网的 归档 里能找到历史版本的 CUDA。这里推荐使用离线版而不是在线版,借助 IDM 等下载工具能有效提高效率。



cuDNN

下一步是 cuDNN,在 官网 下载,对照上文,下载指定版本后解压、覆盖、检查环境变量,参考教程如下。

下载完,解压 cudnn, 会出现四个文件,如下:[图片、] 在 cuda 安装完后,系统自动在 C 盘的 Program Files 文件中创建了 NVIDIA GPUComputing Toolkit 文件夹,你可以找到如下路径:[图片、] 你可以发现在这个 v9.0 目录下也有类似 cudnn 中的文件夹。将 cudnn 的 bin,include,lib 中的内容 拷贝到 v9.0 的 bin,include,lib 对应目录下,提示替换的话点击 OK。完成,最好重启一下电脑。OK。

来自:https://blog.csdn.net/c20081052/article/details/86683446

这时候运行之前的代码,发现已经可以检测到 GPU,但是跑之前的网络仍然报错,提示版本不匹配。

Loaded runtime CuDNN library: 7.3.1 but source was compiled with: 7.4.1.

查资料后发现,很多博客都建议回退旧版本,这当然不能接受。最终找到了下面这一篇,看来这是使用 Anaconda 造成的问题,主环境中的 cuDNN 版本修改并没有顾及到虚拟环境,于是按照指南顺利解决。

也许你和我一样使用的是 Anaconda,那么,请打开你的 Anaconda 安装路径(比如:我的路径是 F:\Anaconda\anaconda\pkgs),你会发现这有个、[图片、] 好的,我们找到了这个玩意,也许 Anaconda 直接是使用这里的 CUDNN,而不是在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0 这个地方的 CUDNN(这只是猜测)。为此,我们尝试一下直接更新这个 pkgs,在这个网站下载 (https://anaconda.org/anaconda/cudnn/files?sort=basename&sort_order=desc) 选择合适版本的 CUDNN(一定要注意是合适的版本),然后把刚下载的文件解压得到:[图片、] 将里面 Library 的东西复制覆盖到 F:\Anaconda\anaconda\pkgs\ cudnn-7.1.4-cuda9.0_0\Library 的东西(也许你的 Anaconda 路径不同,需要自己找一下)路径,再试一下。

来自:https://blog.csdn.net/Tilamy/article/details/88616201


至此,终于全部完成,新环境:

  • Win10 1909
  • Anaconda 3
  • Python 3.6.8
  • TensorFlow 1.14
  • CUDA 10.0