AWS 部落格:一張速查表實現 Apache MXNet 深度學習框架五大特徵的開發利用

ZhuZhiboSmith發表於2017-07-31

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進行視覺化:

AWS 部落格:一張速查表實現 Apache MXNet 深度學習框架五大特徵的開發利用

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)來檢視配置檔案,如下圖所示:


AWS 部落格:一張速查表實現 Apache MXNet 深度學習框架五大特徵的開發利用

此螢幕快照展示了在 MXNet 中執行的原始 LeNet 架構 MNIST 訓練資料集的配置檔案。

速查表


AWS 部落格:一張速查表實現 Apache MXNet 深度學習框架五大特徵的開發利用

現在你已經知道了 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 。

相關文章