深度学习配置机器:Nvidia + Ubuntu + DL框架
0 硬件(机器)
Nvidia硬件产品
参考资料
- 关于显卡(入门级)(独显为主)(NVIDIA分析)(AMD详细分析) cnblogs
- 【科普】英伟达显卡发展史及产品型号大全V2.1 百度贴吧-显卡吧
- GPU购买指南
1 操作系统
选择目前稳定的长期支持版本:Ubuntu 16.04 LTS (Xenial Xerus)
查看系统版本:
uname -a
lsb_release -a
查看硬件信息
# 查看显卡
lspci | grep -i vga
lspci | grep -i nvidia
# (VGA接口编号)
lspci -v -s 02:00.0
# 查看驱动版本
dpkg -l | grep nvidia
# 显卡设备
ls /dev/nvidia*
# Nvidia显卡运行状态
nvidia-smi
-
全新安装:
-
升级安装:
sudo apt update
sudo apt dist-upgrade
sudo apt autoremove
sudo do-release-upgrade -d
2 Nvidia驱动和开发包
驱动:
安装新版本前推荐卸载已有的Nvidia驱动:
sudo apt-get remove --purge nvidia*
-
ppa
ppa中提供的显卡驱动,主页:https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
# 添加源
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
# 选择合适的且尽可能新的版本(2018年)
# 使用apt search '^nvidia\-[0-9]+$'
sudo apt-get install nvidia-396
# 删除源
sudo add-apt-repository --remove ppa:graphics-drivers/ppa
支持Ubuntu 16.04的驱动(2018年)
补充:
使用apt full-upgrade
后升级后(包括驱动),可能造成运行nvidia-smi
出现以下问题:
Failed to initialize NVML: Driver/library version mismatch.
原因:内核模块中nvidia驱动没有同步更新。
解决方案:
方式1: 直接重启
方式2:手动重新加载内核模块(先移除旧模块,再加载新模块)
# 查看依赖(可略)
lsmod | grep -i nvidia
# 依次依次依赖模块
sudo rmmod nvidia_uvm
sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
# 移除旧模块(上一步不执行,会报错)
sudo rmmod nvidia
# 会自动加载相关模块
sudo nvidia-smi
参考:comzyh, 解决Driver/library version mismatch, 2017-04-06
查看已有驱动版本
dpkg -l | grep -i nvidia
cat /proc/driver/nvidia/version
CUDA:
CUDA(Compute Unified Device Architecture)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称。这里主要指用于对Nvidia GPU进行并行计算的软件开发包,避免直接对GPU等底层编程,与之相类似还有OpenCL。
注意:
安装CUDA和CuDNN的版本需要符合Tesorflow相应版本的要求(版本过低可能导致后续tensorflow等框架安装失败)。
下载最新版本:
- cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
- cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64.deb (这是更新包)
$ sudo dpkg -i cuda-xx.deb # 两个包都要,其实解压dk /var中
$ sudo apt update
$ sudo apt install cuda
非.deb
安装包:
# cuda 9.1 (2018年)下载安装
wget https://developer.nvidia.com/compute/cuda/9.1/Prod/local_installers/cuda_9.1.85_387.26_linux
sudo sh cuda_9.1.85_387.26_linux.run
设置环境变量(写入到~/.bashrc
或/etc/profile
)
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=$CUDA_HOME/lib64
export PATH=$CUDA_HOME/bin:$PATH
验证(运行一个样例程序)
$ nvidia-smi
# 进入sample安装的目录
$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ makesudo
$ ./deviceQuery # 看到GPU相关信息,RESULT=PASS
CuDNN
cudnn是一个构建在CUDA之上的神经网络层加速库。需要注册账户登录后才能下载,一般就选择适合自己系统的最新稳定版
选择 Library for Linux (Runtime和Development)
- cudnn-8.0-linux-x64-v7.tgz
# 解压
$ tar -zxvf cudnn.tgz
# 复制相关头文件
$ sudo cp includue/cudnn.h /usr/local/cuda/include/
# 复制动态链接库
$ sudo cp lib/lib* /usr/local/cuda-8.0/lib64/
# 在/usr/local/cuda-8.0/lib64/链接相关文件
# 删除原有动态文件
$ sudo rm -rf libcudnn.so libcudnn.so.5
# 生成软衔接(注意这里注意libcudnn的版本)
$ sudo ln -s libcudnn.so.5.1.10 libcudnn.so.5
$ sudo ln -s libcudnn.so.5 libcudnn.so
补充:cudnn 7.1版本(cuda9.0版本)
- 下载地址:http://developer.download.nvidia.com/compute/redist/cudnn/v7.1.2/cudnn-9.0-linux-x64-v7.1.tgz
- 资料网站(https://gitlab.com/nvidia/cuda/blob/centos7/9.0/runtime/cudnn7/Dockerfile)
- 安装
tar -zxvf cudnn-9.0-linux-x64-v7.1.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
# 复制库文件,同时也复制符号链接(-d)
sudo cp -d cuda/lib64/libcudnn* /usr/local/cuda/lib64/
3 深度学习框架
Google Tensorflow
推荐使用anaconda, 建立一个虚拟环境:
$ pip install tensorflow-gpu
问题:
运行tensorflow可能会出现:I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
原因:不支持部分CPU指令
解决:自己编译tensorflow,参见官网
几个注意点:
- 自己编译生成后的默认的whl不要修改名字,否则安装会有问题
- bazel 尽量下载最新版本
- 国内镜像下载地址:release 0.7.0 (2017-10-18);
- Github相关讨论
- 选项均选择默认,使用GPU需要配置cuda等选项;
- 部分选项导致编译异常如:
ERROR: missing input file '//third_party/mpi:mpio.h'.
- 部分选项导致编译异常如:
Caffe
见官网:
http://caffe.berkeleyvision.org/install_apt.html
http://caffe.berkeleyvision.org/installation.html
Ubuntu 17.04以上版本有预编译包,直接安装
# 仅有CPU
$ sudo apt install caffe-cpu
# CUDA(有Nvidia GPU)
$ sudo apt install caffe-cuda
低版本(16以下)需要先安装一些包,主要:
更低的版本(14, 12)还有其他的依赖包
- 通用的以来包 libXXX
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
- CUDA包
- BLAS包:3选1(BLAS实现了基本的线性代数运算)
$ sudo apt-get install libatlas-base-dev # ATLAS
$ sudo apt-get install libopenblas-dev # OpenBLAS
$ 安装Interl MKL
- 依赖包
- 编译安装
make或cmake, cmake方式如下
mkdir build
cd build
cmake ..
make all
make install
make runtest
- 测试
$ cd ~/caffe-1.0 # 切换到caffe根目录
$ ./data/mnist/get_mnist.sh # 下载数据集
$ cd examples/mnist
$ ./create_mnist.sh # 转换数据格式
$ ./train_lenet.sh # 训练网络
中间出现的错误:
anaconda2/bin/../lib/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found解决:
conda install libgcc
其他DL框架
mxnet, pylearn2, torch, theano, caffe2, keras
4 其他开发包SDK
OpenCV
从官网(代码托管在Github)下载源代码,3.3.0 安装参考:
- opencv 3.3.0
- 国外博客:http://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/
- 国内博客:https://www.cnblogs.com/arkenstone/p/6490017.html
基本步骤:
- 安装依赖包
- 下载源代码并解压
- 编译
# 最简单的形式
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make -j7 # -j表示并行进程数目,提高编译速度
$ sudo make install
cmake指定Python(不要忘了最后的..
上级目录):
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=ON \
-D PYTHON_EXECUTABLE=/usr/bin/python2.7 ..
4.测试
查询opencv版本号的命令:
pkg-config --modversion opencv
问题:
ippicv包下载失败
参考:http://blog.csdn.net/yiyuehuan/article/details/52951574
在github opencv_3rdparty的Branch中搜一下选择最新版
存放的目录和hash值有关:
ipp_file=../ippicv_linux_文件日期.tgz &&
ipp_hash=$(md5sum $ipp_file | cut -d" " -f1) &&
ipp_dir=3rdparty/ippicv/downloads/linux-$ipp_hash &&
mkdir -p $ipp_dir &&
cp $ipp_file $ipp_dir
Python 2中使用(编译时选择了Python2):
第二行是添加cv2.so所在路径,可以复制或建立符号链接
>>> import sys
>>> sys.path.append('/usr/local/lib/python2.7/site-packages')
>>> import cv2
>>> print cv2.__version__
Matlab
略
Python
略
参考文档
- [深度学习服务器环境配置: Ubuntu17.04+Nvidia GTX 1080+CUDA 9.0+cuDNN 7.0+TensorFlow 1.3], 52nlp, 2017-09-01
- autocyz, Ubuntu16.04+cuda8.0+caffe安装教程, CSDN, 2016-08-24
- xuzhongxiong, Ubuntu16.04+CUDA8.0+caffe配置, CSDN, 2016-10-01