Chainer - Deep Learning AMI

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

Chainer

Chainer は、簡単で直観的に複雑なニューラルネットワークアーキテクチャを記述するための柔軟性のある Python ベースのフレームワークです。Chainer は、トレーニングにおけるマルチ GPU インスタンスの使用を簡単にします。また、Chainer は自動的に結果、グラフの損失および正確性をログに記録し、計算グラフ でニューラルネットワークを視覚化するための出力を実行します。これは Deep Learning AMI と Conda (Conda の DLAMI) に含まれています。

次のトピックでは、複数の GPU、単一の GPU および CPU でのトレーニング、視覚化の作成、および Chainer インストールをテストする方法を説明します。

Chainer におけるトレーニングモデル

このチュートリアルでは、MNIST データセットでモデルをトレーニングする Chainer スクリプトの例を使用する方法を説明します。MNIST は、画像認識モデルのトレーニングによく使用される手書き数字のデータベースです。また、このチュートリアルでは、CPU と 1 つ以上の GPU におけるトレーニングのトレーニング速度の違いについても説明します。

Chainer を使用して複数の GPU でトレーニングする

複数の GPU でトレーニングするには

  1. Deep Learning AMI と Conda を実行中のインスタンスに接続します。インスタンスを選択または接続する方法については、「DLAMI のインスタンスタイプを選択する」または「Amazon EC2 ドキュメント」を参照してください。このチュートリアルを実行するには、少なくとも 2 つの GPU を持つインスタンスを使用します。

  2. Python 3 Chainer 環境を有効化します。

    $ source activate chainer_p36
  3. 最新のチュートリアルを取得して Chainer レポジトリをクローンするには、例フォルダに移動します。

    (chainer_p36) :~$ cd ~/src (chainer_p36) :~/src$ CHAINER_VERSION=v$(python -c "import chainer; print(chainer.__version__)") (chainer_p36) :~/src$ git clone -b $CHAINER_VERSION https://github.com/chainer/chainer.git (chainer_p36) :~/src$ cd chainer/examples/mnist
  4. train_mnist_data_parallel.py スクリプトの例を実行します。デフォルトでは、スクリプトは Deep Learning AMI と Conda のインスタンスで実行されている GPU を使用します。このスクリプトは、最大 2 つの GPU 上で実行することができます。2 つを超える GPU は無視されます。1 つあるいは 2 つを自動的に検出します。GPU のないインスタンスを実行している場合には、このチュートリアルの Chainer を使用して CPU でトレーニングする にスキップしてください。

    (chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist_data_parallel.py
    注記

    この例では、ベータ機能の組み込みが DLAMI に含まれていないため、次のエラーを返します。

    chainerx ModuleNotFoundError: No module named 'chainerx'

    Chainer スクリプトが MNIST データベースをトレーニング中に、各エポックごとの結果を表示できます。

    次に、スクリプトが実行する例の出力が表示されます。次の出力例は、p3.8xlarge インスタンスで実行されました。スクリプトの出力は「GPU: 0, 1」と表示され、これは利用可能な 4 つの GPU の最初の 2 つを使用したことを示しています。このスクリプトは通常の場合、合計数の代わりにゼロで始まる GPU のインデックスを使用します。

    GPU: 0, 1 # unit: 1000 # Minibatch-size: 400 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.277561 0.114709 0.919933 0.9654 6.59261 2 0.0882352 0.0799204 0.973334 0.9752 8.25162 3 0.0520674 0.0697055 0.983967 0.9786 9.91661 4 0.0326329 0.0638036 0.989834 0.9805 11.5767 5 0.0272191 0.0671859 0.9917 0.9796 13.2341 6 0.0151008 0.0663898 0.9953 0.9813 14.9068 7 0.0137765 0.0664415 0.995434 0.982 16.5649 8 0.0116909 0.0737597 0.996 0.9801 18.2176 9 0.00773858 0.0795216 0.997367 0.979 19.8797 10 0.00705076 0.0825639 0.997634 0.9785 21.5388 11 0.00773019 0.0858256 0.9978 0.9787 23.2003 12 0.0120371 0.0940225 0.996034 0.9776 24.8587 13 0.00906567 0.0753452 0.997033 0.9824 26.5167 14 0.00852253 0.082996 0.996967 0.9812 28.1777 15 0.00670928 0.102362 0.997867 0.9774 29.8308 16 0.00873565 0.0691577 0.996867 0.9832 31.498 17 0.00717177 0.094268 0.997767 0.9802 33.152 18 0.00585393 0.0778739 0.998267 0.9827 34.8268 19 0.00764773 0.107757 0.9975 0.9773 36.4819 20 0.00620508 0.0834309 0.998167 0.9834 38.1389
  5. トレーニングを実行中に、GPU の使用率を参照することは便利です。どの GPU がアクティブであるかを確認でき、その負荷を表示できます。NVIDIA は、このためのコマンド nvidia-smi を実行できるツールを提供しています。ただし、これは使用率のスナップショットのみを示すため、これと Linux コマンド watch を組み合わせることでより多くの情報を取得できます。次のコマンドでは、watchnvidia-smi で使用して、10 秒ごとに GPU の現在の使用率を更新します。DLAMI に別のターミナルセッションを開き、次のコマンドを実行します。

    (chainer_p36) :~$ watch -n0.1 nvidia-smi

    以下のような出力結果が表示されるはずです。ctrl-c を使用してツールを閉じるか、最初のターミナルセッションでほかの例を試す間、実行を継続します。

    Every 0.1s: nvidia-smi Wed Feb 28 00:28:50 2018 Wed Feb 28 00:28:50 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 384.111 Driver Version: 384.111 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:1B.0 Off | 0 | | N/A 46C P0 56W / 300W | 728MiB / 16152MiB | 10% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | 0 | | N/A 44C P0 53W / 300W | 696MiB / 16152MiB | 4% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla V100-SXM2... On | 00000000:00:1D.0 Off | 0 | | N/A 42C P0 38W / 300W | 10MiB / 16152MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 | | N/A 46C P0 40W / 300W | 10MiB / 16152MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 54418 C python 718MiB | | 1 54418 C python 686MiB | +-----------------------------------------------------------------------------+

    この例では、GPU 0 と GPU 1 はアクティブですが、GPU 2 と 3 はアクティブではありません。GPU ごとにメモリ使用率を確認することもできます。

  6. トレーニングが完了したら、最初のターミナルセッションの経過時間を書き留めます。この例では、経過時間は 38.1389 秒です。

Chainer を使用して単一の GPU でトレーニングする

この例は、単一の GPU でトレーニングする方法を示します。これは、1 つの GPU のみが利用可能である場合、または マルチ GPU トレーニングが Chainer でどのようにスケーリングされるかを確認する場合に実行します。

Chainer を使用して単一の GPU でトレーニングするには

  • この例では、別のスクリプトである train_mnist.py を使用して、--gpu=0 引数で GPU 0 のみを使用するように指示します。nvidia-smi コンソールでアクティブな異なる GPU を確認するには、--gpu=1 を使用して GPU 番号 1 を使用するようにスクリプトに指示できます。

    (chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist.py --gpu=0
    GPU: 0 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.192348 0.0909235 0.940934 0.9719 5.3861 2 0.0746767 0.069854 0.976566 0.9785 8.97146 3 0.0477152 0.0780836 0.984982 0.976 12.5596 4 0.0347092 0.0701098 0.988498 0.9783 16.1577 5 0.0263807 0.08851 0.991515 0.9793 19.7939 6 0.0253418 0.0945821 0.991599 0.9761 23.4643 7 0.0209954 0.0683193 0.993398 0.981 27.0317 8 0.0179036 0.080285 0.994149 0.9819 30.6325 9 0.0183184 0.0690474 0.994198 0.9823 34.2469 10 0.0127616 0.0776328 0.996165 0.9814 37.8693 11 0.0145421 0.0970157 0.995365 0.9801 41.4629 12 0.0129053 0.0922671 0.995899 0.981 45.0233 13 0.0135988 0.0717195 0.995749 0.9857 48.6271 14 0.00898215 0.0840777 0.997216 0.9839 52.2269 15 0.0103909 0.123506 0.996832 0.9771 55.8667 16 0.012099 0.0826434 0.996616 0.9847 59.5001 17 0.0066183 0.101969 0.997999 0.9826 63.1294 18 0.00989864 0.0877713 0.997116 0.9829 66.7449 19 0.0101816 0.0972672 0.996966 0.9822 70.3686 20 0.00833862 0.0899327 0.997649 0.9835 74.0063

    この例では、単一の GPU の実行にほぼ 2 倍の時間がかかっています。 より大きなモデルやより大きなデータセットのトレーニングでは、この例とは異なる結果となるため、GPU のパフォーマンスをさらに評価するために試してみてください。

Chainer を使用して CPU でトレーニングする

ここでは、CPU 専用モードでトレーニングします。引数を使用せずに、同じスクリプトの python train_mnist.py を実行します。

(chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist.py

出力の GPU: -1 は、GPU が使用されていないことを示しています。

GPU: -1 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.192083 0.0918663 0.94195 0.9712 11.2661 2 0.0732366 0.0790055 0.977267 0.9747 23.9823 3 0.0485948 0.0723766 0.9844 0.9787 37.5275 4 0.0352731 0.0817955 0.987967 0.9772 51.6394 5 0.029566 0.0807774 0.990217 0.9764 65.2657 6 0.025517 0.0678703 0.9915 0.9814 79.1276 7 0.0194185 0.0716576 0.99355 0.9808 93.8085 8 0.0174553 0.0786768 0.994217 0.9809 108.648 9 0.0148924 0.0923396 0.994983 0.9791 123.737 10 0.018051 0.099924 0.99445 0.9791 139.483 11 0.014241 0.0860133 0.995783 0.9806 156.132 12 0.0124222 0.0829303 0.995967 0.9822 173.173 13 0.00846336 0.122346 0.997133 0.9769 190.365 14 0.011392 0.0982324 0.996383 0.9803 207.746 15 0.0113111 0.0985907 0.996533 0.9813 225.764 16 0.0114328 0.0905778 0.996483 0.9811 244.258 17 0.00900945 0.0907504 0.9974 0.9825 263.379 18 0.0130028 0.0917099 0.996217 0.9831 282.887 19 0.00950412 0.0850664 0.997133 0.9839 303.113 20 0.00808573 0.112367 0.998067 0.9778 323.852

この例では、MNIST は 323 秒でトレーニングされ、これは 2 つの GPU でのトレーニングより 11 倍以上かかっています。GPU の力が 2 倍であるとしても、この例ではどれだけ効果的であるかがわかります。

結果のグラフ化

また、Chainer は自動的に結果、グラフの損失および正確性をログに記録し、計算グラフのプロットに出力を実行します。

計算グラフを生成するには

  1. トレーニングの実行が終了したら、result ディレクトリに移動して、実行の正確性および損失を自動的に生成される 2 つの画像で表示できます。今すぐ移動し、内容を一覧表示します。

    (chainer_p36) :~/src/chainer/examples/mnist$ cd result (chainer_p36) :~/src/chainer/examples/mnist/result$ ls

    result ディレクトリには、accuracy.pngloss.png の .png 形式の 2 つのファイルがあります。

  2. グラフを表示するには、scp コマンドを使用してこの 2 つをローカルコンピューターにコピーします。

    macOS ターミナルでは、次の scp コマンドを実行して 3 つのファイルすべてを Downloads フォルダーにダウンロードします。キーファイルの場所のプレースホルダ―とサーバーアドレスを使用する情報で置き換えます。他のオペレーティングシステムの場合は、適切な scp コマンド形式を使用します。Amazon Linux AMI の場合は、ユーザー名は ec2-user であることに注意してください。

    (chainer_p36) :~/src/chainer/examples/mnist/result$ scp -i "your-key-file.pem" ubuntu@your-dlami-address.compute-1.amazonaws.com:~/src/chainer/examples/mnist/result/*.png ~/Downloads

次の画像は、正確性、損失および計算グラフのそれぞれの例です。


                MNIST トレーニング正確性

                MNIST トレーニング損失

                MNIST トレーニング計算グラフ

Chainer のテスト

Chainer をテストして、GPU が事前インストールされているテストスクリプトをサポートするかを確認するには、次のコマンドを実行します。

(chainer_p36) :~/src/chainer/examples/mnist/result$ cd ~/src/bin (chainer_p36) :~/src/bin$ ./testChainer

これで Chainer ソースコードがダウンロードされ、Chainer マルチ GPU MNIST の例を実行します。

詳細

Chainer についての詳細は、「Chainer ドキュメントウェブサイト」を参照してください。Chainer 例フォルダには、より多くの例があります。実行して、そのパフォーマンスを試してください。