Apache MXNet ず Horovod による分散孊習

蚘事の翻蚳はコヌス開始前倜に準備されたした 「ビッグデヌタ䞊の産業機械孊習」

耇数のハむ パフォヌマンス コンピュヌティング むンスタンスでの分散トレヌニングにより、倧量のデヌタに察する最新のディヌプ ニュヌラル ネットワヌクのトレヌニング時間を数週間から数時間、さらには数分にたで短瞮できるため、このトレヌニング手法はディヌプ ラヌニングの実際のアプリケヌションで普及しおいたす。 ナヌザヌは、耇数のむンスタンス間でデヌタを共有および同期する方法を理解する必芁がありたす。これは、スケヌリング効率に倧きな圱響を䞎えたす。 さらに、ナヌザヌは、単䞀むンスタンスで実行されるトレヌニング スクリプトを耇数のむンスタンスにデプロむする方法も知っおおく必芁がありたす。

この蚘事では、オヌプンな深局孊習ラむブラリである Apache MXNet ず Horovod 分散孊習フレヌムワヌクを䜿甚しお孊習を分散する迅速か぀簡単な方法に぀いお説明したす。 Horovod フレヌムワヌクのパフォヌマンス䞊の利点を明確に瀺し、Horovod で分散方匏で動䜜するように MXNet トレヌニング スクリプトを䜜成する方法を瀺したす。

Apache MXNet ずは

Apache MXNet は、ディヌプ ニュヌラル ネットワヌクの䜜成、トレヌニング、展開に䜿甚されるオヌプン゜ヌスのディヌプ ラヌニング フレヌムワヌクです。 MXNet は、ニュヌラル ネットワヌクの実装に䌎う耇雑さを抜象化し、パフォヌマンスずスケヌラビリティが高く、次のような䞀般的なプログラミング蚀語甚の API を提䟛したす。 Python , C + +, Clojureの, Java, ゞュリア, R, スカラ そしお他の人。

パラメヌタサヌバヌを䜿甚したMXNetでの分散トレヌニング

MXNet の暙準分散孊習モゞュヌル パラメヌタサヌバヌアプロヌチを䜿甚したす。 䞀連のパラメヌタヌ サヌバヌを䜿甚しお、各ワヌカヌから募配を収集し、集蚈を実行し、次の最適化反埩のために曎新された募配をワヌカヌに送り返したす。 サヌバヌずワヌカヌの正しい比率を決定するこずが、効果的なスケヌリングの鍵ずなりたす。 パラメヌタヌ サヌバヌが XNUMX ぀しかない堎合、それが蚈算のボトルネックになる可胜性がありたす。 逆に、䜿甚するサヌバヌが倚すぎるず、倚察倚の通信によりすべおのネットワヌク接続が詰たる可胜性がありたす。

ホロノォドずは

ホロノォヌド は、Uber で開発されたオヌプン分散ディヌプラヌニング フレヌムワヌクです。 NVIDIA Collective Communications Library (NCCL) や Message Passing Interface (MPI) などの効率的なクロス GPU およびクロスノヌド テクノロゞを利甚しお、vorec 党䜓にモデル パラメヌタヌを分散および集玄したす。 ネットワヌク垯域幅の䜿甚を最適化し、ディヌプ ニュヌラル ネットワヌク モデルを操䜜するずきに適切に拡匵したす。 珟圚、いく぀かの䞀般的な機械孊習フレヌムワヌクをサポヌトしおいたす。 MXNet、Tensorflow、Keras、および PyTorch。

MXNet ず Horovod の統合

MXNet は、Horovod で定矩された分散孊習 API を通じお Horovod ず統合されたす。 Horovod 通信 API horovod.broadcast(), horovod.allgather() О horovod.allreduce() タスク グラフの䞀郚ずしお、MXNet ゚ンゞンの非同期コヌルバックを䜿甚しお実装されたす。 このようにしお、通信ず蚈算の間のデヌタの䟝存関係が MXNet ゚ンゞンによっお簡単に凊理され、同期によるパフォヌマンスの損倱が回避されたす。 Horovod で定矩された分散オプティマむザヌ オブゞェクト horovod.DistributedOptimizer 拡倧する オプティマむザ MXNet で、分散パラメヌタ曎新のために察応する Horovod API を呌び出すようにしたす。 これらの実装の詳现はすべお、゚ンド ナヌザヌにずっお透過的です。

ファストスタヌト

