tensorflow学习(一)安装配置

tensorflow是google开源的深度学习平台,由于其性能比较差,一开始我是拒绝的,不过由于google强大的影响力和执行力,版本迭代更新很快,现在性能已经很快了,而且最新的版本也支持了分布式。而且tensorflow的中文文档也是所有开源框架里最完善的,所以近期抽空学习一下。还是先从安装搞起。
虽然其有比较完善的官方文档https://www.tensorflow.org/以及其中文版本http://wiki.jikexueyuan.com/project/tensorflow-zh/,但使用的时候还是发现存在一些坑,还是记录一下学习过程中遇到的问题。
tensorflow支持pip、virtualenv、Docker三种安装方式。我这里只尝试了最简单方便的pip安装。

安装环境

我的电脑是centOS 7.0,k40双卡

CUDA和cudnn

参考之前教程,安装CUDA和cudnn。我这里的CUDA版本是7.0,cudnn版本是v3。
再安装six和protobuf到对应版本,tensorflow要求’six >= 1.10.0, protobuf >= 3.0.0b2’,网上下载对应的whl包,执行

pip install six-1.10.0-py2.py3-none-any.whl
pip install protobuf

pip安装tensorflow

根据官方教程,应该执行如下命令

# 仅使用 CPU 的版本
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# 开启 GPU 支持的版本 (安装该版本的前提是已经安装了 CUDA sdk)
pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

但是由于GFW原因,上述命令可能会超时失败,于是寻找其他whl包的位置。
在官方的github上很容易找到其对应的安装版本。https://github.com/tensorflow/tensorflow,我这里使用的版本是python2的GPU版本。

# 开启 GPU 支持的版本 (安装该版本的前提是已经安装了 CUDA sdk)
pip install http://ci.tensorflow.org/view/Nightly/job/nigntly-matrix-linux-gpu/TF_BUILD_CONTAINER_TYPE=GPU,TF_BUILD_IS_OPT=OPT,TF_BUILD_IS_PIP=PIP,TF_BUILD_PYTHON_VERSION=PYTHON2,label=gpu-slave/lastSuccessfulBuild/artifact/pip_test/whl/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

安装成功。
但是在import tensorflow的时候会报错说ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory,可恶,我明明装的是CUDA7.0,竟然报错找不到7.5,解决这个问题也很简单,只需要把7.0做个软链接弄个名7.5骗过tensorflow就行,代码如下:

sudo ln -s /usr/local/cuda/lib64/libcudart.so.7.0 /usr/local/cuda/lib64/libcudart.so.7.5
sudo ln -s /usr/local/cuda/lib64/libcublas.so.7.0 /usr/local/cuda/lib64/libcublas.so.7.5

运行tensorflow

在python终端执行如下代码:

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print sess.run(hello)
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)

顺利运行表明tensorflow安装完成。

源码路径以及示例

由于我的python是anaconda版本,所以tensorflow会安装在’$HOME/anaconda/lib/python2.7/site-packages/tensorflow’。
运行第一个示例,如下:

cd $HOME/anaconda/lib/python2.7/site-packages/tensorflow
python ./models/image/mnist/convolutional.py

程序会下载mnist数据集,迭代训练,显示当前loss、学习率以及误差。

GLIBC的版本问题解决方案

在CentOS/RHEL 6的操作系统中,GLIBC的版本可能不满足tensorflow的要求,在import tensorflow的时候会报错

ImportError: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by /home/15072585/anaconda/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so)

通过命令查看/lib64/libc.so.6的GLIBC版本:

strings /lib64/libc.so.6 |grep GLIBC

可以看到其只支持到2.12,不能支持高版本。解决方案:

mkdir ~/my_libc_env
cd ~/my_libc_env
wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb
wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb
wget ftp://rpmfind.net/linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/RPMS.lib/libstdc++-4.8.2-7mgc30.x86_64.rpm
ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
rpm2cpio libstdc++-4.8.2-7mgc30.x86_64.rpm| cpio -idmv

以后想执行支持tensorflow的python版本的时候需要执行命令:

LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`

GLIBC版本升级注意事项

注意GLIBC这是一个根本的库,不能轻易升级。非要升级的话,首先查看当前的libc的指向

ll /lib64/libc.so.6

获取高级版本的libc.so,比如/lib64/libc-2.15.so,这个步骤非常繁琐,编译生成很麻烦。我是通过从另外高级版本的机器copy过来使用的,所以没有生成,过程隐去。
接下来就是将软链接指向新的libc,实际操作注意rm原来的链接之后,系统的大部分命令都无法使用了,要用LD_PRELOAD=/lib64/libc-2.15.so指定所使用的libc才能运行shell命令。代码如下:

rm -rf /lib64/libc.so.6
LD_PRELOAD=/lib64/libc-2.15.so ln -s/lib64/libc-2.15.so  lib64/libc.so.6

基于源码安装(不建议)

安装jdk

bazel依赖于jdk,网上都是安装JDK 8,由于centos默认是JDK 7,并且我们项目用的java版本也是1.7,所以去bazel官网看了一下,也是支持JDK 7的。所以这里没安装java

安装bazel

git clone https://github.com/bazelbuild/bazel.git
cd bazel
./compile.sh
sudo
cp output/bazel /usr/local/bin/

编译tensorflow

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
./configure
# choose with Google Cloud Platform / with GPU
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
pip install /tmp/tensorflow_pkg/tensorflow-0.10.0-py2-none-any.whl