教你一招,利用 PyTorch on DC/OS 实现深度学习
Posted Mesosphere APAC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教你一招,利用 PyTorch on DC/OS 实现深度学习相关的知识,希望对你有一定的参考价值。
DC/OS支持多种深度学习框架,如PyTorch,TensorFlow等。
近年来,随着计算资源,可用数据量和机器学习的不断发展,神经网络计算成为受很多人欢迎的强大的工具。这种趋势也反映在不断增加的深度学习框架上,如 TensorFlow, Mxnet, Keras, Caffe, 和 pyTorch.
尽管 TensorFlow 受到的关注最多( DC/OS 的 TensorFlow 框架可以一键部署一个高容错的分布式 TensorFlow 集群),但不说明它适合所有的团队和场景,事实上,很多团队针对不同的model搭建了不同的深度学习框架。所以,从事数据科学的团队选择一个支持框架的平台是非常重要的,这样他们才可以拥有所需要的灵活性。
在这篇博客中,我们将会看看部署多个框架的基本原理以及如何部署他们,首先我们会学习 PyTorch 和 TensorFlow 的不同点,然后在 DC/OS 上部署我们的第一个 PyTorch 框架,最后我们会使用 DC/OS 的 GPUs 资源调度功能来进行模型的训练学习。
深度学习 Pytorch Vs Tensorflow
为了帮助大家理解两者不同点,我们首先来了解一下Pytorch以及它如何运行在DC/OS上。
作为Torch框架的Python版本,PyTorch可以用作numpy的嵌入式GPU替代品,可以做为科学计算的标准Python包,或者作为一个非常灵活的深度学习平台。
我们首先来看看TensorFlow的实现:
“测试代码”
import tensorflow as tf
import numpy as np
X = tf.placeholder("float")
Y = tf.placeholder("float")
W = tf.Variable(np.random.random(), name="weight")
pred = tf.multiply(X, W)
cost = tf.reduce_sum(tf.pow(pred-Y, 2))
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for t in range(10000):
x = np.array(np.random.random()).reshape((1, 1, 1, 1))
y = x * 3
(_, c) = sess.run([optimizer, cost], feed_dict={X: x, Y: y})
print c
“测试代码”
首先指定神经网络图和优化器配置参数,然后在通过下面的 sess.run([optimizer, cost], feed_dict={X: x, Y: y})来进行一次神经网络学习训练。这种方法通常被称为静态计算图,具体步骤是首先定义一个静态图,然后在图上进行多次训练学习。
接下来,我们来看看针对同样模型,PyTorch是如何实现的:
“测试代码”
import numpy as np
import torch
from torch.autograd import Variable
model = torch.nn.Linear(1, 1)
loss_fn = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for t in range(10000):
x = Variable(torch.from_numpy(np.random.random((1,1)).astype(np.float32)))
y = x * 3
y_pred = model(x)
loss = loss_fn(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print loss.data[0]
“测试代码”
在PyTorch中,执行时候使用动态计算图,这说明在计算时候,每一步都是立即进行评估,相应的,对于静态计算图来说,是需要被指定后才进行评估,因此PyTorch采用的动态计算图还被称为定义时运行(Define-by-Run),而TensorFlow采用的静态计算图被称为定义后运行(Define-and-Run)。
这有什么实际意义?首先,PyTorch的动态计算图可以进行灵活的设置,比如:我们可以在每次运行模型时候使用不同的图参数,这在处理递归神经网络和可变大小的输入时特别有用,此外,可以使用标准的Python调试工具去调试PyTorch,如pdb。
对于TensorFlow的静态计算图来说,由于整个图可以一次优化完毕,因此它具有更大的优化和批处理操作潜力。
关于框架和计算图的更多讨论和比较,可以参考下面的一些博客:
PyTorch or Tensorflow 链接: https://awni.github.io/pytorch-tensorflow/
How is PyTorch different from Tensorflow 链接:https://www.quora.com/How-is-PyTorch-different-from-TensorFlow-What-are-the-advantages-of-using-one-vs-the-other-When-should-I-use-one-or-the-other/answer/Shubhanshu-Mishra
Tensorflow Sucks 链接:http://nicodjimenez.github.io/2017/10/08/tensorflow.html
我们已经看到二者的不同,他们都有各自适应的应用场景,因此开发团队可以根据实际情况综合使用二者。选择Pytorch的可能更青睐于其简单的调试功能以及动态计算图为递归神经网络和处理复杂多变的输入场景带来的便利,而偏向于TensorFlow的团队可能更看重其高度优化的神经网络(CNNs)。
这就带来了一个问题:如何在相同的基础设施上运行这两个框架?
在集群上运行多个分布式框架正是DC/OS的强项,同时,DC/OS的GPU隔离机制使得其更加适合于深度学习框架。
如何在DC/OS上运行PyTorch?尽管它现在还不是DC/OS上一个完整可用的包,但这不是问题。
现在有很多可用的PyTorch镜像可选,我们推荐使用这个镜像(https://github.com/anibali/docker-pytorch)运行PyTorch,官方镜像(https://github.com/pytorch/pytorch/blob/master/Dockerfile)包含了太多PyTorch相关的工具,需要注意:如果你想要使用主机的GPU资源,那么你需要确保你的镜像包含相应版本的CUDA。
假设你已经安装了DC/OS(1.9 版本以上),并配置好了DC/OS CLI,那么,我们将可以通过UI或者CLI部署如下的应用:
{
"id": "/pytorch",
"instances": 1,
"cmd": "while true; do sleep 1000000; done",
"container": {
"type": "MESOS",
"volumes": [],
"docker": {
"image": "mesosphere/anibali-pytorch:0.2.0"
}
},
"mem": 2000,
"cpus": 1,
"gpus": 0
}
注意,我们的启动命令是“sleep”,这使得我们可以以交互式方式连接并使用容器。
通过DC/OS图形界面部署 PyTorch
编写JSON文件,配置应用参数
服务启动后,我们用如下命令连接入容器:
dcos task exec -it pytorch bash
接下来,我们需要clone一个PyTorch项目,并把PyTorch添加到系统的PATH路径中
export PATH=/home/user/miniconda/envs/pytorch-py36/bin:$PATH
export CONDA_DEFAULT_ENV=pytorch-py36
export CONDA_PREFIX=/home/user/miniconda/envs/pytorch-py36
git clone https://github.com/pytorch/examples.git
cd examples
运行神经网络测试程序:
time python mnist/main.py
我们会得到如下的输出:
Test set: Average loss: 0.0543, Accuracy: 9816/10000 (98%)
real 14m49.390s
user 15m35.794s
sys 0m41.390s
恭喜你!你在DC/OS上成功训练了你的第一个PyTorch模型!接下来,我们来看看使用DC/OS的GPU功能加速模型的训练学习是多么简单。
使用GPU加速PyTorch的模型训练
GPU非常适合训练神经网络,因为它们可以大规模地执行矢量操作。幸运的是,DC/OS支持在不同的任务中隔离分配GPU资源。
首先,要使DC/OS中的Docker容器能够支持GPU,需要注意的是,要使Docker容器支持并使用Nvidia GPUs需要一个特殊的工具:nvidia-docker,而在我们应用中使用的是 Universal Container Runtime, 它已经支持了类似功能。
通过更改上面应用定义中的GPU参数,将可以开启GPU加速功能。
…
"gpus": 1
我们也可以使用DC/OS界面来部署我们的PyTorch服务:
DC/OS 界面配置GPU资源
服务部署成功后,我们依旧使用DC/OS CLI连接入容器:
dcos task exec -it pytorch bash
同样的,clone一个PyTorch项目,并把PyTorch添加到系统的PATH路径中
export PATH=/home/user/miniconda/envs/pytorch-py36/bin:$PATH
export CONDA_DEFAULT_ENV=pytorch-py36
export CONDA_PREFIX=/home/user/miniconda/envs/pytorch-py36
git clone https://github.com/pytorch/examples.git
cd examples
在再次运行测试程序之前,我们测试一下DC/OS集群中的GPU功能,用nvidia-smi命令来查看可用GPU资源:
# Set up environment to access Nvidia GPU libraries and run nvidia-smi
export LD_LIBRARY_PATH=/usr/local/nvidia/lib64
export PATH=$PATH:/usr/local/nvidia/bin
nvidia-smi
在我们的应用定义中只指定来1个GPU,即使当前宿主机主机上有多个GPU,容器中的nvidia-smi也只应该上报一个GPU:
Sun Dec 3 01:49:20 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.35 Driver Version: 367.35 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GRID K520 Off | 0000:00:03.0 Off | N/A |
| N/A 31C P8 17W / 125W | 0MiB / 4036MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
最简单的检测GPU是否在PyTorh中开启的办法是:
python3 -c 'import torch; print(torch.rand(2,3).cuda())'
0.2775 0.6453 0.6349
0.4785 0.4630 0.2352
[torch.cuda.FloatTensor of size 2x3 (GPU 0)]
现在我们可以使用GPU加速来训练我们的模型了:
time python mnist/main.py
这次输出结果是:
Test set: Average loss: 0.0538, Accuracy: 9814/10000 (98%)
real 2m50.693s
user 2m50.486s
sys 0m10.924s
恭喜!你在训练PyTorch神经网络中通过使用GPU加速获得了5倍多的性能提升。
DC/OS中支持PyTorch
将PyTorch部署在一个单一容器中并不是一个符合生产级别的部署解决方案。能够部署一个像TensorFlow一样的高容错分布式PyTorch集群才是PyTorch接下来的目标,如果你对PyTorch框架感兴趣,欢迎通过如下Google Group( tensorflow-dcos)或者Slack channel(#tensorflow)联系我们。
如果想了解更多关于DC/OS上部署TensorFlow的信息,可以观看来自MesosCon上的视频教程—— 在DC/OS上运行分布式TensorFlow(https://www.youtube.com/watch?v=vsyU9R3y7VA),或者可以查看示例教程 。
点击原文阅读查看英文版博客
以上是关于教你一招,利用 PyTorch on DC/OS 实现深度学习的主要内容,如果未能解决你的问题,请参考以下文章