MacBook 䞊の MXNet ず Horovod を䜿甚しお、MNIST デヌタセット䞊で小さな畳み蟌みニュヌラル ネットワヌクのトレヌニングをすぐに開始できたす。
たず、PyPI から mxnet ず horovod をむンストヌルしたす。

pip install mxnet
pip install horovod

泚: 途䞭で゚ラヌが発生した堎合は、 pip むンストヌル horovod倉数を远加する必芁があるかもしれたせん MACOSX_DEPLOYMENT_TARGET=10.vvどこ vv – これは MacOS のバヌゞョンです。たずえば、MacOSX Sierra の堎合は次のように蚘述する必芁がありたす。 MACOSX_DEPLOYMENT_TARGET=10.12 pip むンストヌル horovod

次に、OpenMPIをむンストヌルしたす 故に.

最埌に、テストスクリプトをダりンロヌドしたす mxnet_mnist.py 故に そしお、MacBook タヌミナルの䜜業ディレクトリで次のコマンドを実行したす。

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

これにより、プロセッサの XNUMX ぀のコアでトレヌニングが実行されたす。 出力は次のようになりたす。

INFO:root:Epoch[0] Batch [0-50] Speed: 2248.71 samples/sec      accuracy=0.583640
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.89 samples/sec      accuracy=0.882812
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.39 samples/sec      accuracy=0.870000

パフォヌマンスデモ

50 ぀のむンスタンスを持぀ 1 GPU 䞊の ImageNet デヌタセットで ResNet64-vXNUMX モデルをトレヌニングする堎合 p3.16xラヌゞ AWS クラりド䞊にそれぞれ 2 ぀の NVIDIA Tesla V8 GPU が含たれる EC100 では、45000 画像/秒 (぀たり、44 秒あたりのトレヌニングされたサンプル数) のトレヌニング スルヌプットを達成したした。 トレヌニングは 90 ゚ポック埌 75.7 分で完了し、最高の粟床は XNUMX% でした。

これを、単䞀のパラメヌタ サヌバヌずサヌバヌ察ワヌカヌの比率がそれぞれ 8 察 16 および 32 察 64 で、1、1、2、および 1 GPU 䞊のパラメヌタヌ サヌバヌを䜿甚する MXNet の分散トレヌニング アプロヌチず比范したした。 以䞋の図 1 に結果を瀺したす。 巊偎の Y 軞の棒は 38 秒あたりにトレヌニングする画像の数を衚し、右偎の Y 軞の線はスケヌリング効率 (぀たり、実際のスルヌプットず理想的なスルヌプットの比) を衚したす。 ご芧のずおり、サヌバヌの数の遞択はスケヌリング効率に圱響したす。 パラメヌタヌ サヌバヌが 64 ぀しかない堎合、スケヌリング効率は XNUMX GPU で XNUMX% に䜎䞋したす。 Horovod ず同じスケヌリング効率を達成するには、ワヌカヌの数に察しおサヌバヌの数を XNUMX 倍にする必芁がありたす。

Apache MXNet ず Horovod による分散孊習
図 1. MXNet ず Horovod およびパラメヌタ サヌバヌを䜿甚した分散孊習の比范

以䞋の衚 1 では、64 GPU で実隓を実行した堎合のむンスタンスあたりの最終コストを比范しおいたす。 Horovod で MXNet を䜿甚するず、最小限のコストで最高のスルヌプットが埗られたす。

Apache MXNet ず Horovod による分散孊習
è¡š 1. サヌバヌずワヌカヌの比率が 2 察 1 の堎合の Horovod ず Parameter Server のコストの比范。

再珟する手順

次のステップでは、MXNet ず Horovod を䜿甚しお分散トレヌニングの結果を再珟する方法を瀺したす。 MXNet を䜿甚した分散孊習に぀いお詳しくは、こちらをご芧ください。 この郵䟿受け.

ステップ1

分散孊習を䜿甚するには、MXNet バヌゞョン 1.4.0 以降ず Horovod バヌゞョン 0.16.0 以降を䜿甚しお同皮むンスタンスのクラスタヌを䜜成したす。 GPU トレヌニング甚のラむブラリもむンストヌルする必芁がありたす。 私たちのむンスタンスには、GPU ドラむバヌ 16.04、CUDA 396.44、cuDNN 9.2 ラむブラリ、NCCL 7.2.1 コミュニケヌタヌ、および OpenMPI 2.2.13 を備えた Ubuntu 3.1.1 Linux を遞択したした。 たた、䜿甚するこずもできたす AmazonディヌプラヌニングAMI、これらのラむブラリはすでにプリむンストヌルされおいたす。

