日前,我司开始使用腾讯云的GPU服务器,那自然需要在其上配置TF的开发环境。之前写过在CentOS6上进行源码编译安装TF(传送门),所以这篇也是在以前的基础上修改而来,不过因为系统版本换为CentOS7,许多步骤都可以省略了,方便不少。不过仍有部分操作或问题与之前不一致,在此也会对其说明

最终配置的环境为CUDA-8.0 + cuDNN-6.0 + TensorFlow-1.3.0

总览

目前总共配置过两种腾讯云GPU服务器,以下内容主要为第一种的安装过程。第二种在此基础上,降低了系统内核版本以便安装显卡驱动

第一种:CentOS Linux release 7.4.1708 (Core)

第二种:CentOS Linux release 7.5.1804 (Core)

目前内核版本均为:3.10.0-693.21.1.el7.x86_64(第二种默认为3.10.0-862.el7.x86_64,已降级)

目前的降级是建立在使用CUDA-8.0的基础上,如果是使用更高版本的CUDA和TF,或许不需要降级。具体可参考是否出现本文安装Nvidia驱动部分的第一个错误

配置过程主要分为以下几个部分:

  • Python相关
  • 安装NVIDIA Driver、CUDA、cuDNN
  • 安装TensorFlow

因为本次能够通过pip来安装TensorFlow,并且gcc版本符合安装要求,所以省略了之前安装Java8、Bazel,升级gcc的步骤

但安装过程中仍有部分操作或者问题与之前的不一致,不同之处主要在于:

  • 编译安装Python时需指定UCS编码方式
  • pip需要使用9.0.1版本
  • 使用yum需要额外修改/usr/libexec/urlgrabber-ext-down文件
  • 下载显卡驱动时需下载.run格式文件

之后对安装过程进行简述,所有环境变量添加在/etc/profile.d/path.sh文件中(没有可创建)

安装过程

1、Python更新

通过 python -V 可以看到服务器上python的版本为2.7.5,已经符合TensorFlow安装要求。如果没有特殊需求,不建议再安装更(四声)新的2.7版本,例如2.7.14,因为父版本相同的情况下差别很小,只是一些Bug修复和性能改进,而安装2.7.14所要付出的代价(繁琐程度)是蛮大的,因为父版本相同会产生一些问题。但是如果需要安装Python3的话,那完全没问题

以下为安装Python2.7.14的过程。Python3类似

准备工作

安装一些系统依赖

1
2
3
4
yum groupinstall -y 'development tools'
yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget
yum install readline* rlwrap
yum install sqlite-devel tk-devel

下载Python2.7源码
https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz

解压

1
2
xz -d Python-2.7.14.tar.xz
tar -xvf Python-2.7.14.tar

进入目录cd Python-2.7.14,接下来的操作都在这个目录下进行

配置编译安装

配置

1
./configure --prefix=/usr/local --enable-unicode=ucs4

关于–enable-unicode=ucs4参数后续会说明其作用

编译,用时几分钟。然后安装

1
make && make install

使新版本生效

两种方式:将路径加入PATH环境变量、软连接

  • 加入PATH

将以下代码加入/etc/profile.d/path.sh文件中

1
export PATH=/usr/local/bin:$PATH
  • 软连接
1
2
mv /usr/bin/python /usr/bin/python2.7.5
ln -s /usr/local/bin/python2.7 /usr/bin/python

此时通过 python -V 可以查看Python版本已经为2.7.14。如果还想使用Python2.7.5,那么执行python2.7.5即可

解决yum失效问题

因为yum依赖的是原来的Python版本,所以做以下修改

将/usr/bin/yum以及/usr/libexec/urlgrabber-ext-down的第一行均改为

#!/usr/bin/python2.7.5

修改前者是为了升级Python后能够运行yum,修改后者的原因是使用yum安装软件会报以下错误

ImportError:No module nameed urlgrabber.grabber

修改后错误消失

更新pip

该地址下载get-pip.py文件

然后执行

