docker 训练深度学习_docker配置深度学习环境

# coding=utf-8

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

train_img = mnist.train.images

train_lab = mnist.train.labels

test_img = mnist.test.images

test_lab = mnist.test.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.Variable(tf.zeros([64])),

"b_conv2": tf.Variable(tf.zeros([128])),

"b_fc1": tf.Variable(tf.zeros([1024])),

"b_fc2": tf.Variable(tf.zeros([dim_output]))}

def forward_prop(_input, _w, _b, keep_prob):

_input_r = tf.reshape(_input, shape=[-1, 28, 28, 1])

_conv1 = tf.nn.conv2d(_input_r, _w["w_conv1"], strides=[1, 1, 1, 1], padding="SAME")

_conv1 = tf.nn.relu(tf.nn.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 = tf.nn.conv2d(_pool_dr1, _w["w_conv2"], strides=[1, 1, 1, 1], padding="SAME")

_conv2 = tf.nn.relu(tf.nn.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 = tf.nn.relu(tf.add(tf.matmul(flatten, _w["w_fc1"]), _b["b_fc1"]))

_fc_dr1 = tf.nn.dropout(_fc1, keep_prob=keep_prob)

_out = tf.nn.relu(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_mean(tf.nn.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 = mnist.train.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 = mnist.train.next_batch(batch_size)

feed_dict = {x_data: batch_xs, y_real: batch_ys, keep_prob: 0.5}

sess.run(op, feed_dict=feed_dict)

avg_loss += sess.run(loss, feed_dict=feed_dict)

avg_loss = avg_loss / total_batch

if epoch % display_step == 0:

print("Epoch:%3d/%3d, loss:%.6f" % (epoch, training_epoch, avg_loss))

feed_dict = {x_data: batch_xs, y_real: batch_ys, keep_prob: 0.5}

train_accuracy = sess.run(accuracy, feed_dict=feed_dict)

print("train accuracy:%.6f" % train_accuracy)

saver.save(sess, "MNIST_model/model.ckpt-" + str(epoch))

else:

saver.restore(sess, tf.train.latest_checkpoint(checkpoint_dir="MNIST_model/"))

feed_dict = {x_data: mnist.test.images, y_real: mnist.test.labels, keep_prob: 1.0}

test_accuracy = sess.run(accuracy, feed_dict=feed_dict)

print("test accuracy:%.6f" % test_accuracy)

print("end!")

下载Mnist数据集,保存在/home/test/mnist/MNIST_data目录下。这里需要我们修改目录权限,Docker共享目录默认只读。注意,这里切换到宿主机的终端下进行操作,可能你会问为什么不直接容器内下载,因为以后我们要跑的数据集不可能只是mnist大小,难道你要在docker里下载几十个G的数据集吗。

sudo chmod -R a+rw /home/test/mnist

mkdir -p /home/test/mnist/MNIST_data

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz

wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz123456

切换至Docker的终端下,运行mnist.py脚本文件,即可发现已经可以跑起来了。

python mnist.py1

此时会在/home/test/mnist下产生MNSIT_model文件夹,里面保存着训练生成的模型。

VI. PyCharm+Docker

Mnist已经测试成功,基本的Docker+Deep Learning方案演示已经完成。然而,我一直不喜欢命令行修改代码,运行脚本,查看结果,我十分推崇PyCharm去调试Python。比如,当Mnist训练完毕,我需要修改第80行的is_training = False来测试我训练出的模型,没有PyCharm,我需要通过vim修改mnist.py,然后再输入python来运行。可能你会觉得也不是很麻烦,如果需要修改模型,更换网络,甚至重构代码呢?

所以能用IDE尽量还是让PyCharm来开发我们代码,我们只需要编码,点击运行,剩下的其他操作我都不太愿意去干,一行命令都懒得敲,毕竟懒嘛!

PyCharm在2018的Profession版本之后都是提供Docker的功能的,可以利用容器中的Python解释器为我们的代码提供运行条件。利用PyCharm,你可以像在使用本机的深度学习环境一样,无需考虑因容器带来的过多的繁琐操作。官方关于Docker的使用文档参见:http://www.jetbrains.com/help/pycharm/run-debug-configuration-docker.html

在Settings的Build下有一个Docker选项,右侧添加,PyCharm默认会给我们设置好选择Unix Socket的方式与Docker守护进程进行通信。出现Connection successful即可,点击OK。

添加成功后,PyCharm下方会出现docker的窗口,可以可视化的查看镜像与容器的相关信息。其中的homography1.0:latsest是我们上一步构建的镜像。

下面新建一个Python的解释器,类似于本地的Python创建虚拟环境。

按照图示新建,点击OK,即可发现导入容器的Python解释器已经拥有了全部的第三方Python库以及深度学习框架。

等待PyCharm导入容器的解释器成功,理论上我们便可以开始点击运行按钮跑起我们的代码了。但实际还有两个问题需要解决。

首先,PyCharm会根据我们的镜像来启动一个容器运行我们的代码,然而PyCharm并不知道我们是要运行深度学习程序,需要利用Nvidia Docker使用GPU资源。我们之前是通过配置–runtime=nvidia参数来启动一个可以使用GPU的容器,那我们只要指定PyCharm启动一个容器的时候也带上这个参数就好。

另一个问题就是,我们现在跑的程序是读取宿主机上某个目录下的几十个G的数据集,好像Docker也不知道数据在哪里,毕竟我们没有挂载。同样,模型它也不会帮我们保存,一旦程序运行结束,PyCharm启动的容器销毁,所有的结果都没了,程序白跑了,所以我们也要指定-v参数告诉PyCharm挂载什么目录。

解决这两个问题,在PyCharm的Run/Debug Configuration中,可以配置。

点击Docker Container settings右边的按钮,添加上面所说的两个参数即可。

坑的是,你发现没法加入–runtime参数。然而,还是找到了解决方案。把default-runtime”: “nvidia”添加到/etc/docker/daemon.json文件中。这个文件也是我们配置国内镜像加速的文件。

{

"registry-mirrors": [

"https://registry.docker-cn.com"

],

"default-runtime": "nvidia",

"runtimes": {

"nvidia": {

"path": "/usr/bin/nvidia-container-runtime",

"runtimeArgs": []

}

}

}123456789101112

修改完毕,需要重启docker服务。

sudo systemctl daemon-reload

sudo systemctl restart docker12

好了,大功告成,点击运行,跑起来~~

VII. 结语

Docker还是有很多技巧的,短暂几天也只学了个皮毛,用于深度学习也十分不错。官方也有很多构建好的深度学习环境镜像,包含了主流的深度学习框架,可以再Docker Hub自行搜索。实验室电脑有时候还是很奇葩的,需要耐心解决,积极的去利用一些新的技术解决难题应该是更应该考虑的事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值