Chainer「NameError: global name 'drv' is not defined」

Chainerを使って実装をしていて「NameError: global name 'drv' is not defined」というエラーが出た場合、周囲のソースを読んでみたりしてもよくわからず、CUDA周りの何かなのだろうかとかしばらく悩んだけども、このエラーを再現させるコードは

Variable(1) + 1

で十分。Variableの引数がnumpy.ndarrayやpycuda.gpuarray.GPUArrayではない場合に起きる。うっかり1-of-Kにすべきところでそのままの値を入れたのが自分の場合の失敗原因だった。

「Variableの引数が〜でない時に起こる」はわかった。「Variableの引数が〜でないときに、なぜ起こるか」はざっとコードを眺めただけではわからない。だけど「Variableの引数が〜でない時にこのエラーが起こらないようにする」という上では、そもそもVariableは仕様上〜しか受け取らないってことになっているんだから、__init__の時点で違うものが来ていたらアサーションエラーにすればいいだけだ。というわけで「なぜ」に関して深追いするのはやめた。