1
python get-pip.py

该文件会安装pip以及setuptools等工具

一些错误

  • pkg_resources.DistributionNotFound: The ‘pip==9.0.1’ distribution was not found and is required by the application

如果遇到该错误,那么就安装指定的pip版本,下载地址为:https://github.com/pypa/pip/releases ,下载指定的版本。这里下载的是pip-9.0.1版本,然后安装问题解决

1
2
3
unzip 9.0.1.zip
cd pip-9.0.1
python setup.py install

2、NVIDIA Driver

准备工作

安装一些系统依赖

1
yum install kernel-devel-xxx

xxx是内核版本号,可以通过 uname -r 查看

下载驱动程序

http://www.nvidia.cn/Download/index.aspx 这里寻找对应的显卡驱动即可,这里选择:

  • Product Type: Tesla
  • Product Series: M-Series
  • Product: M40
  • Operating System: Linux 64-bit
  • CUDA Toolkit: 8.0
  • Language: English(US)

这里下载的文件名是:NVIDIA-Linux-x86_64-384.66.run

安装

添加可执行权限,安装

1
2
chmod +x NVIDIA-Linux-x86_64-384.66.run
./NVIDIA-Linux-x86_64-384.66.run

进入安装界面后一路同意就可以,是否安装32位的库,我选择的同意。对于最后出现的warning我选择了忽略

安装完成后执行nvidia-smi后能看到一些显卡信息,若运行错误可重启服务器reboot

一些错误

  • NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

如果安装完驱动后执行nvidia-smi后可能会出现该错误,重启后消失

如果在下载驱动的时候操作系统选择Linux 64-bit RHEL7,则会下载.rpm格式的安装包,安装后重启仍会出现该错误检测不到显卡驱动。所以操作系统需要选择Linux 64-bit 以下载.run格式安装包

  • ERROR: An error occurred while performing the step: “Building kernel modules”. See /var/log/nvidia-installer.log for details.

这个错误出现的原因之一是系统内核版本过高(或者过低)与驱动程序不匹配。问题发生在给第二种服务器安装时出现的,其系统版本升级为CentOS 7.5,默认内核版本为3.10.0-862.el7.x86_64(对比第一种为3.10.0-693.21.1.el7.x86_64),遂考虑切换内核版本

使用cat /boot/grub2/grub.cfg | grep menuentry查看目前有哪些内核版本,使用grub2-set-default命令切换,使用grub2-editenv list验证是否配置成功。在这里需要设置的内核版本为:

1
grub2-set-default "CentOS Linux (3.10.0-693.21.1.el7.x86_64) 7 (Core)"

如果切换完成后仍报该错误可以重启服务器

  • WARNING: nvidia-installer was forced to guess the X library path ‘/usr/lib64’ and X module path ‘/usr/lib64/xorg/modules’; these paths were not queryable from the system. If X fails to find the NVIDIA X driver module, please install the pkg-config utility and the X.Org SDK/development package for your distribution and reinstall the driver.

这是安装完后出现的warning,目前没发现有什么问题

3、CUDA-8.0 & cuDNN-6.0

CUDA下载

https://developer.nvidia.com/cuda-downloads 这里寻找对应平台的文件下载即可。这里有一份详尽官方的 说明文档

这里一些选项的选择为:

  • Operating System: Linux
  • Architecture: x86_64
  • Distribution: CentOS
  • Version: 7
  • Installer Type: runfile(local)

下面会显示两个安装文件,一个 Base Installer ,一个Patch。安装完Base后再安装Patch即可

CUDA安装

添加可执行权限,安装

1
2
chmod +x cuda_8.0.61_375.26_linux.run
./cuda_8.0.61_375.26_linux.run

接下来会有一系列提示需要确认,其中在询问是否要安装显卡驱动时选 n ,因为我们之前已经安装了最新版本的驱动。其他的一路同意即可

最后再打一下补丁即可

1
2
chmod +x cuda_8.0.61.2_linux.run
./cuda_8.0.61.2_linux.run

