由于即将要开始撰写强化学习论文,所以我最近搭建了一个基于Ubuntu和Nvidia的深度学习计算机。虽然在深度学习方面有很多不错的教程,但却无法找到一篇完整的安装说明。我不得不阅读大量的文档来了解细节和规范,其中一些不完整或者存在语法错误。因此,我决定把我所做的所有工作进行整理并记录下来。
该指南将告诉你如何进行安装:
- 操作系统(Ubuntu)
- 4个驱动程序和库(GPU驱动程序、CUDA、cuDNN和pip)
- 5个Python深度学习库(TensorFlow、Theano、CNTK、Keras和PyTorch)
下图展示了每个包之间的依赖关系。由于只需要安装一个Python深度学习库,因此你可以随意选择所需的部分。
每个组件更详细的用途说明:
- ** Ubuntu **(v16.04.3) - 操作系统,进程调度。
- ** Nvidia GPU驱动程序**(v375) - 使操作系统能够操作GPU。
- ** CUDA **(v8.0) - GPU C库。代表计算统一设备架构。
- ** cuDNN **(v6.0.21) - 基于CUDA的深度学习基元库。代表CUDA深度神经网络。
- ** pip **(v9.0.1) - Python包安装程序。
- ** TensorFlow **(v1.3) - 由Google开发的深度学习库。
- ** Theano **(v0.9.0) - 在GPU上运行的数学库。
- ** CNTK **(v2.2) - 由Microsoft Research开发的深度学习框架。
- ** Keras **(v2.0.8)- 深度学习包装。可与TensorFlow、Theano或CNTK一起使用。
- ** PyTorch **(v0.2.0) - 具有GPU加速的动态深度学习库。
1. 安装 Ubuntu 16.04.3
本章节所示的安装步骤将覆盖已有的分区或操作系统,安装一个干净的操作系统。
由于v 16.04.3是最新的LTS(长期支持)版本,因此它可以安装在可启动的USB上。首次打开计算机电源时,通过访问引导菜单并选择USB从USB引导。
我的计算机有两个硬盘,1TB的SATA和256GB的SSD。在我的搭建计划中,Ubuntu安装在1TB的硬盘中,这样SSD就可以用于存放数据集,加快训练速度。在安装过程中,屏幕显示Installation Type
时,我选择了Something else
,这一步将创建以下三个分区。
引导分区(128GB):包含系统文件、程序设置和文档。
交换分区(2xRAM大小):对我来说,这是128GB。用于扩展内核RAM作为虚拟内存使用。
用户分区(剩余的):我的1TB硬盘驱动器的可用空间为744GB。
安装完成后,运行以下命令升级内核版本。
sudo apt-get update
sudo apt-get upgrade
2. 安装Nvidia GPU驱动程序
安装Ubuntu后,你可能会注意到屏幕分辨率不正确,而且无法更改。这是因为来自GPU的视频输出没有驱动程序,也没有配置。
有两种方法来安装驱动程序,从某个Ubuntu的资源库安装,或者从源安装。第一种方法更容易,但需要频繁重新安装。当调用命令sudo apt-get update
和sudo apt-get upgrade
时,会更新内核。这不会更新Nvidia驱动程序,并将导致GUI无法正确加载。而从源安装则可以避免这个问题。
从包装安装v375(更容易)
以下命令将列出与系统兼容的驱动程序版本。它将给出两个数字:最新版本和长期版本号。这个命令将从最早的版本开始列出,所以一定要向上滚动屏幕。
sudo add-apt-repository ppa:graphics-drivers/ppa
添加并安装资源库。在第二个命令中,将<driver_number>
更改为要安装的版本。建议安装最新的长期支持版本:375。
sudo apt-get updatesudo apt-get install nvidia-<driver_number>
重新启动计算机并重新配置视频输出参数。
sudo shutdown -r now
Screen Display(屏幕显示)现在应该能够正确识别使用的显示器了,要测试驱动程序是否能正常工作,你可以更改显示配置、分辨率和方向。
从Nvidia源安装v384.90(更难)
从Nvidia网站下载最新的驱动程序。对我而言,我选择的选项是:
GeForce -> GeForce 10 系列 -> GeForce GTX 1080 -> Linux 64位 -> 英语(英国)
可以选择编译为32位架构,以及开发版本的GUI。
sudo apt-get install gcc-multilib xorg-dev
按CTRL + ALT + F1
并登录。这将从GUI切换到终端。为了重建视频输出,必须首先停止GUI。
sudo service lightdm stop
如果该命令不起作用,那么说明Ubuntu的新版本使用的是systemctl
而不是lightdm
。然后给这个程序赋予可执行权限并运行它。
cd <download location>
chmod +x NVIDIA-Linux-x86_64-384.90.run
sudo ./NVIDIA-Linux-x86_64-384.90.run --dkms
运行时,你可能会收到pre-install script failed(预安装脚本失败)
的消息。这并不重要,因为预安装脚本包含一个命令:exit 1
。其目的只是为了确保你真的要安装驱动程序。
选项--dkms
(默认情况下应该是这个选项)在内核通过将驱动程序安装到一个模块中来更新自身时,会阻止重新安装驱动程序。在内核更新期间,dkms触发驱动程序重新编译到新的内核模块堆栈。
如果安装失败,那是因为Secure Boot
没有在计算机的BIOS中禁用。重新启动计算机并在BIOS选项中禁用Secure Boot
。
如果安装成功,则可以重新启动GUI了。
sudo service lightdm start
卸载:sudo ./NVIDIA-Linux-x86_64-384.90.run --uninstall
验证
确保以下命令能够识别正确的GPU版本
nvidia-smi
确保驱动程序版本号就是你所安装的版本号
cat /proc/driver/nvidia/version
3. 安装CUDA 8.0
从Nvidia网站下载CUDA的运行文件,使用以下系统属性:
Linux -> x86_64 -> Ubuntu -> 16.04 -> .deb(网络)
浏览.deb
文件的存放位置,卸载.deb
,更新软件包列表并使用以下命令安装CUDA。
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
将库添加到bash路径中,以便可以让其他应用程序找到。
echo 'export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
要进行验证,执行nvcc -V
以检查 Nvidia C 编译器版本(nvcc)与CUDA所使用的编译器版本一致。
重新启动计算机sudo shutdown -r now
来完成安装。
可选:测试CUDA安装
测试安装的方法是运行一些例程。以下命令将创建一个名为test_CUDA
的目录,其中会存储示例程序。
mkdir test_CUDA
cd test_CUDA
./cuda-install-samples-8.0.sh
子目录NVIDIA_CUDA-8.0_Samples/3_Imaging/cudaDecodeGL
中存放了文件findgllib.mk
。该文件在第61行第30列包含了Nvidia驱动程序的硬编码值,该值应从367更改为先前安装的驱动程序版本号。
编译例程
cd ../.. && make
你现在可以在NVIDIA_CUDA-8.0_Samples
中运行例程了。 NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release
中有两个特别有用的脚本。 ./deviceQuery
能打印出正在使用的GPU,./bandwidthTest
能打印出GPU的带宽。
4. 安装 cuDNN 6.0.21
在Nvidia网站上注册开发人员计划并同意条款。从下拉菜单cuDNN v6.0.21 (April 27, 2017), for CUDA 8.0 下载:
- cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)
- cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)
.deb
优于.tar
,因为这个格式专门为Ubuntu设计,安装过程更加清晰。这三个软件包可以使用以下命令进行安装:
sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb
sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb
sudo dpkg -i libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb
测试 cuDNN
将安装的例程复制到可读目录中,编译并运行mnistCNN
。
cp -r /usr/src/cudnn_samples_v6/ $HOME
cd $HOME/cudnn_samples_v6/mnistCUDNN
make clean && make
./mnistCUDNN
如果一切顺利,脚本应该返回Test passed!
卸载 cudnn
以下命令将卸载这三个库。另外,如果你已经创建了例程,那么另外还有执行rm -r〜/ cudnn_samples_v6
。
sudo apt-get remove libcudnn6
sudo apt-get remove libcudnn6-dev
sudo apt-get remove libcudnn6-doc
5. 安装 pip 9.0.1
pip本身的更新非常频繁,每两周一次。建议使用最新的pip。
以下命令将进行安装并升级到最新版本。
sudo apt-get install python-pip python-dev
sudo pip install --upgrade pip
要进行验证,确保pip -V
能打印出版本号。
6. 安装 Tensorflow 1.3.0
pip install tensorflow-gpu
要进行验证,启动python,执行$ python,
并确保以下脚本能打印出Hello, TensorFlow!
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
7. 安装 Theano 0.10
Theano需要以下系统依赖关系
sudo apt-get install libopenblas-dev
和以下Python依赖关系。
sudo pip install numpy scipy nose sphinx pydot-ng `pycuda scikit-cuda cython`
libgpuarray
让Theano能够使用GPU,它必须从源代码进行编译。首先下载源代码
git clone https://github.com/Theano/libgpuarray.git
cd libgpuarray
在一个名为Build的文件夹中进行编译。
mkdir Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
sudo make install
然后编译成一个python包
cd ..
`python setup.py build
sudo python setup.py install`
将下面这一行添加到~/.bashrc
中,以便Python可以找到这个库。
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
最后,安装Theano
sudo pip install git+https://github.com/Theano/Theano.git#egg=Theano
要进行验证,首先创建一个测试文件test_theano.py
, 其内容可以从这里复制过去。然后确保THEANO_FLAGS = device = cuda0 python test_theano.py
能成功输出Used the gpu
。
8. 安装 CNTK 2.2
sudo pip install https://cntk.ai/PythonWheel/GPU/cntk-2.2-cp27-cp27mu-linux_x86_64.whl
要进行验证,确保python -c "import cntk; print(cntk.__version__)"
能打印出2.2
。
9. 安装 Keras 2.0.8
sudo pip install keras
要进行验证,检查$ python
中的import keras
是否成功了。
10. 安装 PyTorch 0.2.0
PyTorch的运行依赖torchvision
和torch
这两个库,下面将进行安装。
sudo pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl
sudo pip install torchvision
要进行验证,以下脚本应该能打印出一个张量。
from future import print_function
import torch
x = torch.Tensor(5, 3)
print(x)
结论
到目前为止,整个过程中最难的部分是找到Nvidia驱动程序和深度学习软件包之间的依赖关系,以及最有效的长期支持版本的安装过程。最简单的部分是安装Python包,这些包维护得非常好,而且文档详细。
虽然阅读文档和源代码非常耗时,但是了解每个软件包的构建和运行情况非常有启发性,它能够帮助我了解整个Ubuntu生态系统。
文章原标题《Deep Learning Software Installation Guide》,作者:dyth,译者:夏天,审校:主题曲。
文章为简译,更为详细的内容,请查看原文