Neural Network LibrariesのImageNet Datasetを用いた Exampleの実行手順 ~Multi GPUの分散学習による高速化も実現~

2018年10月19日 金曜日

Examples , チュートリアル

Posted by gomi

Neural Network Libraries version1.0リリースに合わせ、ImageNet学習のExampleも更新いたしました。現在、ImageNet学習のExampleはSingle GPUでの学習はもちろんのこと、Multi GPUによる分散学習によって高速化も実現しております。本Exampleは、下記で説明する2ステップ程のスクリプトを実行すれば、どなたでも簡単に試すことが可能です。
また、Multi GPUの分散学習によりSingle GPUに比べ、4つのGPUを利用した場合には、ほぼ1/4の時間で処理が完了いたします。

ここでは、ImageNet学習のExampleの実行手順を説明していきます。
下記のImageNet学習のExampleのREADMEを参照して頂いても、同じように実行可能です。
README of ImageNet Example

1. データセットの取得

ImageNetデータセット及びデベロッパーツールの3つのファイル
・ILSVRC2012_img_train.tar(Training images)
・ILSVRC2012_img_val.tar(Validation images)
・ILSVRC2012_devkit_t12.tar.gz(developer tools)
を、下記のImageNetのサイトからダウンロードしてください。
・ImageNetのダウンロードページ
ImageNet Dataset
データの利用には条件がありますので、下記も参照の上、ダウンロードを行ってください。
・ImageNetのサイト
ImageNet main site
なお、本Exampleでは、2012年のデータセット(1000クラス分類)を用いて動作を確認しております。

2.キャッシュファイルの作成

Example実行時のTraining及びValidationデータ読み出し時のディスクI/Oのオーバーヘッドを軽減するために、キャッシュファイルを作成します。なお、学習を始める前にキャッシュファイルは1度作成し、2度目以降の学習には既に作成済みのキャッシュファイルを利用することが可能です。
実行環境にもよりますが、キャッシュファイルの作成には半日から1日程度かかります。
Example実行時には、このキャッシュファイルからデータ(入力)を読み出し処理を行います。
スクリプトの詳細については、下記の内容をご確認ください。

usage: create_cache.py [-h] -D DEVKIT
                       [-W WIDTH] [-H HEIGHT]
                       [-m {trimming,padding}]
                       [-S {True,False}]
                       [-N FILE_CACHE_SIZE]
                       [-C {h5,npy}]
                       [--thinning THINNING]
                       input [input ...] output

positional arguments:
  input                 Source file or directory.
  output                Destination directory.

optional arguments:
  -h, --help            show this help message and exit
  -D DEVKIT, --devkit DEVKIT
                        Devkit filename
  -W WIDTH, --width WIDTH
                        width of output image (default:320)
  -H HEIGHT, --height HEIGHT
                        height of output image (default:320)
  -m {trimming,padding}, --mode {trimming,padding}
                        shaping mode (trimming or padding) (default:trimming)
  -S {True,False}, --shuffle {True,False}
                        shuffle mode if not specified, train:True, val:False. Otherwise specified value will be used for both.
  -N FILE_CACHE_SIZE, --file-cache-size FILE_CACHE_SIZE
                        num of data in cache file (default:100)
  -C {h5,npy}, --cache-type {h5,npy}
                        cache format (h5 or npy) (default:npy)
  --thinning THINNING Thinning rate

このスクリプトは、ImageNetデータのtarアーカイブからデータセットキャッシュディレクトリを作成し、与えられたtarファイルの中身を自動判別してキャッシュを生成します。
本スクリプトの例では、画像サイズを320×320に指定し、キャッシュファイルを作成しております。シャッフルについては、Trainingデータは有効にし、Validationデータは無効にしております。

python create_cache.py \
    -D ImageNet/ILSVRC2012_devkit_t12.tar.gz \
    ImageNet/ILSVRC2012_img_train.tar \
    ImageNet/ILSVRC2012_img_val.tar \
    ImageNet/imagenet-320-320-trimming-npy

