腾讯云GPU服务器搭建TensorFlow开发环境
文章目录
日前,我司开始使用腾讯云的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 | yum groupinstall -y 'development tools' |
下载Python2.7源码
https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
解压
1 | xz -d Python-2.7.14.tar.xz |
进入目录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 | mv /usr/bin/python /usr/bin/python2.7.5 |
此时通过 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 | unzip 9.0.1.zip |
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 | chmod +x 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 | chmod +x cuda_8.0.61_375.26_linux.run |
接下来会有一系列提示需要确认,其中在询问是否要安装显卡驱动时选 n ,因为我们之前已经安装了最新版本的驱动。其他的一路同意即可
最后再打一下补丁即可
1 | chmod +x cuda_8.0.61.2_linux.run |
CUDA测试
进入samples目录,选择第一个例子进行测试
1 | cd /usr/local/cuda/samples/1_Utilities/deviceQuery |
编译完成后执行
1 | ./deviceQuery |
会看到一系列显卡参数信息,只要最后显示 Result = PASS 即说明CUDA安装成功
添加环境变量
编辑 /etc/profile.d/path.sh 文件,添加以下内容:
1 | # cuda-8.0 |
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 | cp cuda/include/cudnn.h /usr/local/cuda/include/ |
一些错误
- 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 | pip uninstall 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 | rm -rf /usr/lib/python2.7/site-packages/markdown |
Reference
官方安装指南
腾讯云官方文档
安装 NVIDIA 驱动指引https://cloud.tencent.com/document/product/560/8048
安装 CUDA 驱动指引https://cloud.tencent.com/document/product/560/8064
参考的Blog