CUDA测试

进入samples目录,选择第一个例子进行测试

1
2
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make

编译完成后执行

1
./deviceQuery

会看到一系列显卡参数信息,只要最后显示 Result = PASS 即说明CUDA安装成功

添加环境变量

编辑 /etc/profile.d/path.sh 文件,添加以下内容:

1
2
3
4
# cuda-8.0
export CUDA_HOME=/usr/local/cuda
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

cuDNN下载

https://developer.nvidia.com/rdp/cudnn-download 选择对应的版本下载即可。不过需要先注册开发者账号后才可以下载

之前安装的CUDA是8.0,所以我们选择

  • Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0
  • cuDNN v6.0 Library for Linux

cuDNN安装

执行解压操作

1
tar -zxvf cudnn-8.0-linux-x64-v6.0.tgz

解压后的文件夹是cuda。执行以下操作把文件复制到相应的位置

1
2
3
4
cp cuda/include/cudnn.h /usr/local/cuda/include/
cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
chmod a+r /usr/local/cuda/include/cudnn.h
chmod a+r /usr/local/cuda/lib64/libcudnn*

一些错误

  • g++: No such file or directory

CUDA编译上述例子时报以上错误,这是因为没有安装g++,使用命令 yum install gcc-c++ 来安装g++即可解决

4、TensorFlow-1.3.0

准备工作

安装一些系统依赖

1
yum install python-devel

pip安装TensorFlow

有两种方法

a)通过pip安装指定版本(1.3.0),注意要安装GPU版本

pip install tensorflow-gpu==1.3.0

b)若提示找不到对应版本(第一天安装是这样,第二天测试了下第一种方法又好使了),可执行以下命令

pip install –upgrade tfBinaryURL

其中,tfBinaryURL替换为 https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp27-none-linux_x86_64.whl

如果不指定版本的话那默认安装的是最新版本的,而最新版本的TensorFlow已经不支持CUDA8.0了,可以去 https://www.tensorflow.org/install/install_sources 查看TF与CUDA版本的对应关系,在最下面。如果该链接打不开(被墙),可以访问 https://tensorflow.google.cn/install/install_sources 。这是TF给中国大陆单独开的域名

安装其他版本CUDA与上述步骤类似

验证

进入python,进行 import tensorflow,没有错误那就代表安装成功

一些错误

  • ImportError: /usr/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so: undefined symbol: PyUnicodeUCS4_AsUTF8String

出现这个错误的原因是Python和某个你用的库编译时指定的UCS编码方式不对。编译Python时,可以通过指定–enable-unicode=ucs2或者ucs4来选择使用UCS2或者UCS4

如果你的错误是undefined symbol: PyUnicodeUCS2_AsUTF8String,说明你的Python编译时使用的是UCS4,反之亦然

解决方案就是重新编译Python或者重新编译库,但这里我们使用的是pip安装库(不想编译TensorFlow),所以选择重新编译Python

因为报错是PyUnicodeUCS4_AsUTF8String,说明TensorFlow是用UCS4编译的,而Python是UCS2编译的,所以重新编译Python时设置unicode为ucs4

1
./configure --prefix=/usr/local --enable-unicode=ucs4
  • ImportError: Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy. If you’re working with a numpy git repo, try git clean -xdf (removes all files not under version control). Otherwise reinstall numpy.

这是由于之前的旧版本Python安装的numpy与新编译的Python不兼容的缘故,卸载numpy重新安装即可

1
2
pip uninstall numpy
pip install numpy
  • Cannot uninstall ‘Markdown’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

如果先把pip从9升级到10后再安装TensorFlow会出现该问题。该问题的具体解释可见链接。解决的方法为手动删除该包相关文件,在这里主要删除了一个文件夹以及一个info文件

1
2
rm -rf /usr/lib/python2.7/site-packages/markdown
rm Markdown-2.4.1-py2.7.egg-info

Reference

官方安装指南

腾讯云官方文档

参考的Blog