再写博文,回顾在Windows7上安装TensorFlow-GPU的一路坑

离完成上一篇文章有近1年了。2016年发生了太多的事情,从而没能坚持哪怕是每月一篇这样的频率。终于在2017年的1月份抽出几天搞出了一些东西。一路坑洼,赶紧记录下来。

2016年初就开始看深度学习的东西,主攻TensorFlow。但是一路项目再加上换了公司,每次都是搞两天就停一阵子,然后再拾起来重头搞两天,再被打断。而且换了公司后没有了随意能调用的计算资源,CPU版的TensorFlow直到11月份才安装完,并跑了一些例子。因为一般虚拟机都不支持GPU,所以GPU版就完全没有机会实践。直到TensorFlow出了Windows版,而且发现新换的电脑居然是NVIDIA的GeForce 940M显卡,立刻决定在笔记本上实验安装一把TensorFlow-GPU版本。

但因为手贱,就那么一抖,居然把整个过程搞了近4天才真正地让MNIST的例子跑在GPU上。

不再发骚了,直接上过程,并介绍碰到的这个大大大大坑!!


下面的过程不是一步一步的手把手教程,而是一个简略的叙述,所以如果你想重复实现,最好先了解一些TensorFlow的基础知识。

安装环境:

  • Windows 7 64bit
  • GPU: GeForce 940M
  • Python: 3.5.2
  • CUDA: 8

我的安装过程:

  1. 首先下载Anaconda3的Win7 64bit版,安装Python3.5版本。因为目前TensorFlow对Windows只支持Python3.5。可以直接下载Anaconda的安装包安装即可,一般不会有问题。
  2. Anaconda安装完成后,直接在Windows的命令窗口里敲Python就应该能看到版本是否是3.5。
  3. 用conda安装jupyter:conda install jupyter
  4. 创建一个jupyter notebook的目录,然后cd到此目录后启动jupyter notebook:jupyter notebook
  5. 然后用conda命令安装pip:conda install pip。
  6. 用conda命令创建tensorflow运行环境:conda create -n tensorflow-gpu。这一步的目的是建立一个单独的python运行环境,方便同时安装CPU版和GPU版本,不会互相影响。
  7. 启动此运行环境:activate tensorflow-gpu
  8. 用pip安装tensorflow:pip install tensorflow-gpu
  9. 启动python命令行编辑器,然后import tensorflow as tf,报错说没有cuda库。
  10. 按照tensoflow的git网页上指定的CUDA地址下载CUDA8和cudnn的库。其中想下载cudnn的库,需要去注册一下会员。略微麻烦了点。不过都顺利下载。
  11. 安装CUDA8,直接执行cuda_8.0.44_windows.exe文件,一路默认的点下去。半小时后安装完毕。
  12. 然后CUDA安装程序会安装一个什么NVIDIA Experience的程序,然后这个程序会自动启动,并询问是否要升级显卡的驱动程序。我脑子一晕,想当然的认为最新的肯定是最好啦,就手贱点了升级。然后一路绿灯的升级完毕。
  13. 接着解压缩cudnn的库文件cudnn-8.0-windows7-x64-v5.1.zip。把其中的文件夹放到一个地方,比如E:\CUDA。然后可以有两种方法把cudnn库设置成tensorflow可以用。
    1. 把此目录路径放到Windows的系统PATH参数里面;
    2. 把目录里面的内容放到CUDA的安装目录(我的是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0)下面相对应的目录里面,bin的放到bin,lib的放到lib,include的放到include。
  14. 一切就绪,还是在命令行的tensorflow-gpu的运行环境里,启动启动python命令行编辑器,然后import tensorflow as tf。发现5行successfully load的东西,说明找到了cuda的库。
  15. 定义一个session,如 s=tf.Session() 然后回车,诡异的事情出现了!!
    1. Windows弹出了一个警告框,说什么“此硬件设备不可拔出或是不能移动......";
    2. Python命令行里面的错误提示是:......can not cuInit: CUDA_NO_DEVICE_ERROR......
  16. 完全无头绪的两个提示,立刻开始一顿狂搜百度。结果发现居然没有人碰到这样的问题。马上出去上google,再搜,得到的信息极其稀少。首先是安装在Windows上的就很少,而碰到这个问题的就更少。唯一一个一样的是stackoverflow上某人提到了设备不能拔出和移动,还是英语,一开始就没留意。而且他最后问题是解决了,解决方法是windows里面把显卡卸载了再安装就好了。基本没有参考价值。
  17. 接着继续搜,B+G满世界的海搜。的一个初始的想法是CUDA安装没装好,就把第11步反复搞,结果还是一样。
  18. 搞了一天,发现没进展,开始怀疑是显卡的问题,于是把显卡给删了,再装。然后重复14步,没问题,15步又出错,但是这次报的错不再是什么硬件不能拔,而是Python程序出错。眼泪立刻下来了,虽然还是错,但终于开始接近问题的本质了。开始怀疑是显卡驱动程序的问题。立刻查看,NVIDIA的控制面板里给出了驱动信息,是版本368.81。然后安装了一个GPU-z,看看显卡的情况。驱动版本也是一样的,但是提示显示CUDA不支持。。。。。。
  19. 于是去Geforce的官网找驱动,然后找了最新的2016年12月的版本,下载安装。然后第15步的错误再现!!根据18步的情况,判断新的驱动版本可能不行。
  20. 于是去Geforece官网找旧版本,奇葩的是,Geforece最旧的版本只到2016年8月份的372.54版。下载372.54,安装还是15步的问题。
  21. 只好满世界的找旧版本驱动,大海捞针一般。前后下了7-8个版本。终于在安装了一个很旧的版本后353.62(2015年出的驱动),情况开始发生逆转了!!
  22. 安装完此旧版,运行一个session后,tensorflow居然显示找到了显卡,且能打印出显卡的信息啦。那个心花怒放啊!!以为苦日子终于熬到头了。
  23. 然而,真正开始跑MNIST例子的时候,一堆警告出现:...... cuda version is insufficient for cuda runtime environment....。居然出了新的问题。不过还好,之前搜索驱动程序的时候见到过别人贴的这个问题,解决方案是显卡的驱动版本要足够高。
  24. 于是从353.62版本开始,一个一个的试更高的版本,355.98,359.06,361.91,365.81全都试过了,不是版本过低就是高版本后python程序出错。前前后后搞了2天多,还是不行。这时候开始冷静下来整理思路了:
    1. 问题已经基本锁定在显卡的驱动程序的版本上;
    2. 别人为什么没有出现过什么问题,从而造成B+G上几乎没有出现15里面的情况的帖子?
    3. 别人没碰到,说明自然安装就能解决掉。
    4. 那么就有可能是CUDA库会有自己支持的一个版本的驱动程序。
  25. 等分析到这里,思路就清晰了,CUDA的版本是确定的,就是要找到和这个CUDA支持的驱动程序版本。于是仔细的又看了一下CUDA的安装组件,果然发现,在安装CUDA的过程中,安装包自身就包括了一个369.30版的显卡驱动。那么这个版本就应该是和CUDA8相互支持匹配的驱动程序。
  26. 发现了这个问题后,就立刻卸载掉已经安装的高于369.30驱动程序,然后按照第11步从新装一遍CUDA,选择自定义安装,选择369.30的驱动。
  27. 装完重启,再次运行,终于只有successfully,没有其他的警告啦。GPU-Z也显示GPU load在80%左右。CPU的用量很低。
