注:本文后面写的内容是基于CUDA9.0的,但步骤是仍基本适用的;另外,昨天Tensorflow 最新的版本1.13 rc2发布了: https://github.com/tensorflow/tensorflow/releases/tag/v1.13.0-rc2 里面有几个重要的让人看到就激动(^_^)的improvements:
tf.lite
and source code is now under tensorflow/lite
rather than tensorflow/contrib/lite
.首先,Tensorflow终于支持CUDA 10了!第二,我很在乎的TensorFlow Lite终于移到core里来了!另外,Python3.7可以放心使用了,支持多个NVidia GPU卡之间通讯的NCCL也移到core里了(什么是NCCL,参见https://baijiahao.baidu.com/s?id=1581386178946489641&wfr=spider&for=pc这篇文章)。
所以如果你打算用Tensorflow最新的版本,可以安装CUDA 10,而不是CUDA 9.x,这样可以用到最新的CUDA的特性和避免一些bug。
下面是以前写的原文:
这个问题曾让我折腾了一天半,真是个大坑啊,反复把Tensorflow和CUDA装了卸,卸了又装,然后测试,遇到一个又一个错误,周六晚上弄到凌晨三点,周日上午继续干,终于在周日中午搞定,现在对这个问题弄得比较透彻了。
每安装某一个Tensorflow版本时该安装什么对应版本的cuda和cudnn呢?Tensorflow没有提供明确的提示,我买的多本关于tensorflow的书里都只说作者安装的什么版本,根本没说Tensorflow版本和使用的CUDA、cuDNN版本的对应关系,网上也没找到这样的文章,所以像我这样喜欢尝鲜总是安装最新版Tensorflow 1.8 而不是书上说的版本的就得自己琢磨解决GPU版tensorflow安装后使用时出现的错误了。
在解决tensorflow报错问题的过程中我注意到https://github.com/tensorflow/tensorflow/releases提供了Tensorflow个版本的releases notes,在里面搜索cuda,可以看到在Tensorflow 1.6版里有个大的改动:
这表明Tensorflow1.6开始使用CUDA9.0+cuDNN7。
另外还有一个快捷办法,通过查看tensorflow的源码build_info.py知道其使用的CUDA和cuDNN版本(我在import tensorflow出错后,根据出错信息,阅读琢磨出错的.py代码文件,跟调用关系找到的这个定义版本信息的文件,以前的老版本tensorflow似乎没有这个文件,版本信息都是写死在初始化的.py源码里,需要搜索初始化代码找到检查cuda版本地方):
假设tensorflow安装在D:\Anaconda3\envs\tensorflow环境里,那么打开D:\Anaconda3\envs\tensorflow\Lib\site-packages\tensorflow\python\platform\build_info.py这个文件,可以看到使用的CUDA 9.0和cuDNN 7:
msvcp_dll_name = 'msvcp140.dll'
cudart_dll_name = 'cudart64_90.dll'
cuda_version_number = '9.0'
nvcuda_dll_name = 'nvcuda.dll'
cudnn_dll_name = 'cudnn64_7.dll'
cudnn_version_number = '7'
这里的msvcp140.dll应该在C:\Windows\System32\下面,是通过安装vc 2005 redistribute提供的,nvcuda.dll也是在C:\Windows\System32\下面,cudart64_90.dll则是安装CUDA 9.0时产生的,cudnn64_7.dll是安装cuDNN 7时产生的,任何一个文件缺失或没加入搜索路径都有可能引起tensorflow在import时报ImportError错。
CUDA在https://developer.nvidia.com/cuda-downloads这里下载,打开页面后不要在这个页面里下载,因为这个页面下载的是CUDA9.2,版本太高了跟tensorflow1.8不匹配,而是应该后点击Legacy Releases按钮进入archive页面https://developer.nvidia.com/cuda-toolkit-archive,然后点击CUDA Tookit 9.0进入CUDA 9.0的下载页面https://developer.nvidia.com/cuda-90-download-archive,根据自己机器环境选择操作系统和版本及位数点击相应按钮做选择,注意最后一项Install Type最好选择本地可执行文件,比如Windows版的exe(local)或Linux版的runfile(local),这样在网速差的环境下对成功安装更有保障。对于Windows 64位安装环境,这里需要下载三个安装文件,一个主文件:cuda_9.0.176_win10.exe和两个patch文件:cuda_9.0.176.1_windows.exe,cuda_9.0.176.2_windows.exe。
cuDNN在https://developer.nvidia.com/cudnn这里下载,这里需要先注册账号然后登录才能进去下载,反正NVIDIA网站做的很不友好,注册后登录还得验证邮件转来转去的晕头转向,网站找个什么东西也是很不直观,不是一般的绕,用过NVIDIA网站的恐怕都想吐槽,登录(注册后好像仍然要使用join进去,而不是login,否则老是循环要你验证邮件有效性,晕死)进去后,下载对应于cuda9.0的cudnn7.1.4文件(从https://developer.nvidia.com/rdp/cudnn-download这里下载cudnn最新版7.1.4,不要进Archived cuDNN Releases),对于Windows 64位安装环境,下载cudnn7.1.4 for cuda9.0即cudnn-9.0-windows10-x64-v7.1.zip。
安装CUDA时,最好使用自定义安装,把Visual Studio Integration的勾选去掉,否则你机器上安装的Visual Studio版本不对或者没有安装时,下一步会报错导致你安装不下去(下面两张图是试着安装CUDA 9.1版时的截图,出错提示是一样的,所以不影响作为示例):
这时可以退回去把Visual Studio Integration勾选去掉再安装:
安装CUDA 9.0的默认路径是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\,安装CUDA9.0完后,把cudnn-9.0-windows10-x64-v7.1.zip解压后,把bin,include,lib里面的文件(共三个)分别拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\下的bin,include,lib目录下即可。
然后测试tensorflow,可以看到我本子的GeForce 940MX GPU被tensorflow添加创建为TensorFlow device,并 可以成功打印输出常量c的值,表明安装成功了:
我最初不知道Tensorflow1.8和CUDA 9.0对应依赖关系,我的本子的GPU是很古老的Geforce 940MX,对它没信心,怕安装了CUDA9.0根本不能用,又查看了我的本子上的NVIDIA控制面板里的系统信息窗口里的组件信息,本子上当时安装的NVCUDA版本是8.0.0(这个版本信息其实是CUDA driver版本,而不是要安装的CUDA runtime的版本,把两者搞混了,误导了思考方向):
另外由受书本和网上的有些文章误导跌入坑里,相信应该是安装CUDA8,于是先安装的CUDA8.0.44+cuDNN 7,结果安装GPU版Tensorflow后Import tensorflow时报错找不到文件cudart64_90.dll,把CUDA 8的cudart64_80.dll强制改名为cudart64_90.dll后,Import tensorflow又会报另外的错ImportError: DLL load falied: 找不到指定的模块,不知道是哪个模块找不到,于是我琢磨出错代码,在D:\Anaconda3\Lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py里加了句打印把
mname = '.'.join((pkg, '_pywrap_tensorflow_internal')).lstrip('.')
这里的mname打印出来,可以看到这个模块是tensorflow.python._pywrap_tensorflow_internal,可是在D:\Anaconda3\Lib\site-packages\tensorflow\python\下面有_pywrap_tensorflow_internal.pyd这个文件啊,怎么回事呢?怎么就不认识这个pyd文件呢?于是把tensorflow-gpu 1.8和CUDA 8+cuDNN7/CUDA 8+cuDNN6装了卸卸了装弄了多遍折腾到凌晨几点还是没搞定,今天早上继续,后来突然想到可能是因为Tensorflow1.8就得安装CUDA9.0,否则初始化代码检查CUDA版本失败导致_pywrap_tensorflow_internal这个模块加载不了,后来下载CUDA 9.0+cuDNN7.1,安装好后,果然tensorflow可以用了!
关于安装错误的CUDA版本导致的几个错误,截图如下:
(1)找不到cudart64_90.dll:
(2) ImportError: DLL loaded failed: 找不到指定模块。找不到_pywrap_tensorflow_internal模块:
另外,如果运行tensorflow时报错说:CUDA driver version is insufficient for CUDA runtime version :
这说明你机器上安装的CUDA driver版本比刚安装的CUDA tookit版本低(原因应是安装时没有勾选display driver之类的),解决办法是安装CUDA tookit时所用组件全部勾选(除了Visual Studio Integration),如果还不行,假如你的GPU卡是GeForce序列的,到https://www.geforce.com/drivers按你的机器的GPU卡的类型搜索对应的最新的driver,下载并安装即可,其他序列的去NVIDIA中国网页https://www.nvidia.cn/Download/index.aspx?lang=cn上按卡类型搜索最新的driver安装程序。
通过搜索GUP卡的驱动,知道了很古老的GPU卡NVIDIA仍在提供最新的driver更新,这样就保障了我的GeForce 940MX这样的古懂卡在升级driver到最新后,也可以自由使用最新的CUDA 9.x版本,只要Tensorflow或Caffe支持!这点真是太好了!以前担心我的GPU卡太老导致玩不了比较新的GPU版tensorflow,现在暂时不用担心了!
关于如何在Linux下安装CUDA和CUDNN,参见 我的AI之路(10)--如何在Linux下安装CUDA和CUDNN
我的AI之路(1)--前言
我的AI之路(2)--安装Fedora 28
我的AI之路(3)--安装Anaconda3 和Caffe
我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8
我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本
我的AI之路(6)--在Anaconda3 下安装PyTorch
我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm
我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题
我的AI之路(9)--使用scikit-learn
我的AI之路(10)--如何在Linux下安装CUDA和CUDNN
我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误
我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误
我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误
我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型
我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决
我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境
我的AI之路(17)--Tensorflow和Caffe的API及Guide
我的AI之路(18)--Tensorflow的模型安装之object_detection
我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI
我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集
我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集
我的AI之路(22)--使用Object_Detection_Tensorflow_API
我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow