最近要用tensorflow解决一些问题,然后就更新了我设备上的tensorflow,结果坑来了。

我这有几台GPU的设备,其中最顺利的是GTX980ti ,直接安装上即可使用GPU加速运算。然而其他几台GPU却遇到了问题,GTX8xx 和GTX7xx系列的显卡只能用自己编译的tensorflow,通过官方的pip安装的tensorflow无法使用8系列和7系列显卡。

下面记录一些更新了tensorflow之后遇到的一些坑,希望后面可以避免这些问题。

安装tensorflow

按照官网上提供的流程,使用pip3来安装tensorflow,基本上安装很顺利,然而安装上之后,跑第一个helloworld,坑来了。

坑一:cuda版本不对

最新的tensorflow1.9安装需要 cuda9.0 而nvidia官网上提供的流程安装上的最新的cuda9.2。 然而安装上cuda之后,运行tensorflow会提示找不到libcublas.so.9.0而报错。 真不知道tensorflow开发者的脑子哪根筋缺弦,难道把依赖的版本号写死在代码里了?

解决方法是重新安装cuda9.0

sudo apt install cuda-9-0

这样把cuda9.2降级安装为9.0 ,问题解决

坑二:cudnn版本不对

同上面的问题,去nvidia上安装的最新的cudnn也不行,必须重新在cudnn网站上找到 cudnn7.0.5.15-1+cuda9.0才行。

注意安装顺序必须是,顺序乱了也会导致无法安装:

sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb

坑三:Cuda compute capability 3.0 The minimum required Cuda capability is 3.5

安装好之后总算helloworld能跑起来了,然后你以为就万事大吉了,Naive! 这时候如果你是8系列显卡或这7系列,会提示这样的警告

Ignoring visible gpu device (device: 0, name: GeForce GTX 870M, pci bus id: 0000:01:00.0, compute capability: 3.0) with Cuda compute capability 3.0.
 The minimum required Cuda capability is 3.5.

cuda支持的最低版本

从源代码编译安装tensorflow

官网文档说的很清楚,要使用CUDA 3.0的设备,必须从源代码编译安装TensorFlow,否则使用官方发布的二进制程序只能支持3.5或更高版本的设备。

A GPU card with CUDA Compute Capability 3.0 or higher for building TensorFlow from source. To use the TensorFlow binaries, version 3.5 or higher is required. See the NVIDIA documentation for a list of supported GPU cards.

下载TensorFlow源码

git clone https://github.com/tensorflow/tensorflow 
cd tensorflow
git checkout r1.9

安装python支持库

sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel

安装bazel

从Bazel的网站上下载安装https://bazel.build/versions/master/docs/install.html

安装CUDA开发环境

注意必须是 cudnn7.0.5.15-1 和 CUDA9.0 。版本不对会很蛋疼。。。

编译TensorFlow

配置编译环境:

cd tensorflow
./configure

这里注意,必须在configuration中填写正确的python地址和CUDA的库所在的路径,默认的路径可能不对,会导致编译失败,因此必须注意路径填写正确。

编译:

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

打包为PiP安装包

编译完成后,不要忘记打包。

 bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

安装自己编译的安装包

sudo pip3 install /tmp/tensorflow_pkg/tensorflow-1.9.0-cp35-cp35m-linux_x86_64.whl

再次运行Helloworld:

2018-07-24 11:44:51.462521: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1392] Found device 0 with properties: 
name: GeForce GTX 870M major: 3 minor: 0 memoryClockRate(GHz): 0.967
pciBusID: 0000:01:00.0
totalMemory: 5.93GiB freeMemory: 5.69GiB
2018-07-24 11:44:51.462537: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1471] Adding visible gpu devices: 0
2018-07-24 11:44:51.694041: I tensorflow/core/common_runtime/gpu/gpu_device.cc:952] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-24 11:44:51.694084: I tensorflow/core/common_runtime/gpu/gpu_device.cc:958]      0 
2018-07-24 11:44:51.694090: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0:   N 
2018-07-24 11:44:51.694248: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5486 MB memory) -> physical GPU (device: 0, name: GeForce GTX 870M, pci bus id: 0000:01:00.0, compute capability: 3.0)

出现这样的提示,表示可以成功使用GPU加速了。

One more thing.

最后,如果你的显卡是6系列以下的显卡,看样子是没法直接使用TensorFlow了,如果你要坚持使用的话,只能考虑换其他机器学习的库或者自己用CUDA的接口实现计算功能了。

参考文献: