在服务器上跑gpu版本tensorflow
一直天真的以为学校服务器上面有gpu就可以自动的照着gpu版本的跑了,但是每次发现输出信息中的device都显示是cpu,虽然速度是比我的电脑快,但batchsize=8跑个6000张的图像一轮就要2小时,感觉不大对劲。后来一查,发现可用设备里面压根没有gpu啊??
首先看cuda版本的,一定要装匹配版本的gpu:借鉴了此篇
cat /usr/local/cuda/version.txt
注意,对于服务器上有多个cuda版本要选你要的cuda的所在路径。比如,服务器上有cuda10.0、cuda9.0、cuda8.0,若选了10.0那上面的代码就是:
cat /usr/local/cuda-10.0/version.txt
出来结果如下:
然后再看看CUDNN 版本:(以10举例)
cat /usr/local/cuda-10.0/include/cudnn.h | grep CUDNN_MAJOR -A 2
结果:
因为自己下的不是gpu版本的tensorflow,最终改了好几次选了tensorflow的1.9.0版本的。主要是因为服务器上有cuda8、9、10,然后10的貌似不知道为啥用不了报错出现:
UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
然后就借鉴了这篇文章,试过了同样的方法弄10,但是试了几个版本都不行,所以选的9。(虽然上例是10的,9的类似即可)
光安个匹配的gpu版本并不行,会报错如下(这是10的,因为先前安装的是10):
查了半天都没结果,因为下载的tensorflow_gpu是直接在清华镜像下的,不是那种自己编译的,不知道到底哪里有问题。看是文件缺失,但是确实服务器上有,后来怀疑是环境变量没有加载对应的cuda路径,于是输入:(借鉴了此篇)
vim ~/.bashrc
稍稍解释一下,查了一下.bashrc,这个是用户的环境配置文件,由于前面有.所以在home下并不可见,然后用vim打开此文件,添加代码如下:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda
注意,这里和前面多版本一样,如果是多个cuda那个路径,那么在所有出现…local/cuda/…就改成自己选的cuda的路径,比如我选的9那就是:…local/cuda-9.0/…。
不要以为这样添加进去就万事大吉,千万记得要激活,不然它还是会显示上面的错误找不到那些动态库(参见),即输入:
source ~/.bashrc
此时,进入python,输入:(参见)
import tensorflow as tf
tf.test.gpu_device_name()
然后就不会报上述的错误:
出现successful …说明就没啥问题了。用个简单的例子可以测一下,懒得动可以用这个。输出信息里面device显示的是gpu就成功了。但是如果跑大型代码用了卷积的话,会出现版本兼容问题,这个看前面说的UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.那一段的链接,改个版本就好了。
如果要指定某台gpu跑,可以借鉴:这篇文章
在跑的时候还出了个问题,报错给我:
ResourceExhaustedError (see above for traceback): OOM when allocating tensor
解决方法可以参见这篇文章,一个可能是因为没有限制gpu的资源(或者选的太大,分配不了),另一个可能就是比如你后面有消耗资源的进程,关了就好。
不得不说gpu很香,batchsize=8的2小时训练了快100轮(5000+张图片),如果还是速度慢的话得查一下,很可能用的不是gpu。