studylog/北の雲

chainer/python/nlp

chainer1.3.0リリース

変更内容はこちら。github.com

今回の大きな目玉はCuPyの導入。

バックエンドとして使われていたPyCUDAが自前のライブラリCuPyというものに置き換わったのでPyCUDAのインストールがもう必要ありません。scikit-cudaもいらなくなりまして、GPUで動かすに必要なのはCUDA 6.5+だけと大変シンプルに。PyCUDAのインストール躓いてchainer断念した人多いと思うので再チャレンジを。

それに伴いGPU対応コードが(少し)変わってて、CPUとほぼ共通のコードで動くようになってさらにコード量が減ってます。

もう一つ、モデルの保存・読み込みの公式なサポートが(Save/load functions and function sets · Issue #181 · pfnet/chainer · GitHub)が予定されていたけど延期に。どうもモデル構造を大きく置き換えるっぽいです(New design of model structure · Issue #363 · pfnet/chainer · GitHub)。これが導入されると今まで時間かけて学習させたモデルが使えなくなりそうな予感。

Windowsへの対応は元々非公式ですが、CuPy導入でさらに不安定になったようです。何か不具合があったら報告してくれとの事。

https://groups.google.com/forum/#!topic/chainer/NsU28rbf0vw

For Windows users:
We do not support Windows officially, though we want to make it run on Windows as well as Linux. We made CuPy installable to Windows, but it might have some incorrect behaviors. It is appreciated to send us reports of errors on Windows!

試してみた

速度

GPUは750ti
mnistサンプルデフォルトで(n_units=1000)

version = 1.2
(chainer/train_mnist.py at f0a69079070eaa94ca128b48a414d152eebf2a90 · pfnet/chainer · GitHub)
74.5秒
74.5秒

version = 1.3
(chainer/train_mnist.py at 308f0f4a789bfc3adba07d181cb38be2fa3dd0b3 · pfnet/chainer · GitHub)
108.6秒
100.3秒
99.4秒

速度は75%ぐらいに。。(遅くなっている)
GPUの使用率は1.2だと80%越え、1.3だと60%に留まっているのでこれが原因か。実際はこういう軽い計算はさせないと思うので、mnistサンプル(n_units=2000 これだとGPU使用率ほぼ100%に)にして試してみると1epochあたり
1.2 = 8.3秒
1.3 = 8.6秒
という感じで差は縮まります。若干1.3が遅い(96%)。

ただ手元のRNN/LSTMのコードだと108%と逆に速くなってますし得意不得意があるのか。安易にどっちが速いとは今のところ結論づけたくない。

コードが変わるところ

初期化

#旧
cuda.init()
#新
cuda.check_cuda_available()
cuda.get_device(0).use() #0はgpuデバイスナンバー

CPUとCPUでコードを分岐しなくても済むようになった

#旧
x_batch = numpy.asarray([1,1,1] , dtype=np.int32)
if args.gpu >= 0: #GPUの時はto_gpuを通さないといけなかった
    x_batch = cuda.to_gpu(x_batch)

#新
#予めどこかで以下のコードを書いておいて
xp = cuda.cupy if gpu >= 0 else np

x_batch = xp.asarray([1,1,1] , dtype=xp.int32)#これでGPU、CPUの両対応

cuda.get_array_module( arrayデータ )はGPU環境だとcupyを、CPU環境だとnumpyを自動で入れてくれる。