首先tensorflow cpu和gpu版本可以共存吗? 如果有NV显卡,那么
只需要安装gpu就可以了,gpu版包含cpu版
https://blog.csdn.net/infovisthinker/article/details/54705826
离完成上一篇文章有近1年了。2016年发生了太多的事情,从而没能坚持哪怕是每月一篇这样的频率。终于在2017年的1月份抽出几天搞出了一些东西。一路坑洼,赶紧记录下来。
2016年初就开始看深度学习的东西,主攻TensorFlow。但是一路项目再加上换了公司,每次都是搞两天就停一阵子,然后再拾起来重头搞两天,再被打断。而且换了公司后没有了随意能调用的计算资源,CPU版的TensorFlow直到11月份才安装完,并跑了一些例子。因为一般虚拟机都不支持GPU,所以GPU版就完全没有机会实践。直到TensorFlow出了Windows版,而且发现新换的电脑居然是NVIDIA的GeForce 940M显卡,立刻决定在笔记本上实验安装一把TensorFlow-GPU版本。
但因为手贱,就那么一抖,居然把整个过程搞了近4天才真正地让MNIST的例子跑在GPU上。
不再发骚了,直接上过程,并介绍碰到的这个大大大大坑!!
下面的过程不是一步一步的手把手教程,而是一个简略的叙述,所以如果你想重复实现,最好先了解一些TensorFlow的基础知识。
安装环境:
- 首先下载Anaconda3的Win7 64bit版,安装Python3.5版本。因为目前TensorFlow对Windows只支持Python3.5。可以直接下载Anaconda的安装包安装即可,一般不会有问题。
- Anaconda安装完成后,直接在Windows的命令窗口里敲Python就应该能看到版本是否是3.5。
- 用conda安装jupyter:conda install jupyter
- 创建一个jupyter notebook的目录,然后cd到此目录后启动jupyter notebook:jupyter notebook
- 然后用conda命令安装pip:conda install pip。
- 用conda命令创建tensorflow运行环境:conda create -n tensorflow-gpu。这一步的目的是建立一个单独的python运行环境,方便同时安装CPU版和GPU版本,不会互相影响。
- 启动此运行环境:activate tensorflow-gpu
- 用pip安装tensorflow:pip install tensorflow-gpu
- 启动python命令行编辑器,然后import tensorflow as tf,报错说没有cuda库。
- 按照tensoflow的git网页上指定的CUDA地址下载CUDA8和cudnn的库。其中想下载cudnn的库,需要去注册一下会员。略微麻烦了点。不过都顺利下载。
- 安装CUDA8,直接执行cuda_8.0.44_windows.exe文件,一路默认的点下去。半小时后安装完毕。
- 然后CUDA安装程序会安装一个什么NVIDIA Experience的程序,然后这个程序会自动启动,并询问是否要升级显卡的驱动程序。我脑子一晕,想当然的认为最新的肯定是最好啦,就手贱点了升级。然后一路绿灯的升级完毕。
- 接着解压缩cudnn的库文件cudnn-8.0-windows7-x64-v5.1.zip。把其中的文件夹放到一个地方,比如E:\CUDA。然后可以有两种方法把cudnn库设置成tensorflow可以用。
- 把此目录路径放到Windows的系统PATH参数里面;
- 把目录里面的内容放到CUDA的安装目录(我的是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0)下面相对应的目录里面,bin的放到bin,lib的放到lib,include的放到include。
- 一切就绪,还是在命令行的tensorflow-gpu的运行环境里,启动启动python命令行编辑器,然后import tensorflow as tf。发现5行successfully load的东西,说明找到了cuda的库。
- 定义一个session,如 s=tf.Session() 然后回车,诡异的事情出现了!!
- Windows弹出了一个警告框,说什么“此硬件设备不可拔出或是不能移动......";
- Python命令行里面的错误提示是:......can not cuInit: CUDA_NO_DEVICE_ERROR......
- 完全无头绪的两个提示,立刻开始一顿狂搜百度。结果发现居然没有人碰到这样的问题。马上翻墙出去上google,再搜,得到的信息极其稀少。首先是安装在Windows上的就很少,而碰到这个问题的就更少。唯一一个一样的是stackoverflow上某人提到了设备不能拔出和移动,还是英语,一开始就没留意。而且他最后问题是解决了,解决方法是windows里面把显卡卸载了再安装就好了。基本没有参考价值。
- 接着继续搜,B+G满世界的海搜。的一个初始的想法是CUDA安装没装好,就把第11步反复搞,结果还是一样。
- 搞了一天,发现没进展,开始怀疑是显卡的问题,于是把显卡给删了,再装。然后重复14步,没问题,15步又出错,但是这次报的错不再是什么硬件不能拔,而是Python程序出错。眼泪立刻下来了,虽然还是错,但终于开始接近问题的本质了。开始怀疑是显卡驱动程序的问题。立刻查看,NVIDIA的控制面板里给出了驱动信息,是版本368.81。然后安装了一个GPU-z,看看显卡的情况。驱动版本也是一样的,但是提示显示CUDA不支持。。。。。。
- 于是去Geforce的官网找驱动,然后找了最新的2016年12月的版本,下载安装。然后第15步的错误再现!!根据18步的情况,判断新的驱动版本可能不行。
- 于是去Geforece官网找旧版本,奇葩的是,Geforece最旧的版本只到2016年8月份的372.54版。下载372.54,安装还是15步的问题。
- 只好满世界的找旧版本驱动,大海捞针一般。前后下了7-8个版本。终于在安装了一个很旧的版本后353.62(2015年出的驱动),情况开始发生逆转了!!
- 安装完此旧版,运行一个session后,tensorflow居然显示找到了显卡,且能打印出显卡的信息啦。那个心花怒放啊!!以为苦日子终于熬到头了。
- 然而,真正开始跑MNIST例子的时候,一堆警告出现:...... cuda version is insufficient for cuda runtime environment....。居然出了新的问题。不过还好,之前搜索驱动程序的时候见到过别人贴的这个问题,解决方案是显卡的驱动版本要足够高。
- 于是从353.62版本开始,一个一个的试更高的版本,355.98,359.06,361.91,365.81全都试过了,不是版本过低就是高版本后python程序出错。前前后后搞了2天多,还是不行。这时候开始冷静下来整理思路了:
- 问题已经基本锁定在显卡的驱动程序的版本上;
- 别人为什么没有出现过什么问题,从而造成B+G上几乎没有出现15里面的情况的帖子?
- 别人没碰到,说明自然安装就能解决掉。
- 那么就有可能是CUDA库会有自己支持的一个版本的驱动程序。
- 等分析到这里,思路就清晰了,CUDA的版本是确定的,就是要找到和这个CUDA支持的驱动程序版本。于是仔细的又看了一下CUDA的安装组件,果然发现,在安装CUDA的过程中,安装包自身就包括了一个369.30版的显卡驱动。那么这个版本就应该是和CUDA8相互支持匹配的驱动程序。
- 发现了这个问题后,就立刻卸载掉已经安装的高于369.30驱动程序,然后按照第11步从新装一遍CUDA,选择自定义安装,选择369.30的驱动。
- 装完重启,再次运行,终于只有successfully,没有其他的警告啦。GPU-Z也显示GPU load在80%左右。CPU的用量很低。
问题分析:
- 根源其实很简单,就是CUDA8有自己完全兼容匹配的Geforece显卡的驱动程序。我的GeForece 940M对应的就是369.30版
- 用CUDA安装程序默认就会把这个版本的驱动程序装上。但这里有两个坑:
- CUDA安装默认是全装,神马Experience、Insights都装,装完了就立刻检测你机器的显卡驱动是否是最新的,发现不是最新的,就建议你升级。如果如我一般手贱了一下,后面就悲剧了。
- 如果你已经自己升级过驱动版本高于369.30,CUDA安装不会降级,这个时候也会悲剧。
- 如果机器的驱动版本低于369.30,CUDA就会安装升级。这种情况应该是最常见的,因此一般安装完成后TensorFlow-GPU就能完美的识别GPU并用来进行计算。我猜测这也就是为啥网上几乎没有出现我碰到的问题的帖子。因为默认都是OK的。
上一篇写了之前在我的Windows7上安装TensorFlow GPU版的一路坑坑洼洼,本以为已经解决了。但实际上在过年的几天内,又一次出现了问题。经过了反复的尝试,到今天为止终于稳定下来,特此记录一下。但是具体原因还是不十分清楚。
上一篇写到用CUDA自带的安装包里的390.60版显卡驱动程序完成安装后,终于可以运行TensorFlow的例子在GPU上了,很是开心了一阵子。但就在带回家过年的几天里,再次运行例子,居然又出现了“此设备不能移动或不能拔出”的问题,然后程序崩溃掉了,连切换到CPU都不行。彻底晕菜!!
之后按照之前的做法,卸掉显卡,卸掉驱动,卸掉CUDA程序,再从头安装,居然问题没有解决。于是又一通卸载和安装,但问题依旧。驱动程序版本低了说insufficient version,版本高了不是python崩溃,就是弹出显卡。
折腾了几天,完全没有头绪了。后来想起CUDA在安装的过程中曾经提出过Visual Studio的版本不兼容的问题,再想起莫烦的视屏里也提到需要Visual Studio 2015的一个情况,就在想是不是我本机的Visual Studio有问题。赶紧查看,发现本机没有安装Visual Studio,但有一对Visual C++,最高是2013版。于是开始了心酸的VS升级的过程。
升级VS最大的问题出现在微软的任何软件都是超级大,不是一般的大,是超级大。公司的电脑C盘只给了75G,在剩余15G的情况下,居然装不了VS 2015 community版本!!!!最后C盘空间不足而失败!!!
中间各种卸载其他软件等等的苦难就不说了,最后还是找IT运维把C盘扩展到150G解决了这个狗屎问题。
装完VS 2015,再装各种CUDA和驱动,问题依然。此时已经几乎是心灰意冷了,想想还是用用CPU版算了。
中间隔了几天,恢复心态后,又仔细想想这个问题。总觉得和TensorFlow没啥关系,因为TensorFlow自己报的错是找不到硬件:CUDA_NO_DEVICE_ERROR。那么就是硬件和Windows7自己的问题。于是上网去专门搜“此设备不能移动或不能拔出”的问题,而不是和TensorFlow一起搜。
果然,各个游戏论坛里关于这个问题的帖子很多,基本都是升级了显卡驱动程序后出现的。一般的解决方案都是回退显卡的驱动到前一个版本。但是对于我来说,是没有了前一个版本的。最后抱着死马当作活马医的想法,用GeForce Experience里的驱动更新功能,来更新显卡驱动程序。发现最新的显卡版本已经是2017年1月24号的了,比之前折腾的时候还要新,于是就安装了一把。
奇迹出现了!!!安装完是最新的378.49版本。然后一切正常,TensorFlow也可以用GPU来运算了,反复重启后还是很好用。完美解决!!
原因分析:基本能定位在是GeForce显卡的驱动程序上,但是具体明确的原因还是不清楚。之前安装396.60版后成功了,但是又出问题,怀疑是Windows更新了驱动程序。同时估计是这个版本和当时机器上的VS还是存在兼容的问题。而更新到VS 2015后,再用最新的驱动程序,两者之间兼容性很好,所以显卡就能正常工作了。
后记:利用GPU,现在跑Udacity教程,基本上调参再跑一次都是分钟杀。在Linux CPU版本上如果做同样的事情,那每个跑一次模型都要几个小时,完全无法正常练习。所以还是强烈建议想学TensorFlow的童鞋,用GPU版本吧。人生会灿烂很多!!!
________________
转载的,https://blog.csdn.net/infovisthinker