08月11, 2017

配置 Nvidia GPU 服务器(TensorFlow)

为追赶 AI 的浪潮,实验室最近新上了一台 GPU 服务器,里面是一块 Nvida Tesla K40m。服务器刚到时是没有系统的,于是我找了一个下午的时间给它装上了 Ubuntu 、配置了显卡驱动和 TensorFlow。以下是具体过程。

服务器的常规配置请参照此文

安装驱动

前期准备主要是看看有没有之前装的显卡驱动,检查一下是不是真的有显卡,检查一下是否有 Ubuntu 自带的草根驱动 nouveau,后续我们会将其停用。以及检查一下是否为 x86_64 的 Linux。

sudo apt-get remove --purge nvidia*
lspci | grep -i nvidia
uname -m && cat /etc/*release
gcc --version
lsmod | grep nvidia
lsmod | grep nouveau

把 nouveau 驱动加入黑名单

sudo vim /etc/modprobe.d/blacklist-nouveau.conf

  在文件 blacklist-nouveau.conf 中加入如下内容:
  blacklist nouveau
  blacklist lbm-nouveau
  options nouveau modeset=0
  alias nouveau off
  alias lbm-nouveau off

禁用 nouveau 内核模块

echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf

sudo update-initramfs -u

重启后关闭图形化界面,检查草根驱动是否还在

reboot
sudo service lightdm stop
lsmod | grep nouveau 再次查看驱动是否存在

到官网下载驱动,此处与大多网上教程不同,采用 Nvida 官网的安装方式

dpkg -i nvidia-diag-driver-local-repo-ubuntu1604_375.66-1_amd64.deb
apt-get update
apt-get install cuda-drivers
reboot

重启后查看驱动是否安装成功

nvidia-smi

出现显卡信息即成功。

不过X界面可能就不能用了,hh

安装 CUDA

Installation Guide Linux :: CUDA Toolkit Documentation 我选择了下载在线 deb 安装的方法。

首先去CUDA Toolkit Download | NVIDIA Developer下载一个小 deb 包。然后同上面安装驱动时一样用 dpkg 导入后 apt 安装就行了。因为要连接英伟达的官网下载,建议使用代理,需要分别给 aptwget 都挂上代理。

安装完成后需要把可执行文件的路径写入 PATH 中,视情况将以下语句写入etc/profile.bashrc 等文件也可。

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

测试(建议)

安装一些测试样例,如果没有以下指令请校验 PATH 是否设置正确

cuda-install-samples-8.0.sh <dir>

校验显卡驱动

cat /proc/driver/nvidia/version

编译

cd NVIDIA_CUDA-8.0_Samples/
make(一堆 Warning)
collect2: error: ld returned 1 exit status
Makefile:381: recipe for target 'cudaDecodeGL' failed
make[1]: *** [cudaDecodeGL] Error 1
make[1]: Leaving directory '/home/itlab/cuda-sample/NVIDIA_CUDA-8.0_Samples/3_Imaging/cudaDecodeGL'
Makefile:52: recipe for target '3_Imaging/cudaDecodeGL/Makefile.ph_build' failed
make: *** [3_Imaging/cudaDecodeGL/Makefile.ph_build] Error 2

出了一些 error,但似乎影响不大

cd cd bin/x86_64/linux/release/
./deviceQuery

结果如下

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Tesla K40m"
  CUDA Driver Version / Runtime Version          9.0 / 8.0
  CUDA Capability Major/Minor version number:    3.5
  Total amount of global memory:                 11440 MBytes (11995578368 bytes)
  (15) Multiprocessors, (192) CUDA Cores/MP:     2880 CUDA Cores
  GPU Max Clock rate:                            745 MHz (0.75 GHz)
  Memory Clock rate:                             3004 Mhz
  Memory Bus Width:                              384-bit
  L2 Cache Size:                                 1572864 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Enabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 133 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = Tesla K40m
Result = PASS

最终显示 Result = PASS,想来是没什么大问题。

安装cuDNN

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

安装 TensorFlow 前需要安装 cuDNN

注册 Nvidia Developer 之后,需要依次下载三个 deb 包,分别是 runtime,developer,user guide。

然后按文档所述将测试跑一遍。

安装 TensorFlow

参考Installing TensorFlow on Ubuntu | TensorFlow

使用官方推荐的 virtualenv 来安装 TensorFlow,virtualenv 是一套 python 的虚拟环境,使用它可以将一台机器上的不同 python 程序隔离起来,看简介应该是通过设置环境变量维护自己的一套 python 实现的。

以下为 python3 的安装过程

sudo apt-get install python3-pip python3-dev python-virtualenv
virtualenv --system-site-packages -p python3 targetDirectory

通过 source 文件来启动

source ~/tensorflow/bin/activate # bash, sh, ksh, or zsh
source ~/tensorflow/bin/activate.csh  # csh or tcsh

在环境内安装 tensorflow-gpu

(tensorflow)$ pip3 install --upgrade tensorflow-gpu

退出

(tensorflow)$ deactivate

可以在环境内验证一下 GPU 是否可以被 tensorflow 调用

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

如果上面安装的 libcudnn 版本比较新的话可能会出现以下错误

ImportError: libcudnn.5: cannot open shared object file: No such file or directory

TensorFlow 官方认定用 StackOverflow 来 document,所以参照问题,我们可以作以下推断

这是因为这种方式安装的 tensorflow 不能正确识别 5.0 版本以外的 libcudnn ,把我们安装的其他版本软链一下就好了,还有可能是LD_LIBRARY_PATH的问题。

ln -s /etc/alternatives/libcudnn_so /usr/local/cuda/lib64/libcudnn.so.5
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64"

至此 GPU ready to work 。

本文链接:https://sxing.xyz/post/gpu-server.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。