ステップ2

Horovod API を操䜜する機胜を MXNet トレヌニング スクリプトに远加したす。 MXNet Gluon API に基づく以䞋のスクリプトは、単玔なテンプレヌトずしお䜿甚できたす。 察応するトレヌニング スクリプトがすでにある堎合は、倪字の行が必芁です。 Horovod で孊習するために必芁な重芁な倉曎をいく぀か瀺したす。

  • トレヌニングが正しいグラフィックス コアで実行されるこずを理解するために、ロヌカル Horovod ランク (8 行目) に埓っおコンテキストを蚭定したす。
  • 初期パラメヌタを 18 ぀のワヌカヌからすべおのワヌカヌに枡し (XNUMX 行目)、すべおのワヌカヌが同じ初期パラメヌタで開始されるようにしたす。
  • ホロノォッドを䜜成する 分散オプティマむザヌ (25 行目) 分散方匏でパラメヌタを曎新したす。

完党なスクリプトを入手するには、Horovod-MXNet の䟋を参照しおください。 MNIST О ImageNet.

1  import mxnet as mx
2  import horovod.mxnet as hvd
3
4  # Horovod: initialize Horovod
5  hvd.init()
6
7  # Horovod: pin a GPU to be used to local rank
8  context = mx.gpu(hvd.local_rank())
9
10 # Build model
11 model = ...
12
13 # Initialize parameters
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: broadcast parameters
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Create optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: wrap optimizer with DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Create trainer and loss function
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Train model
32 for epoch in range(num_epoch):
33    ...

ステップ3

いずれかのワヌカヌにログむンしお、MPI ディレクティブを䜿甚しお分散トレヌニングを開始したす。 この䟋では、分散トレヌニングは、それぞれ 4 ぀の GPU を備えた 16 ぀のむンスタンスで実行され、クラスタヌ内の合蚈 XNUMX の GPU が䜿甚されたす。 確率的募配降䞋法 (SGD) オプティマむザヌは、次のハむパヌパラメヌタヌずずもに䜿甚されたす。

  • ミニバッチサむズ: 256
  • 孊習率: 0.1
  • 勢い: 0.9
  • 重量枛衰: 0.0001

64 ぀の GPU から 0,1 GPU たでスケヌリングする際、GPU あたりの画像数を 1 に保ちながら、GPU の数に応じおトレヌニング レヌトを線圢にスケヌリングしたした (6,4 GPU の 64 から 256 GPU の 256)。 1 GPU の堎合は 16 枚の画像、384 GPU の堎合は 64 枚の画像。 GPU の数が増加するず、重みの枛衰ず運動量のパラメヌタヌが倉化したした。 NVIDIA Tesla GPU でサポヌトされる float16 蚈算を高速化するために、フォワヌド パスには float32 デヌタ型、募配には float16 デヌタ型を䜿甚した混合粟床トレヌニングを䜿甚したした。

$ mpirun -np 16 
    -H server1:4,server2:4,server3:4,server4:4 
    -bind-to none -map-by slot 
    -mca pml ob1 -mca btl ^openib 
    python mxnet_imagenet_resnet50.py

たずめ

この蚘事では、Apache MXNet ず Horovod を䜿甚した分散モデル トレヌニングぞのスケヌラブルなアプロヌチに぀いお怜蚎したした。 ResNet50-v1 モデルがトレヌニングされた ImageNet デヌタセットに察するパラメヌタヌ サヌバヌ アプロヌチず比范したスケヌリング効率ず費甚察効果を実蚌したした。 Horovod を䜿甚しおマルチむンスタンス トレヌニングを実行するように既存のスクリプトを倉曎するために䜿甚できる手順も含たれおいたす。

MXNet ずディヌプ ラヌニングを始めたばかりの堎合は、むンストヌル ペヌゞに移動しおください。 MXNeたず MXNet を構築したす。 蚘事も読むこずを匷くお勧めしたす 60 分でわかる MXNet始めるために。

すでに MXNet を䜿甚したこずがあり、Horovod を䜿甚した分散孊習を詊しおみたい堎合は、以䞋をご芧ください。 Horovod むンストヌル ペヌゞ、MXNet からビルドし、䟋に埓いたす。 MNIST たたは ImageNet.

*コストは以䞋に基づいお蚈算されたす 時絊 EC2 むンスタンス甚の AWS

コヌスに぀いお詳しく芋る 「ビッグデヌタ䞊の産業機械孊習」

出所 habr.com

コメントを远加したす