本日は
Chainerのv4がリリースされました。
このアップデートでChainerのバックエンドが追加されました。IntelのCPU上で学習・推論が高速になったようです。
Intel Deep Learning Package (iDeep)※2バックエンドを追加して、Intel CPUでの学習および推論の高速化を実現しました。これにより、当社のベンチマークにおいて、GoogLeNet(画像認識用のニューラルネットワークのひとつ)でのCPU使用時の推論速度が従来比8.9倍に向上※3しました。
Support iDeep backend for acceleration on Intel CPUs. We observed that the GoogLeNet inference with batch size 1 is made x8.9 faster (compared to the case without iDeep, both on Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz with MKL).
というわけでCPU上での動作が良くなったみたいなので実験してみましょう。
動かす対象
Chainerのリポジトリの examples にある imagenet
にGoogLeNetの実装があるのでこれを使っていこうと思います。ただ、悲しいことに
This example currently does not include dataset preparation script.
となってますのでデータ収集やら推論のコードやらは自前で書かないといけないっぽいです。
過去に動かしていた方がいらっしゃったようです
引用しているリポジトリ
を見たのですがPython2系でツールが実装されているようなのでPython3で動作するように
データ収集、準備、学習、推論までできるようなスクリプトたちを下記のリポジトリにて公開しました(名前を変更しました)。
使い方
とりあえずクローンします。
$ git@github.com:terasakisatoshi/chainer-caltech-101.git
データセットの準備
ImageNet(学習サンプル)をダウンロードします。
$ cd chainer-imagenet
$ $ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
ダウンロードしたらこれを解凍しておきます。
さて、データを256x256のサイズの画像に変換しなければいけません。以下のコマンドでそれを実行します。
$ python reshape.py --source_dir 101_ObjectCategories --target_dir reshaped
データーを整えたら学習のコードに入力するテキストデータを生成します。
これは LabeledImageDataset
の引数に渡されます。
ファイルの中身やLabeledImageDatasetの使い方等は
が参考になるかもしれません。
いずれにせよ次のコマンドを実行します。
$ python create_dataset.py reshaped
出力として train.txt, test.txt, label.txt
が得られます。
label.txt
に格納されるのは ImageNetのデータセットのラベル名です。格納されている順番と train.txt
or test.txt
に格納される2列目の番号は対応しています。
最後に学習に必要な mean.npy
を用意しておきます。
$ python compute_mean.py train.txt
学習
Chainer のアップグレード
$ pip install -U chainer
CuPy も自動でアップグレードされます。
学習の実行
学習する方法は次のとおりです。パラメータはお好みで。
$ python train.py train.txt test.txt -a googlenet -E 50 -g 0 -j 8
GPUを使うときは -g 0
をオプションとして加えてください. デフォルトではCPUで学習が進んでしまいます。
推論
iDeep を使うために ideep4py
をインストールします。マシーンはUbuntuで確認しました。
$ pip install ideep4py
conda の場合は
$ conda install -c intel/label/test ideep4py
次の方法でもインストールできます。
$ sudo apt install swig
$ git clone https://github.com/intel/ideep.git
$ cd ideep
$ git submodule update --init && mkdir build && cd build && cmake ..
$ cd ../python
$ python setup.py install
Mac でもテストをしているらしいのですが、 OpenMP 周りでうまくビルドができませんでした・・・。
次のステップは iDeep が導入できなくても動くはずです。
推論の実行
$ python predict.py
仏像画像がうまく推論できるかを確かめています。大体正解率は88%ほどになりました。
ここで ideep4py
の導入に成功された方は --ideep
をオプション引数につけてみましょう。
$ python predict.py --ideep
MKL でリンクされる conda の Numpyの環境では True 5.6 秒 False 27秒 という結果になりました。
動作が高速になっていることが確認できますね。pip で導入されるNumpyでは True 8.4, False 39.9 でした。リンクされるライブラリが違っても、iDeepを使ったほうが速くなるのは確実ようです。(とはいえども公式の8.9倍にはとどきませんが・・・)
Numpyのリンク周りは下記が詳しいです。