studylog/北の雲

chainer/python/nlp

chainerのバージョンごとの違い(2016年1月19日現在)

あと数日で1.6がやってくるchainer。
1.0~1.6までのバージョンごとの差について簡単にまとめてみます。

大きく分けると3つのグループ

1.0 1.1 1.2 黎明期バージョン

1.3 1.4 CuPy導入

1.5 1.6 色々とパワーアップした現世代

特にこれからchainer始める人はこのグループ分けを覚えておいた方がいいです。グループが違うと中身がかなり違うので他の人が書いたサンプルを参考にしたりフォーラムで質問する時は注意が必要です。
同じグループ同士のアップグレードはそこそこ楽ですが、1.2→1.3や、1.4→1.5はそれなりに大変。

バージョンの見分け方

良さげなサンプルコードを見つけて使ってみたいけど対応しているバージョンがわからない、という方向けに簡単な見分け方を。

1.5、1.6

chainer.links
chainer.Chain
serializers.save_hdf5

これらが一つでもあれば1.5以上が確定。

1.3、1.4

cupy
xp
これらがあれば1.3以上がほぼ確定(ただしcupy/xpいずれもGPUのためコードなので、CPUだけのために書かれたコードの場合は引っかからないかも)。

いずれも見つからなければ1.2以下の可能性が高いです。

各バージョンに対する主観

1.0

CaffeやPyBrainなどはちょこちょこ触っていたけれど設定ファイルがyamlだったりで面倒だなあとモヤモヤしていたところに国産フレームワークの登場。
右も左もわからなくてもニューラルネットワークが書けてしまう衝撃の登場でした。

そのぶんまだまだ産まれたてといった感じで、GPU環境のインストールは皆さん苦労されたかと思います。私もchainerで使いたくてGPUを買って帰宅してから10時間近くCUDA/PyCUDAの設定に明け暮れてました。この頃はGPUで動かしてエラーが出ても「what(): explicit_context_dependent failed: invalid device context - no currently active context?」というどれも共通?のエラーが出て何が原因なのかわからなかったり。そういえばpython3にもまだ対応していませんでした。

1.1

バグ修正やint32やfloat32などの型チェックが厳格になったバージョン。python3やCaffeモデルの読み込みに対応。

1.2

あまり印象が無いバージョン。
1.1→1.2に上げる注意点としてはFunctionSetあたりのディレクトリの構造が変わった?のかFunctionSetごとpickleしたモデルは互換性が無くなってしまいました。

1.3

CuPy導入でGPU対応コードがめちゃくちゃ簡単に書けるようになった記念すべきバージョン。まだ1.2以前でchainer入門されてる人が結構いるみたいですが、GPUを使うなら最低限この1.3に上げてからにした方がいいです。1.2以前のインストールを難しくさせていた原因であるPyCUDAが完全に必要なくなったのでpipでさくっと入るようになってます。xpにnumpyかcuda.cupyのどちらかを入れておくというテクニックでCPU/GPU分岐コードもほぼいらず。

1.4

本来はここで現在の1.5相当の大幅な変更が行われる予定でしたが開発に時間がかってしまったので1.4は1.3のマイナーアップデート的な位置づけでリリース。CuPy周りでたくさんの機能が追加されてnumpy互換性が高まりました。

1.5

1.4以前とコード・モデルの互換性を大幅に切り捨て、より速くより洗練された現在の1.5さん。今まで書き溜めてきたコードのアップグレードは大変でしたが上げてしまうと快適です。

  • CuPyのCython化で1.3で落ちてしまったGPUの速度が1.2以前のPyCUDA版よりも速く
  • モデルの公式保存/読み込みサポート
  • LSTMをシンプルに書けるように
  • Chainをどんどん繋いでいけるようになって名実共にchainerに(まだ使いこなせてないけど便利そう)

など改善点が多め。そのぶんインストールが少し大変になったようですが1.6で改善されるそう。

1.6(未リリース)

ぱっと見た感じですが機能の追加がメインなのでコードの書き換えは全く必要無さそうです。
メモリ解放、ELUやMaxoutなどの高性能活性化関数、cudnn v3のsoftmaxLog対応、cudnn v4対応?、木構造のLSTM、GRU修正などなど。


以上です。

今から始めるんだけど、どのバージョンがいい?

1.2以前はお勧めできませんGPU環境のインストールは大変ですし、今のバージョンとはGPUまわりの書き方がかなり違うので、もし最新バージョンに上げたくてもすんなり移行できないかもしれません。コツコツ書いたコードが無駄になるかも。chainerの日本語フォーラムで1.2以前のバージョンで質問されている方がいますけど、回答もつきにくいイメージ。悪いところばかりではなくて、chainerが世に出た当初にたくさん書かれてたチュートリアル的な記事を利用しやすいというメリットもあります。

できれば1.5。1/20に1.6が出るのでそれでも。
どうしてもインストールにつまずくようなら1.4。

といった感じでしょうか。ちなみにpipでバージョンを指定してインストールするには、

pip install chainer=="1.5.1"

のようにします(環境によってsudoつけてください)。