スクリプト実行後には、以下のファイルが作成されます。
・ImageNet/imagenet-train-320-320-trimming-npy/synsets_id_name.csv:SYNSET_ID name list.
・ImageNet/imagenet-train-320-320-trimming-npy/synsets_id_word.csv:SYNSET_ID word list.
・ImageNet/imagenet-train-320-320-trimming-npy/train:Cache for training dataset. Shuffled.
・ImageNet/imagenet-train-320-320-trimming-npy/val:Cache for validation dataset. Not shuffled.

3.Single GPUによる実行方法

学習を実行するためのスクリプトは、以下になります。
本例はResNet-34のモデルを用い、batch size:64、accumulate gradient:4と設定し、64×4=256batch毎において、gradientの更新を行います。

python classification.py [-c device id] [-b batch size] [-a accumulate gradient] [-L number of layers] [-T directory of the trainning cache file] [-V "directory of the validation cache file]

ex):

python classification.py -c cudnn -b64 -a4 -L34 -T ImageNet/imagenet-320-320-trimming-npy/train -V ImageNet/imagenet-320-320-trimming-npy/val

なお、1Epoch毎にValidation及びパラメータの保存を行う場合には、下記のように設定してください。

python classification.py [-c device id] [-b batch size] [-a accumulate gradient] [-L number of layers] [-v validation interval] [-j mini-batch iteration of validation] [-s interval of saving model parameters] [-T directory of the trainning cache file] [-V directory of the validation cache file]

ex):

python classification.py -c cudnn -b64 -a4 -L34 -v 5000 -j 782 -s 5000 -T ImageNet/imagenet-320-320-trimming-npy/train -V ImageNet/imagenet-320-320-trimming-npy/val

4. Multi GPUの分散学習による実行方法

Multi GPUの分散学習のためのNeural Network Librariesのインストールは、pip installで可能です。環境構築の詳細については、下記のブログを参照してください。
README of Multi GPU environment

学習を実行するためのスクリプトは、以下になります。
本例はResNet-50のモデルを用い、各GPUにおいてbatch size:32、accumulate gradient:2と設定し、32×2×4(GPU数)=256batch毎において、gradientの更新を行います。

mpirun [-n Number of GPUs] multi_device_multi_process_classification.py [-b batch size] [-a accumulate gradient] [-L number of layers] [-l learning rate] [-i max iteration of training] [-v validation interval] [-j mini-batch iteration of validation] [-s interval of saving model parameters] [-D interval of learning rate decay] [-T directory of the trainning cache file] [-V directory of the validation cache file]

ex):

mpirun -n 4 python multi_device_multi_process_classification.py -b 32 -a 2 -L 50 -l 0.1 -i 2000000 -v 20004 -j 1563 -s 20004 -D 600000,1200000,1800000 -T ImageNet/imagenet-320-320-trimming-npy/train -V ImageNet/imagenet-320-320-trimming-npy/val

5.結果の確認

tmp.montors.imagenetディレクトリ以下に、Training及びValidationの結果、学習時のパラメータ等が各ファイルに保存されます。
・Training-error.series.txt:Iteration時(特定周期)のTop-1 Error。
・Training-loss.series.txt:Iteration時(特定周期)のLoss。
・Training-time.timer.txt:Iteration時(特定周期)の経過時間。
・Validation-error.series.txt:Iteration時(特定周期)のTop-1 Error。
・Validation-loss.series.txt:Iteration時(特定周期)のLoss。
・Validation-time.timer.txt:Iteration時(特定周期)の経過時間。
・param_xxxxxx.h5:Iteration時(特定周期)の学習済みパラメータ。
ぜひ、必要に応じて確認してみてください。

我々が本Exampleで学習を行った結果としては、3.(ResNet-34、Single GPU)についてはValidationのTop-1 Error:27.5%、4.(ResNet-50、Multi GPU)についてはValidationのTop-1 Error:26.1%、を確認しております。
また、Multi GPUの分散学習による高速化については、4.(100epochのTraining及び1epoch毎のValidation)の4つのGPUを用いた分散学習において1.5日程度(AWS/p3.8xlargeインスタンス使用時)であることを確認しております。(Single GPUでResNet-50を実行した場合と比べ、約1/4に短縮)

ぜひ、Neural Network LibrariesのImageNet学習のExampleを実行してみてください。