studylog/北の雲

chainer/python/nlp

chainerメモ10 AttributeError: 'module' object has no attribute 'init'

追記)2015.10.30
互換性維持のためバージョン1.4.0でcuda.init()が復活しました。
正確にはエラーで落ちなくなりdeprecatedを出すようになりました(つまり書いても書かなくても何もしない)。
以下の記事は1.3.0~1.3.2限定の話です。



chainerでcuda.initはもう使えない - Qiita

こちらの人が遭遇しているように、1.3.0でGPUのためのnumpyバックエンドがPyCuda→CuPyへと変わった関係でcuda.init()が必要なくなりました。

chainer1.3.0リリース - studylog
cupy使ってみる - studylog
でも書いたのですがcuda.init()があるとタイトルのエラーが出ます。初期化にcuda.init()はいりません
再掲しておこうと思います。

GPU対応コードが変わるところ

初期化

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

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

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

#1.3.0以降
#予め初期化段階で以下のコードを書いておいてxpにGPUだったらcupy、CPUだったらnp(numpy)を入れておく
xp = cuda.cupy if gpu >= 0 else np  #npはimport numpy as np のnpってことです

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

xp.asarray()にデータを放り込めばどっちにも対応してくれるようになったので煩わしさが減りました。もちろんその前にxxp = cuda.cupy if gpu >= 0 else npを一度書いておく。

思うこと

かなり活発に開発されているchainerは2週間ごとに新しいバージョンにアップデートされて仕様がどんどん変わっているので一ヶ月前に動いていたコードが動かないのはざらです。自分は英語は全くと言っていいほどわからないけど1.0.0の時からずっと追い続けているので何とか変更についていけてる。でも、まだ中身がよくわからないけど(ブログなどに書かれていた非公式の)サンプルコードを試してみるか、という段階の人にとってはそのコードが動かなかったらもうお手上げです。ブログやgithubにあげたコードをchainerのバージョンが上がるたびに修正するこまめな人っていないだろうし、英語ドキュメントだと斜め読みして変更点を見つけて自分で修正って非常に辛い。Githubも慣れてない人はバージョンごとの変更点って見つけにくいと思う。見ても英語だし。よくわかってるものが対象なら英語でも情報が読み取れても、全く未知の対象物の細かい変更点を英語で読み取るのは敷居が高い。

もっと使う人が増えて日本語の情報が増えればなあ。そしたらエラーに遭遇してもエラー文で検索したらすぐに解決策がヒットして自力だと何十分悩んでたはずが1分で解決、とかなりそうだし。今のところchainerのエラー文をブログに書いてる人って全然いない。多分自分が一番書いてるんじゃないか。検索に引っかかることを意識してどんどん書いてるつもり。それでも今回のタイトルエラーのきっかけとなったcuda.init()については「1.3.0では必要なくなった」とは書いてたけどエラー文自体は書いてなかった。書いておけばハマった人が少なくとも一人(一番上のqiitaの人)は減ったはず。

お互いこういう時間を減らしたい。他の人のハマった時間をなるべく減らしたい。なのでしょーもないエラー文でもどんどん書いていこうと思う。そのうちどんどん使う人が増えてくれて、英語圏でも使われまくってstack overflowを見ればたいてい解決、となる日が来ますように。