资源 | 一张速查表实现Apache MXNet深度学习框架五大特征的开发利用
Apache MXNet 是一个功能全面,且具有高度可扩展性的深度学习框架,可支持创建和训练最新型的深度学习模型。通过它,你可以创建卷积神经网络,LSTM 网络和其它的模型。它支持多种语言,包括但不限于 Python、Scala、R和 Julia 。本文将对 MXNet 五大特征的实现进行介绍。
在本篇文章中,我们对使 MXNet 在 AWS 云中成为开发者友好型框架的一些特征进行了展示。对于更喜欢符号式表现形式的开发者,我们也提供了一张速查表,以在 MXNet 下用 Python 对神经网络进行编码。这张速查表使上手 MXNet 的过程变得简化。对于已经使用此种框架的开发者而言,这也是一个不错的参考手册。
1. 一行代码支持多 GPU 训练
在多个 GPU 上运行的能力是 MXNet 架构的核心部分,你只需要输入训练所用的设备列表。
默认情况下,MXNet 使用数据并行化以在多个 GPU 间对工作负载进行划分。例如,如果你有 3 个 GPU,每一个都接收到完整模型的副本,并且在每一个训练数据批次(training data batch)的三分之一中进行训练。
import mxnet as mx
# Single GPU
module = mx.module.Module(context=mx.gpu(0))
# Train on multiple GPUs
module = mx.module.Module(context=[mx.gpu(i) for i in range(N)], ...)
2. 在多台计算机上进行训练
MXNet 是一种分布式深度学习框架,用于简化在单一服务器或多个服务器中进行的多 GPU 训练。为了用多个服务器进行训练,你需要在所有计算机上安装 MXNet ,确保它们之间可以通过 SSH 进行交流,随后创建一个包含服务器 IP 的文件。
$ cat hosts
192.30.0.172
192.30.0.171
python ../../tools/launch.py -n 2 --launcher ssh -H hosts python train_mnist.py --network lenet --kv-store dist_sync
MXNet 使用键值存储(key-value store)以在不同机器间对梯度和参数进行同步处理。这使得你可以进行分布式训练,并且确保可以使用 USE_DIST_KVSTORE=1 对 MXNet 进行编译。
3. 在 Amazon S3 中存储自定义数据迭代器和迭代数据
在 MXNet 中,除了要返回一批数据,以作为包含 “n” 个有相关标注的训练数据的 DataBatch 对象(https://github.com/dmlc/mxnet/blob/master/python/mxnet/io.py)以外,数据迭代器与 Python 迭代器目标是相似的。MXNet 对 NDArray 和 CSV 这样的一般数据类型会运用预生成和高效的数据迭代器。对于分布式文件系统上的高效 I/O,它也有一种二进制格式,比如 HDFS 。
你可以通过扩展 mx.io.DataIter 类目以创建自定义数据迭代器。关于如何对此特征进行实施,可参阅此教程(http://mxnet.io/tutorials/basic/data.html#custom-iterator)。
data_iter = mx.io.ImageRecordIter(
path_imgrec="s3://bucket-name/training-data/caltech_train.rec",
data_shape=(3, 227, 227),
batch_size=4,
resize=256)
4. 神经网络可视化
为了使你能够对神经网络架构进行可视化,MXNet 可与 Graphviz(http://www.graphviz.org/)进行集成。为了生成网络可视化结果,你可以使用 symbol (查询被定义网络的最后一层),和被它的 node_atters 属性所定义的网络的形状。下面的实例展示了怎样对 LeNet (http://yann.lecun.com/exdb/lenet/)标准 CNN进行可视化:
mx.viz.plot_network(symbol=lenet, shape=shape)
详细代码和执行指令参阅此教程(https://github.com/dmlc/mxnet-notebooks/blob/master/python/tutorials/mnist.ipynb)。
5. 支持分析工具
MXNet 有一个内置分析工具,你可通过用 USE_PROFILER=1 标志创建 MXNet 来使用它。这可以帮助你在网络中(符号级)一层一层地对执行时间进行概述。这一特征是在操作层级进行归纳的,而不是在函数级,核级(kernel)或指令级进行操作,从而对一般的分析工具(像 nvprof 和 gprof)进行了补足。你可以使用一个环境变量以在整体 Python 程序中对它进行驱动。或者,你可以通过将它整合进下列代码,以在程序的一个子集中对它进行使用。
mx.profiler.profiler_set_config(mode='all', filename='output.json')
mx.profiler.profiler_set_state('run')
#Code to be profiled goes here...
mx.profiler.profiler_set_state('stop')
你可以将分析工具的输出上传到浏览器上,比如 Chrome,并且通过导航到浏览器追踪(tracing)(chrome://tracing)来查看配置文件,如下图所示:
此屏幕快照展示了在 MXNet 中执行的原始 LeNet 架构 MNIST 训练数据集的配置文件。
速查表
现在你已经知道了 MXNet 的一些独有特征,你可能已经迫不及待要上手尝试了。这张速查表(https://s3.amazonaws.com/aws-bigdata-blog/artifacts/apache_mxnet/apache-mxnet-cheat.pdf)可以帮助你开始创建神经网络。它包含一些 CNN,RNN/LSTM,线性回归和逻辑回归的常用架构。使用它就可以学习如何创建数据迭代器和 Amazon S3 迭代器,执行点校验(checkpointing)和保存模型文件。它甚至包含了如何创建一个完整模型架构,以及如何精调一个预训练模型的实例。
想要用 MXNet 开始进行深度学习,可参阅教程 http://mxnet.io/tutorials/index.html 。