O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Chainer でのプロファイリングをちょっと楽にする話

1.487 visualizações

Publicada em

2019 年 3 月 30 日 (土) に Preferred Networks のオフィスにて開催した Chainer Meetup #09 にて、エヌビディア 山崎が発表した「Chainer でのプロファイリングをちょっと楽にする話」のスライドです。
https://chainer.connpass.com/event/120796/

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Chainer でのプロファイリングをちょっと楽にする話

  1. 1. Kazuhiro Yamasaki, Deep Learning Solution Architect, NVIDIA Chainer Meetup #09, 03/30/2019 CHAINERでのプロファイリングを ちょっと楽にする話
  2. 2. 2 (毎度おなじみ) 今日もあります 128 nodes
  3. 3. 3 自己紹介 • 名前: 山崎和博(やまさき かずひろ) • 仕事: ディープラーニングとGPUに関することをだいたいなんでも • 初めて触ったフレームワーク: Chainer • 初めて触ったChainerのバージョン: v1.3 (か1.4) • 趣味: ラテンジャズ(自宅にコンガx3……置き場所……) 謎のAI半導体メーカーの中の人
  4. 4. 4 突然ですが…… 前回のおさらい プロファイラを使うとボトルネックを解消して高速化! https://www.slideshare.net/NVIDIAJapan/chainer-tensor-fp16 より
  5. 5. 5 プロファイラを使ってみる 自分のコードをnvprofにかけてnvvpで可視化 ……なるほど?
  6. 6. 6 AGENDA DL on GPUのプロファイリング Chainer利用時のVisual Profilerをちょっと見やすく 実際に使ってみる
  7. 7. 7 GPUの性能を引き出すために ディープラーニングは総合格闘技 Memory Memory Disk 2. データIO 3. CUDAカーネルの 非効率な発行 などなど…… 1. CPU-GPU間の データ転送 4. GPU間の データ転送 5. ノード間の データ転送 6. GPUメモリの キャッシュミス
  8. 8. 8 NVIDIA VISUAL PROFILER / NVIDIA NSIGHT GPUでの処理をプロファイルできるツール ※ Note that Visual Profiler and nvprof will be deprecated in a future CUDA release.
  9. 9. 9 NVPROF & NVIDIA VISUAL PROFILER How to use CPU-GPU間データ 転送が可視化 それぞれの詳細も 確認できる タイムライン的に 各処理が表示 コマンド例)nvprof –o file.nvvp python main.py ...
  10. 10. 10 ディープラーニングの場合 冒頭の例を参考に
  11. 11. 11 ディープラーニングの場合 冒頭の例を参考に 1 iteration ミニバッチの データ転送
  12. 12. 12 ディープラーニングの場合 冒頭の例を参考に 1 iteration ミニバッチの データ転送 これ以上調べようとすると ちょっと大変
  13. 13. 13 ディープラーニング向けのプロファイリングツール NVIDIA Deep Learning Profiler (coming soon...) S9339 - Profiling Deep Learning Networks 資料等は、後日GTC On-Demandで 公開される予定 残念ながら最初は TensorFlowへのサポートのみ……
  14. 14. 14 ということで作りました プロファイル結果を見やすくするツール chainer_profutil https://github.com/lazykyama/chainer_profutil
  15. 15. 15 何ができるの? Forward/Backward/UpdateとIteration全体にマーカーをつけます これ↓が こうなる→
  16. 16. 16 どうやって使う? How to apply optimizer = chainer.optimizers.Adam(alpha=0.001) optimizer.setup(model) Before from chainer_profutil import create_marked_profile_optimizer optimizer = create_marked_profile_optimizer( chainer.optimizers.Adam(alpha=0.001), sync=True) optimizer.setup(model) After 変更後、普通にnvprofでプロファイルを取る nvprof –o file.nvvp python main.py --iter 5 ...
  17. 17. 17 ちなみに…… CuPyのNVTX対応機能で実装 • プロファイラの拡張機能に、タイムラインへマーカーを付与する機能 • NVIDIA Tools Extension API (NVTX) の一部 https://docs.nvidia.com/cuda/profiler-users-guide/index.html#nvtx • nvtxRangePush()/nvtxRangePop()などの関数を使ってマーカーを付与 • CuPyはこれをサポート • TimeRangeDecoratorやtime_range()など https://docs- cupy.chainer.org/en/stable/reference/generated/cupy.prof.TimeRangeDecorator.html
  18. 18. 18 実際の利用例 独自Functionの実装を高速化 ある日twitterを眺めていたらこんなツイートが…… 高速化に協力できるのでは? Thanks @maguroIsland san!!
  19. 19. 19 実際の利用例 独自Functionの実装を高速化 早速手元のGPUで試したところ…… 1800 epochs, 10 iterごとにログ出力 確かに時間かかる
  20. 20. 20 実際の利用例 独自Functionの実装を高速化 nvidia-smiで稼働状況チェック いくらなんでも 低い……
  21. 21. 21 実際の利用例 独自Functionの実装を高速化 とりあえずnvprofで詳細確認 1 iteration: ~1.3sec.
  22. 22. 22 実際の利用例 独自Functionの実装を高速化 マーカー付与 optimizer = chainer.optimizers.NesterovAG(lr=0.1) Before from chainer_profutil import create_marked_profile_optimizer # ... optimizer = create_marked_profile_optimizer( chainer.optimizers.NesterovAG(lr=0.1), sync=True, sync_level=2) After
  23. 23. 23 実際の利用例 独自Functionの実装を高速化 改めてnvprofで確認 1 iteration Forwardが遅い (し、途中やたら長い処理がある)
  24. 24. 24 実際の利用例 独自Functionの実装を高速化 実装を確認 Functionを継承した 独自関数 chainer_profutilは FunctionNodeにマーカー付与するので ShakeDropは表示されてなかった
  25. 25. 25 実際の利用例 独自Functionの実装を高速化 CuPyのTimeRangeDecoratorを手動設定 forward()にも マーカーが付くようになる
  26. 26. 26 実際の利用例 独自Functionの実装を高速化 再びnvprofで確認 1 iteration 明るい緑が ShakeDrop.forward
  27. 27. 27 実際の利用例 独自Functionの実装を高速化 一部を拡大して見る GPU側の処理がスカスカ かつ、カーネル発行が多い
  28. 28. 28 実際の利用例 独自Functionの実装を高速化 ソースコードを改めて確認する ループの毎回 カーネルが発行される バッチサイズで ループの回数が決まる
  29. 29. 29 実際の利用例 独自Functionの実装を高速化 ソースコードを改善 まとめて乱数生成し broadcastがうまく動くよう調整
  30. 30. 30 実際の利用例 独自Functionの実装を高速化 しつこくnvprofで確認 1 iteration: ~0.3sec.
  31. 31. 31 実際の利用例 独自Functionの実装を高速化 nvprofを外して実行 1800 epochs, 10 iterごとにログ出力 9日以上だったのが 約2日に改善 $ nvidia-smi -i 1 --query-gpu=index,utilization.gpu,memory.used,memory.total --format=csv -l 1 index, utilization.gpu [%], memory.used [MiB], memory.total [MiB] 1, 100 %, 6599 MiB, 12196 MiB 1, 98 %, 6599 MiB, 12196 MiB 1, 100 %, 6599 MiB, 12196 MiB 1, 100 %, 6599 MiB, 12196 MiB 1, 100 %, 6599 MiB, 12196 MiB 1, 100 %, 6599 MiB, 12196 MiB GPU使用率は 高い水準でキープ
  32. 32. 32 まとめ • プロファイルをちょっと楽にすべく、forward/backward/updateなど の場所をわかりやすくするツールを作った • chainer_profutil: https://github.com/lazykyama/chainer_profutil • 実行効率悪いときにプロファイルして修正すると、数倍程度改善さ れる可能性あり • Don’t worry about thinking, just measure! プロファイリングは大事
  33. 33. 33 GTC2019 先々週まで開催 https://www.nvidia.com/en-us/gtc/ https://youtu.be/C4ouIyYE-ms まとめ動画 http://bit.ly/gtc19news 瓦版

×