到此为止,终于解决了Windows7上安装运行TensorFlow GPU版本,成功运行了简单版和卷积版的MNIST。

问题分析:

  1. 根源其实很简单,就是CUDA8有自己完全兼容匹配的Geforece显卡的驱动程序。我的GeForece 940M对应的就是369.30版
  2. 用CUDA安装程序默认就会把这个版本的驱动程序装上。但这里有两个坑:
    1. CUDA安装默认是全装,神马Experience、Insights都装,装完了就立刻检测你机器的显卡驱动是否是最新的,发现不是最新的,就建议你升级。如果如我一般手贱了一下,后面就悲剧了。
    2. 如果你已经自己升级过驱动版本高于369.30,CUDA安装不会降级,这个时候也会悲剧。
  3. 如果机器的驱动版本低于369.30,CUDA就会安装升级。这种情况应该是最常见的,因此一般安装完成后TensorFlow-GPU就能完美的识别GPU并用来进行计算。我猜测这也就是为啥网上几乎没有出现我碰到的问题的帖子。因为默认都是OK的。
虽然过程很痛苦也漫长,但是这么一折腾还是学到了很多东西,NVIDIA的网站也看了不少。对GPU也有了一些了解。得失都有。下面就开始TensorFlow GPU的学习了。

后记:用CPU和GPU搞了一下对比,结果还是很清楚的。
CPU:4核的i5,
GPU:GeForce 940M

CNN的MNIST,CPU的4核全100%的负载,搞了56分钟;GPU平均80%的负载,7分钟搞定。实在是快!!!

你可能感兴趣的:(TensorFlow-GPU)