翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Chainer
注記
v28 から、 AWS Deep Learning AMI には Chainer Conda 環境は含まれなくなっています。 AWS Deep Learning AMI これらの環境を含む以前のリリースは引き続きご利用いただけます。ただし、オープンソースコミュニティによってこれらのフレームワークのセキュリティ修正が公開されている場合にのみ、これらの環境の更新を提供します。
Chainer
次のトピックでは、複数の GPU、単一の GPU および CPU でのトレーニング、視覚化の作成、および Chainer インストールをテストする方法を説明します。
トピック
Chainer におけるトレーニングモデル
このチュートリアルでは、MNIST データセットでモデルをトレーニングする Chainer スクリプトの例を使用する方法を説明します。MNIST は、画像認識モデルのトレーニングによく使用される手書き数字のデータベースです。また、このチュートリアルでは、CPU と 1 つ以上の GPU におけるトレーニングのトレーニング速度の違いについても説明します。
Chainer を使用して複数の GPU でトレーニングする
複数の GPU でトレーニングするには
-
Deep Learning AMI with Conda を実行しているインスタンスに接続します。インスタンスを選択または接続する方法については、DLAMI のインスタンスタイプを選択するまたは Amazon EC2 のドキュメントを参照してください。このチュートリアルを実行するには、少なくとも 2 つの GPU を持つインスタンスを使用します。
-
Python 3 Chainer 環境を有効化します。
$
source activate chainer_p36 -
最新のチュートリアルを取得して 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 -
train_mnist_data_parallel.py
スクリプトの例を実行します。デフォルトでは、スクリプトは Deep Learning AMI with 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
-
トレーニングを実行中に、GPU の使用率を参照することは便利です。どの GPU がアクティブであるかを確認でき、その負荷を表示できます。NVIDIA は、このためのコマンド
nvidia-smi
を実行できるツールを提供しています。ただし、これは使用率のスナップショットのみを示すため、これと Linux コマンドwatch
を組み合わせることでより多くの情報を取得できます。次のコマンドでは、watch
をnvidia-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 ごとにメモリ使用率を確認することもできます。
-
トレーニングが完了したら、最初のターミナルセッションの経過時間を書き留めます。この例では、経過時間は 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=0GPU: 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 は自動的に結果、グラフの損失および正確性をログに記録し、計算グラフのプロットに出力を実行します。
計算グラフを生成するには
-
トレーニングの実行が終了したら、
result
ディレクトリに移動して、実行の正確性および損失を自動的に生成される 2 つの画像で表示できます。今すぐ移動し、内容を一覧表示します。(chainer_p36) :~/src/chainer/examples/mnist$
cd result(chainer_p36) :~/src/chainer/examples/mnist/result$
lsresult
ディレクトリには、accuracy.png
とloss.png
の .png 形式の 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
次の画像は、正確性、損失および計算グラフのそれぞれの例です。
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
例フォルダには、より多くの例があります。実行して、そのパフォーマンスを試してください。