首先,CentOS安装Tensorflow-gpu的过程漫长繁琐,遍地是坑,奉劝各位遵从Tensorflow官方建议,直接上Ubuntu。如果对Ubuntu做开发环境不适应,或者想体验一下解决困难后的喜悦,请往下阅读。
首先,几个脉络,每个脉络都有分支,必须每个分支都走对,最后才能走出迷宫:
Nvidia显卡驱动
CUDA/cuDNN
Tensorflow
Nvidia显卡驱动
安装驱动基本都是一个套路,即通过下载nVidia官方的安装文件进行。
基本思路是到https://www.nvidia.com/object/unix.html根据系统版本下载最新的驱动包
所以,390.87是不能满足cuda9.2的运行要求的,那如何解决呢?上面网页中给出了方法:
参考 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#package-manager-metas
如上表所示,CUDA的安装包中已包含所依赖的驱动,直接安装CUDA即可解决驱动问题。
如果不小心通过NVIDIA-Linux-x86_64-390.87.run安装了驱动,不必害怕,这个脚本提供了后悔功能,执行时加入 –uninstall即可卸载。
CUDA/cuDNN
应该说正确的安装流程应该从此处开始,CentOS7的安装只需要看第2、3、7章中关于Redhat/CentOS相关的内容即可。
摘要说明:
安装kernel-devel包;
Shell
$sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
1
$sudoyuminstallkernel-devel-$(uname-r)kernel-headers-$(uname-r)
安装repo及cuda
Shell
$sudo rpm -i cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64.rpm
$sudo yum clean all
$sudo yum install cuda
1
2
3
$sudorpm-icuda-repo-rhel7-9-2-local-9.2.148-1.x86_64.rpm
$sudoyumcleanall
$sudoyuminstallcuda
禁用Nouveau
跟新环境变量
好了,这时候应该已经完成驱动和cuda的安装,重启一下系统,确认一下
cuDNN的安装比较简单,只要版本和cuda对上即可,需要注册个账号才能下载。
Tensorflow-gpu
Shell
$ pip install tensorflow-gpu # Python 2.7; GPU support
1
$pipinstalltensorflow-gpu# Python 2.7; GPU support
但是实际情况可能是这样
原因是Python默认的编译选项中unicode支持类型是UCS2,而Tensorflow只有UCS4[1]的版本,所以建议重新编译Python以修改以上选项,同时可以顺道升级CentOS7的Python的版本到2.7.15。unicode的修改是在congfigure时增加–enable-unicode=ucs4选项。
以下给出一个编译脚本,可无损升级CentOS的Python版本:
Python Complier
Shell
#!/bin/bash
TAR=`which tar`
MAKE=`which make`
SED=`which sed`
RPM=`which rpm`
LN=`which ln`
BASEDIR=$(dirname $(readlink -f $0))
USR_LOCAL="/usr/local"
WORK_DIR="/opt/public_sentiment"
PIP_PKG_DIR=$BASEDIR"/pkgs"
function error_exit {
echo "$1" 1>&2
exit 1
}
PY_VER="2.7.15"
echo "Update python "$PY_VER"..."
$TAR xf $BASEDIR"/Python-"$PY_VER".tar.xz" -C $BASEDIR || error_exit "$LINENO: Unzip python tarball failed."
cd $BASEDIR"/Python-"$PY_VER
./configure --enable-optimizations --disable-ipv6 --enable-unicode=ucs4 --with-ensurepip=install --prefix=$USR_LOCAL || error_exit "$LINENO: Python source configure failed."
$MAKE altinstall || error_exit "$LINENO: Python install failed."
cd -
# replace system python
if [ -f "/usr/bin/python" ]; then
mv "/usr/bin/python" "/usr/bin/python2.7.5" || error_exit "$LINENO: Rename existing python bin failed."
fi
if [ -f "/usr/bin/pip" ]; then
mv "/usr/bin/pip" "/usr/bin/pip2.7.5" || error_exit "$LINENO: Rename existing pip bin failed."
fi
$LN -s "/usr/local/bin/python2.7" "/usr/bin/python" || error_exit "$LINENO: Link new version python bin failed."
$LN -s "/usr/local/bin/pip2.7" "/usr/bin/pip" || error_exit "$LINENO: Link new version pip bin failed."
# restore yum
$SED -i 's/python[0-9\.]*$/python2\.7\.5/g' "/usr/bin/yum" || error_exit "$LINENO: Modify yum script failed."
$SED -i 's/python[0-9\.]*$/python2\.7\.5/g' "/usr/libexec/urlgrabber-ext-down" || error_exit "$LINENO: Modify urlgrabber-ext-down script failed."
# print info
PY=`which python`
echo "---------------------------------------------"
$PY --version
echo "---------------------------------------------"
#install pip
PIP=`which pip`
echo "Update pip/setuptools/wheel to latest version..."
$PIP install --upgrade pip wheel setuptools
echo "---------------------------------------------"
$PIP --version
echo "---------------------------------------------"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash
TAR=`whichtar`
MAKE=`whichmake`
SED=`whichsed`
RPM=`whichrpm`
LN=`whichln`
BASEDIR=$(dirname$(readlink-f$0))
USR_LOCAL="/usr/local"
WORK_DIR="/opt/public_sentiment"
PIP_PKG_DIR=$BASEDIR"/pkgs"
functionerror_exit{
echo"$1"1>&2
exit1
}
PY_VER="2.7.15"
echo"Update python "$PY_VER"..."
$TARxf$BASEDIR"/Python-"$PY_VER".tar.xz"-C$BASEDIR||error_exit"$LINENO: Unzip python tarball failed."
cd$BASEDIR"/Python-"$PY_VER
./configure--enable-optimizations--disable-ipv6--enable-unicode=ucs4--with-ensurepip=install--prefix=$USR_LOCAL||error_exit"$LINENO: Python source configure failed."
$MAKEaltinstall||error_exit"$LINENO: Python install failed."
cd-
# replace system python
if[-f"/usr/bin/python"];then
mv"/usr/bin/python""/usr/bin/python2.7.5"||error_exit"$LINENO: Rename existing python bin failed."
fi
if[-f"/usr/bin/pip"];then
mv"/usr/bin/pip""/usr/bin/pip2.7.5"||error_exit"$LINENO: Rename existing pip bin failed."
fi
$LN-s"/usr/local/bin/python2.7""/usr/bin/python"||error_exit"$LINENO: Link new version python bin failed."
$LN-s"/usr/local/bin/pip2.7""/usr/bin/pip"||error_exit"$LINENO: Link new version pip bin failed."
# restore yum
$SED-i's/python[0-9\.]*$/python2\.7\.5/g'"/usr/bin/yum"||error_exit"$LINENO: Modify yum script failed."
$SED-i's/python[0-9\.]*$/python2\.7\.5/g'"/usr/libexec/urlgrabber-ext-down"||error_exit"$LINENO: Modify urlgrabber-ext-down script failed."
# print info
PY=`whichpython`
echo"---------------------------------------------"
$PY--version
echo"---------------------------------------------"
#install pip
PIP=`whichpip`
echo"Update pip/setuptools/wheel to latest version..."
$PIPinstall--upgradepipwheelsetuptools
echo"---------------------------------------------"
$PIP--version
echo"---------------------------------------------"
1
上面这个脚本会顺道把pip也一并编译安装上,这时候就能通过pip安装Tensorflow了。
Shell
$ pip install tensorflow-gpu
1
$pipinstalltensorflow-gpu
一杯咖啡后,完成安装。
执行一下测试脚本:
Python
# Python
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
1
2
3
4
5
# Python
importtensorflowastf
hello=tf.constant('Hello, TensorFlow!')
sess=tf.Session()
print(sess.run(hello))
结果让人失望,pip安装的最新版tensorflow-gpu依赖的cuda是9.0的版本。
根据堆栈溢出网专家的指点,需要从源码进行编译tensorflow-gpu才能解决以上问题,又是一个漫长编译过程。
同样,Tensorflow的源码通过git clone 速度也不是一般的慢,还是去github上下载zip包比较快。提供一个编译脚本供参考,configure时的选项除了cuda基本都可以填n。
Shell
#!/usr/bin/env bash
# Detect platform
if [ "$(uname)" == "Darwin" ]; then
# MacOS
raw_cpu_flags=`sysctl -a | grep machdep.cpu.features | cut -d ":" -f 2 | tr '[:upper:]' '[:lower:]'`
elif [ "$(uname)" == "Linux" ]; then
# GNU/Linux
raw_cpu_flags=`grep flags -m1 /proc/cpuinfo | cut -d ":" -f 2 | tr '[:upper:]' '[:lower:]'`
else
echo "Unknown plaform: $(uname)"
exit -1
fi
COPT="--copt=-march=native"
for cpu_feature in $raw_cpu_flags
do
case "$cpu_feature" in
"sse4.1" | "sse4.2" | "ssse3" | "fma" | "cx16" | "popcnt" | "maes")
COPT+=" --copt=-m$cpu_feature"
;;
"avx1.0")
COPT+=" --copt=-mavx"
;;
*)
# noop
;;
esac
done
bazel clean
./configure
bazel build -c opt $COPT -k //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env bash
# Detect platform
if["$(uname)"=="Darwin"];then
# MacOS
raw_cpu_flags=`sysctl-a|grepmachdep.cpu.features|cut-d":"-f2|tr'[:upper:]''[:lower:]'`
elif["$(uname)"=="Linux"];then
# GNU/Linux
raw_cpu_flags=`grepflags-m1/proc/cpuinfo|cut-d":"-f2|tr'[:upper:]''[:lower:]'`
else
echo"Unknown plaform: $(uname)"
exit-1
fi
COPT="--copt=-march=native"
forcpu_featurein$raw_cpu_flags
do
case"$cpu_feature"in
"sse4.1"|"sse4.2"|"ssse3"|"fma"|"cx16"|"popcnt"|"maes")
COPT+=" --copt=-m$cpu_feature"
;;
"avx1.0")
COPT+=" --copt=-mavx"
;;
*)
# noop
;;
esac
done
bazelclean
./configure
bazelbuild-copt$COPT-k//tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package/tmp/tensorflow_pkg
编译前确认系统有patch命令。
编译完后生成的whl位于/tmp/tensorflow_pkg/tensorflow-1.10.0-cp27-cp27mu-linux_x86_64.whl,直接可以用pip install进行安装。
下面应该没有问题了,还是之前的Hello脚本, 成功执行。
以上,感谢阅读。
需要支持cuda9.2的tensorflow-1.10.0-cp27-cp27mu-linux_x86_64.whl的同学,可以留下联系方式。
参考文献
最后编辑:2018-09-18作者:yong
这个作者貌似有点懒,什么都没有留下。