前言

实验室又腾出来了一台服务器,但是用的TITAN X显卡,所以需要重新安装一遍环境,搞了一天才弄好,这篇博文要记录一下安装过程供之后使用。(很多坑踩了一次又一次)

详细步骤

0. 环境参数

首先我要说一下我的环境参数:

项目 参数
ESXi 6.7
Ubuntu 16.04
显卡 NVIDIA GeForce GTX TITAN X
显卡驱动 390.77
Anaconda3 5.2.0
caffe 1.0
gcc 5.4.0

1. 显卡驱动

我这里直接使用ESXi把显卡直通给虚拟机使用,所以下载对应版本的显卡驱动就行了。查看显卡型号输入lspci|grep NVIDIA就可以了,然后到NVIDIA驱动下载下载对应的驱动,操作系统选择Linux 64bit选项,得到一个.run文件。运行显卡驱动run文件,记得加上--no-opengl-files参数,理由和详细步骤看我之前的博文。如果安装成功,输入nvidia-smi命令应该会输出驱动信息,如果输出Unable to determine the device handle for GPU 0000:03:00.0: Unknown Error ,可以参考这篇博文。我就遇到了这个问题,按照这篇博文的指导,用ssh登录ESXi主机然后修改ubuntu虚拟机的.vmx文件,添加hypervisor.cpuid.v0 = FALSE一行。

2. CUDA

caffe依赖CUDA,这里我安装CUDA8.0。到CUDA Toolkit 8.0 - Feb 2017下载对应的CUDA安装程序,选择runfile格式。运行该run文件,不要选择安装显卡驱动,可以添加软链接,选择添加cuda库到环境,省事一些。然后,我们需要把CUDA编译器添加到PATH变量里,编辑~/.bashrc文件,添加export PATH="/usr/local/cuda/bin:$PATH",确定这个路径下有nvcc。执行nvcc -V查看CUDA版本号。如果你安装了CUDA示例程序,可以到~/NVIDIA_CUDA-8.0_Samples目录下make,然后执行~/NVIDIA_CUDA-8.0_Samples/1_Utilities/deviceQuery/目录下的./deviceQuery确认CUDA安装好了。

3. cuDNN

cuDNN Download下载cuDNN,需要注册NVIDIA账号。选择CUDA 8.0版本的,然后下载三个deb文件:

1
2
3
cuDNN v7.2.1 Runtime Library for Ubuntu16.04 (Deb)
cuDNN v7.2.1 Developer Library for Ubuntu16.04 (Deb)
cuDNN v7.2.1 Code Samples and User Guide for Ubuntu16.04 (Deb)

按照上面的顺序依次安装三个deb包,例如:

1
2
3
sudo dpkg -i install libcudnn.deb
sudo dpkg -i install libcudnn-dev.deb
sudo dpkg -i install libcudnn-doc.deb

如果想要验证是否安装成功,可以运行一下cuDNN的sample,代码在/usr/src/cudnn_samples_v7,例如:

1
2
3
4
cp /usr/src/cudnn_samples_v7 ~
cd ~/cudnn_samples_v7/mnistCUDNN
make
./mnistCUDNN

4. caffe依赖库

1
2
3
sudo apt install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt install --no-install-recommends libboost-all-dev
sudo apt install libatlas-base-dev libopenblas-dev

5. 下载caffe

github下载caffe,

1
2
3
//你可能需要翻墙
git clone https://github.com/BVLC/caffe.git

6. Anaconda3

官网下载python3版本的Anaconda,直接安装到home目录下就可以了,不需要root权限。下载pyCaffe的依赖库,依赖在(caffe目录)/python/requirements.txt里,有:

1
2
cython numpy scipy scikit-image matplotlib ipython h5py leveldb networkx nose pandas python-dateutil python-gflags pyyaml pillow six
//protobuf,先不安装这个

这里我用conda创建一个caffe专用的虚拟python环境,名字就叫caffe,这样方便以后配置别的python应用,具体操作如下:

1
2
3
4
5
6
7
8
9
//创建一个名叫caffe的python环境,python版本为3.6.5
conda create -n caffe python=3.6.5

//激活caffe环境
source activate caffe

