docker训练深度学习_docker配置深度学习环境
序
阅读本篇⽂章可以帮你解决的问题是:提供⼀套解决⽅案,能够在⽀持Docker的任何版本Ubuntu系统下,搭建出完美运⾏各种深度学习框架、各种版本、各种环境依赖(NAIVID显卡)深度学习⼯程的开发环境。不仅如此,还要像在本机⼀样⽅便的修改代码运⾏计算。
搭建深度学习计算平台,⼀般需要我们在本机上安装⼀些必要的环境,安装系统、显卡驱动、cuda、cudnn等。⽽随着Docker的流⾏,往往能够帮我们轻松的进⾏环境搭建、复制与隔离,所以官⽅也利⽤容器技术与深度学习相结合,因此也出现了以下⽅案。
容器⽅案⽐传统⽅案带来更多的随意性,装系统前不需要考虑Ubuntu哪⼀个版本符合不符合我们的代码运⾏要求,我们只需要安装⼀个⾃⼰喜欢的(18.04完全可以),再在官⽹下载⼀下显卡驱动,或者软件源附加驱动更新⼀下就⾏了,剩下都不需要我们继续考虑。这些也⾮常的轻松,因为Nvidia对Ubuntu的⽀持越来越友好,我们只需要下载deb包,⼀⾏命令即可安装成功。
系统
显卡驱动
Cuda
Cudnn
传统⽅案
⼀种版本
必需
⼀种版本
必需
容器⽅案
各种版本
必需
⾮必需
⾮必需
正式进⼊正⽂之前,确保你已经安装好趁⼿的系统和显卡驱动。
I. 安装Docker
关于Docker教程,详见:Docker——⼊门实战
安装指定版本Docker CE
这⾥的版本由第⼆部分的Nvidia Docker依赖决定,笔者在写此⽂时需要的版本是18.03.1,如果在安装Nvidia Docker时依赖的Docker CE版本已经变更,可以卸载重新安装需要的版本。
sudo apt install curl
sudo apt-get update && sudo apt-get install -y docker-ce=18.03.1~ce-0~ubuntu1234
执⾏这个命令后,脚本就会⾃动的将⼀切准备⼯作做好,并且把Docker CE 的Edge版本安装在系统中。
启动Docker CE
sudo systemctl enable docker
sudo systemctl start docker12
建⽴docker ⽤户组
默认情况下,docker 命令会使⽤Unix socket 与Docker 引擎通讯。⽽只有root ⽤户和docker 组的⽤户才可以访问Docker 引擎的Unix socket。出于安全考虑,⼀般Ubuntu系统上不会直接使⽤root ⽤户。因此,更好地做法是将需要使⽤docker 的⽤户加⼊docker⽤户组。
# 建⽴docker组
sudo groupadd docker
# 将当前⽤户加⼊docker组
sudo usermod -aG docker $USER1234
注销当前⽤户,重新登录Ubuntu,输⼊docker info,此时可以直接出现信息。
配置国内镜像加速
在/etc/docker/daemon.json 中写⼊如下内容(如果⽂件不存在请新建该⽂件)
{
"registry-mirrors": [
"registry.docker-cn"
]
}12345
重新启动服务
tensorflow版本选择sudo systemctl daemon-reload
sudo systemctl restart docker12
II. 安装Nvidia Docker2
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
ocker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
# Add the package repositories
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get update && sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi1234567891011121314
III. 搭建环境
拉取镜像
Nvidia官⽹在DockerHub中提供了关于深度学习的各个版本环境,点我…有Ubuntu14.04-18.04,Cuda6.5-9.2,Cudnn4-7,基本含盖了我们所需要的各种版本的深度学习环境,我们直接拉取镜像,在已有的镜像基础上配置我们的深度学习环境。
下载镜像,这⾥以ubuntu16.04、cuda8.0、cudnn5.1的版本为例,我们到满⾜版本要求的TAG为8.0-cudnn5-devel-
ubuntu16.04。
# 拉取镜像
docker pull nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04
# 查看镜像
docker images -a1234
创建启动容器
利⽤下载好的镜像,创建⼀个交互式的容器。容器需要使⽤nvidia显卡,需要设置额外的参数。
docker run -it --name ⾃定义容器名 -v /home/你的⽤户名/mnist/:/home/你的⽤户名/mnist/ --runtime=nvidia -e
NVIDIA_VISIBLE_DEVICE=0,1 nvidia/cuda:8.0-cudnn5-devel-ubuntu16.041
NVIDIA_VISIBLE_DEVICE参数指定对容器分配⼏块GPU资源;-v参数⽤于挂载本地⽬录,冒号前为宿主机⽬录,冒号后为容器⽬录,两个可以设置为⼀样⽐较⽅便代码书写。配置⽬录挂载是为了⽅便本⽂下⼀部分测试Mnist服务。容器启动完毕,此时,可以像正常本机配置的深度学习环境⼀样,测试各个软件的版本。
nvidia-smi
nvcc -V
# 查看cudnn版本
cd /usr/lib/x86_64-linux-gnu/
ll |grep cudnn12345
IV. 构建环境
安装环境
在上⼀部分我们搭建了深度学习计算的必要环境,包括CUDA和CUDNN。然⽽⼤多数深度学习环境都是
需要执⾏Python编写的深度学习代码的,甚⾄需要⼀些常⽤的深度学习框架,如TensorFlow、PyTorch等。在上⼀部分我们拉取的Nvidia官⽅提供的镜像中并没有包含Python运⾏环境以及任何的深度学习框架,需要我们⾃⼰安装。
附上安装环境的所有命令:
apt-get update
# 安装Python2.7环境 3.+版本⾃⾏添加
apt-get install -y --no-install-recommends build-essential curl libfreetype6-dev libpng12-dev libzmq3-dev pkg-config python python-dev python-pip python-qt4 python-tk git vim
apt-get clean
## 安装深度学习框架 ⾃⾏添加
pip --no-cache-dir install setuptools
pip --no-cache-dir install tensorflow-gpu==1.2 opencv-python Pillow scikit-image matplotlib1234567
构建镜像
安装好环境后,其实已经可以开始运⾏我们的深度学习代码了。如果你想⽴刻测试⾃⼰的Docker深度学习环境搭建成功与否,可以直接开始下⼀部分的Mnist数据集测试。
如果此时,项⽬组另⼀位⼩伙伴也想跑深度学习,恰好需要和你⼀样的环境依赖,我们完全可以“拷贝”⼀份配好的环境给他,他可以直接上⼿去使⽤。Docker的⽅便之处也体现在这,我们可以将⾃⼰定制的容器构建成镜像,可以上传到Docker Hub给别⼈下载,也可以⽣成压缩包拷贝给别⼈。
利⽤commit命令,⽣成⼀个名为homography1.0的新镜像。
# docker commit -a "作者信息" -m "提交信息" 之前启动的容器名 ⾃定义镜像名
docker commit -a "wangguoping" -m "deep homography environment" tensorflow1.2 homography1.012
⾄于将镜像提交Hub和拷贝就不是本⽂重点,也就不介绍了。
另外,这⾥⽣成镜像还有⼀个好处,就是第六部分结合PyCharm使⽤。PyCharm⾥⾯配Docker选择的是镜像(IMAGE),⽽不是容器(Container),它会根据我们选择的镜像⾃⼰帮我们启动⼀个容器,⽤来运⾏PyCharm⾥⾯的代码。我⼀开始没有搞清楚这个概念,也⾛了不少弯路。
V. 测试Mnist
进⼊上⼀部分挂载的⽬录:
cd /home/test/mnist # test是我的⽤户名
vim mnist.py # 创建mnist的tensorflow代码12
# coding=utf-8
import tensorflow as tf
ist import input_data
mnist = ad_data_sets("MNIST_data/", one_hot=True)
train_img = ain.images
train_lab = ain.labels
test_img = st.images
test_lab = st.labels
dim_input = 784
dim_output = 10
x_data = tf.placeholder(tf.float32, [None, dim_input])
y_real = tf.placeholder(tf.float32, [None, dim_output])
stddev = 0.1
weights = {"w_conv1": tf.Variable(tf.random_normal([3, 3, 1, 64], stddev=stddev)),
"w_conv2": tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=stddev)),
"w_fc1": tf.Variable(tf.random_normal([7 * 7 * 128, 1024], stddev=stddev)),
"w_fc2": tf.Variable(tf.random_normal([1024, dim_output], stddev=stddev))}
biases = {"b_conv1": tf.s([64])),
"b_conv2": tf.s([128])),
"b_fc1": tf.s([1024])),
"b_fc2": tf.s([dim_output]))}
def forward_prop(_input, _w, _b, keep_prob):
_input_r = tf.reshape(_input, shape=[-1, 28, 28, 1])
_conv1 = v2d(_input_r, _w["w_conv1"], strides=[1, 1, 1, 1], padding="SAME")
_conv1 = bias_add(_conv1, _b["b_conv1"]))
_pool1 = tf.nn.max_pool(_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# dropout
_pool_dr1 = tf.nn.dropout(_pool1, keep_prob=keep_prob)
_conv2 = v2d(_pool_dr1, _w["w_conv2"], strides=[1, 1, 1, 1], padding="SAME")
_conv2 = bias_add(_conv2, _b["b_conv2"]))
_pool2 = tf.nn.max_pool(_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
_pool_dr2 = tf.nn.dropout(_pool2, keep_prob=keep_prob)
flatten = tf.reshape(_pool_dr2, shape=[-1, _w["w_fc1"].get_shape().as_list()[0]])
_fc1 = lu(tf.add(tf.matmul(flatten, _w["w_fc1"]), _b["b_fc1"]))
_fc_dr1 = tf.nn.dropout(_fc1, keep_prob=keep_prob)
_out = lu(tf.add(tf.matmul(_fc_dr1, _w["w_fc2"]), _b["b_fc2"]))
return {"input_r": _input_r, "conv1": _conv1, "pool1": _pool1, "pool_dr1": _pool_dr1, "conv2": _conv2, "pool2": _pool2, "pool_dr2": _pool_dr2, "flatten": flatten, "fc1": _fc1, "fc_dr1": _fc_dr1, "out": _out} keep_prob = tf.placeholder(tf.float32)
y_pred = forward_prop(x_data, weights, biases, keep_prob)["out"]
loss = tf.reduce_softmax_cross_entropy_with_logits(logits=y_pred, labels=y_real))
op = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss)
correct = tf.equal(tf.arg_max(y_pred, 1), tf.arg_max(y_real, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
training_epoch = 100
batch_size = 128
display_step = 2
init = tf.global_variables_initializer()
total_batch = ain.num_examples // batch_size
print("have %d batchs,each batch size is:%d" % (total_batch, batch_size))
saver = tf.train.Saver(max_to_keep=2)
is_training = True
with tf.Session() as sess:
sess.run(init)
if is_training:
for epoch in range(training_epoch):
avg_loss = 0
for i_batch in range(total_batch):
batch_xs, batch_ys = _batch(batch_size)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论