Ubuntu 18.04 系统安装完成后,我们从零开始搭建基于docker 的深度学习环境。整个安装过程主要分为4步:(1)安装nvidia驱动(2)安装docker (3)安装nvidia docker (4)拉取Deepo镜像。最后,我们通过tensorflow运行一个MNIST手写字符识别的例子来进行验证。
一. 安装nvidia驱动
1. 首先禁用nouveau驱动
把 nouveau 驱动加入黑名单
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
在文件 blacklist-nouveau.conf 中加入如下内容:
blacklist nouveau
options nouveau modeset=0
禁用 nouveau 内核模块
sudo update-initramfs -u
重启
sudo reboot
重启后再次进入命令行
lsmod | grep nouveau
如果没有任何输出说明禁用成功
2. 安装nvidia驱动
需要安装新版本的驱动可以先添加源:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
然后执行以下命令,列出显卡可用的和推荐的驱动程序
ubuntu-drivers devices
选择一个版本进行安装,这里选择nvidia-driver-430
sudo apt install nvidia-driver-430
安装完成后重启
sudo reboot
3.验证是否安装成功
输入命令
nvidia-smi
若出现下图则表示安装成功:
二. 安装docker
docker的安装过程请参考官方地址https://docs.docker.com/install/linux/docker-ce/ubuntu/。这里的docker指的是docker-ce(docker社区版本),采用基于仓库的方式进行安装。
1. 设置仓库
更新软件源
$ sudo apt-get update
安装一些包来允许apt通过HTTPS协议使用仓库
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加Docker的官方GPS秘钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
验证,获得秘钥的指纹为9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
运行以下命令来添加稳定的仓库
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2. 安装docker-ce
更新软件源
$ sudo apt-get update
安装最新版本的docker-ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
3. 验证是否安装成功
通过hello-world镜像生成一个容器,打印出hello world信息。
运行以下命令:
$ sudo docker run hello-world
若能产生以下输出,则表示docker成功安装:
4. 完善:非root用户管理docker(该步骤也可忽略)
docker安装完成后,必须拥有root权限才能运行docker命令。非root用户运行docker命令,必须加前缀“sudo”。若不想每次都输入“sudo”,可以执行以下步骤。
创建一个docker用户组
$ sudo groupadd docker
将当前用户添加到这个组中
$ sudo usermod -aG docker $USER
注销当前用户,重新登录。此时用户组已更新
验证不加sudo前缀,即可运行docker命令。应能打印出hello world信息,
$ docker run hello-world
至此,docker已安装完成。可以通过 docker version命令查看所安装docker的版本。如下图所示
可以看出所安装docker的版本为19.03
三. 安装nvidia docker
nvidia docker的安装参考https://github.com/NVIDIA/nvidia-docker。
添加仓库
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
更新软件源,进行安装
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
验证是否安装成功,可运行命令
docker run --gpus all --rm nvidia/cuda:9.0-base nvidia-smi
若产生类似输出,表示安装成功:
四. 拉取Deepo镜像
请参考网址https://github.com/ufoym/deepo#Installation,这里安装的是GPU版本。
仅需以下命令:
docker pull ufoym/deepo
至此,深度学习环境已全部搭建完成。
五. 例子:MNIST手写字符识别
1. 首先基于ufoym/deepo镜像启动一个交互式容器
docker run --gpus all -it ufoym/deepo bash
其中,--gpus all参数表示容器可以使用所有的GPU。
2. 进入python环境
python
3. 输入代码
from __future__ import absolute_import, division, print_function, unicode_literals
# 导入 TensorFlow
import tensorflow as tf
载入并准备好 MNIST 数据集。将样本从整数转换为浮点数:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
将模型的各层堆叠起来,以搭建 tf.keras.Sequential 模型。为训练选择优化器和损失函数:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
训练并验证模型:
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
执行结果如下图所示: