在ubuntu上用keras(theano backend, gpu)

时间:2022-01-02 07:16:55

现在要做的东西需要用keras with theano backend在gpu上训练,坑非常多,因为貌似theano都停止更新了,但是follow的project是用theano backend写的,转到tensorflow上难度会很大 (不排除之后转去tensorflow backend的可能性)

首先,如果需要查看服务器上当前账号使用的cuda和 cudnn版本,用以下命令:
cuda: nvcc --version
cudnn: cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

坑1:
修改keras backend
这个很容易,只要在~/.keras/kears.json里修改
"image_dim_ordering": "th"
"backend": "theano"
就可以了,修改完成之后打开python输入import keras就会出现Using Theano backend, 表示keras已经imported并且用上了Theano backend。

坑2:
就在认为keras都已经成功import了之后,还能出啥幺儿子呢?
这时候就来了个AttributeError:’module’object has no attribute ‘ifelse’
这个问题分析很顶:根据错误信息提示,错误是在theano_backend.py这个文件中发生,可见应该是keras的backend(后端) theano出现了问题,进一步查找发现是kera的版本和theano版本不匹配所致,即所使用的theano版本太新,而keras尚不支持该版本中theano的ifelse接口。可以这样解决:https://blog.csdn.net/xiaoyufei117122/article/details/78261231

坑3:
ModuleNotFoundError: No module named 'h5py'
HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件, python中处理这个文件的包是h5py,这个和keras没关系,嘻嘻。

坑4:
现在就要想着怎么用gpu跑keras了。tensorflow-gpu版本可以自动用gpu跑 ,theano要在~/.theanorc连设置一下,具体怎么设置看:
https://www.jianshu.com/p/12af936e20ef
https://www.jianshu.com/p/b67fd7140356
设置完成之后打开python输入import keras,然后就出现
Using Theano backend.
Using cuDNN version 5005 on context None
Mapped name None to device cuda: Tesla K40c (0000:03:00.0)
表示已经成功调用theano backend而且成功输出使用的gpu名称

坑5:
这个是巨坑,打出来的error看都看不懂,猜测应该是cudnn版本不匹配的问题。
网上看类似的error的解决方法是用cuda8.0+cudnn5.1的组合,之前服务器是cuda7.5.18 +cudnn5.0.5
https://blog.csdn.net/jyl1999xxxx/article/details/85525911
在网上找了几个教程,这两篇老哥最欧丽给了:

  1. https://www.cnblogs.com/deeplearning1314/p/8444352.html (和我的需求环境一模一样!)
  2. https://blog.csdn.net/wanzhen4330/article/details/81699769
  3. https://www.cnblogs.com/sddai/p/10278005.html。 (具体教了在实验室机器上一个CUDA,多个cuDNN,如何不冲突)
    按照他们的方法下载了cuda8.0的runfile后,发现自己tmd没权限,回家!

坑6:
找了实验室负责维护服务器的大叔,因为规章制度要求不能给我sudo权限(可以理解!我自己都怕我乱搞弄垮整个server)。所以只能麻烦人家给我装cuda8.0+cudnn5.1了。装完了之后发现显卡的driver不够新,所以还是用不了gpu的theano。最后又把显卡驱动删掉重新更新了。然后就可以正常运行了!gpu上训练的速度是cpu的大概10倍。
小插曲 :刚刚装好的时候,第一次run还是出现了之前的错误,正在绝望的时候突然想到,虽然新的cuda和cudnn已经装好了,但是theano用哪个cuda和cudnn是要在~/.theanorc文件里自己修改的!参考以下链接:
https://www.cnblogs.com/zangyu/p/5661953.html

现在开始训练!一共10个epoch,每个大概80分钟的样子,大概明天早上来就能看到结果。