//(caffe)字样表明在caffe环境下
//安装pyCaffe依赖库,这里不安装protobuf,因为会和之前安装的protobuf-compiler冲突
conda install cython numpy scipy scikit-image matplotlib ipython h5py leveldb networkx nose pandas python-dateutil python-gflags pyyaml pillow six

把pyCaffe依赖库添加到/etc/ld.so.conf中, ld.so.conf的内容如下:

1
2
3
include /etc/ld.so.conf.d/*.conf
/usr/local/cuda/lib64
/home/(***)/anaconda3/envs/caffe/lib

第二行是cuda库的位置,第三行是之前创建的名叫caffe的环境的库的位置,执行sudo ldconfig更新库内容。
修改~/.bashrc文件,添加pyCaffe的路径,此时的~/.bashrc文件应该有以下修改:

1
2
3
4
5
6
7
8
# CUDA库
export PATH="/usr/local/cuda/bin:$PATH"

# Anaconda3位置
export PATH="/home/(***)/anaconda3/bin:$PATH"

# pyCaffe位置
export PYTHONPATH="/home/(***)/caffe/python:$PYTHONPATH"

7. 配置Make文件

确保一下protobuf的版本,protoc --version,这时应该是2.×版本的。

1
2
3
4
5
6
cd caffe

//复制一份makefile文件
cp Makefile.config.example Makefile.config

vim Makefile.config

需要修改的内容有:

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
//使用CUDNN
USE_CUDNN :=1

//使用anaconda的python库而不用系统的python库,所以注释掉PYTHON_INCLUDE这行
#PYTHON_INCLUDE = /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include

//取消Anaconda的注释,并且修改内容,要确保目录里有Python.h和numpy/arrayobject.h
//这里的 ANACONDA_HOME 也可能是 $(HOME)/.conda/envs/caffe 确认envs里有之前创建的环境就行
ANACONDA_HOME := $(HOME)/anaconda3/envs/caffe
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python3.6m \
$(ANACONDA_HOME)/lib/python3.6/site-packages/numpy/core/include

//取消PYTHON_LIBRARIES的注释,添加boost_python库路径
//ls -l /usr/lib/x86_64-linux-gnu |grep libboost_python
//看看boost_python库叫什么名字,比如我这里叫libboost_python-py35.so
//所以需要添加一个叫libboost_python3.so的软链接
//sudo ln -s libboost_python-py35.so libboost_python3.so
PYTHON_LIBRARIES := boost_python3 python3.6m

//取消此处注释
PYTHON_LIB :=$(ANACONDA_HOME)/lib

//使用caffe的python接口,取消WITH_PYTHON_LAYER的注释
WITH_PYTHON_LAYER := 1

8. 编译caffe

1
2
3
4
5
cd caffe
make all -j32

//运行caffe测试
make runtest

9. 编译pyCaffe

1
make pycaffe

10. 安装protobuf

之前为了防止版本问题没有安装protobuf的python库,现在已经编译完了,可以安装了,

1
2
source activate caffe
conda install protobuf

这时候protobuf --version应该是3.×版本的。

11. 配置notebook

首先看看pyCaffe有没有安装好,打开终端:

1
2
3
4
source activate caffe
(caffe)python
>>> import caffe
>>>

如果显示如下表明pyCaffe已经装好了。

然后需要配置一下jupyter notebook
首先为conda的caffe环境安装notebook

1
2
3
4
5
6
7
8
9
10
11
12
13
source activate caffe

//为caffe环境安装notebook
conda install notebook

//生成jupyter的配置文件
jupyter notebook --generate-config

//修改jupyter的配置文件,把c.NotebookApp.ip的值改为自己的ip地址,允许通过ip地址访问notebook
vim ~/.jupyter/jupyter_notebook_config.py

//设置notebook的密码
jupyter notebook password

配置好后就能够通过 ipaddr:8888 的方式访问了。

参考

Caffe/Installation
Caffe/Ubuntu Installation
ESXI上的UBUNTU16.04虚拟机安装NVIDIA驱动
nvidia-smi reports Unable to determine the device handle for GPU
Jupyter Notebook之web访问密码设定
Github/BVLC/caffe/Ubuntu 16.04 Installation Guide