#何が起きたか
Chainerでディープなモデルを訓練するとき謎のCUDAのエラーが出ててかなり困ったので、その時の問題点と対策を書きます。
エラーは以下の2種類が出ました。
・CUBLASError: CUBLAS_STATUS_EXECUTION_FAILED
・CUDARuntimeError: cudaErrorIllegalAddress: an illegal memory access was encountered
1回目に実行したときは一つ目、連続2回以上実行すると2つ目が永遠と出続けました。
このエラーコードで調べても解決方法は全く見つからなかったのですが、落とし穴は思わぬところにありました。
#問題点
今回は訓練にGenerative Adversarial Networks (GANs)を用いていたのですが、生成器にラベルを付けて訓練を行うもので訓練を行っていました。(訓練していたモデルはGeneratorにConditional Batch Normalizationを使っていたものです)
この時、画像はCupyでfloat32のobjectをVariableで括って作ってました。
ラベルはCupyでint8のobjectをVariableで括って作ってました。
このint8にしていたのが大問題でした。
型の不一致は当たり前のごとくギルティ―です。
しかし、今回Conditional Batch Normalizationに放り込む際、一度ラベルを埋め込むためにembed_idに投げる必要があるのですが、このembed_idはタイプの不一致の際に「タイプが違うよ!」という風に注意してくれるのではなく、冒頭に記述したようにあたかもCUDAのエラーであるかのようなエラーを返してきます。
当時私はメモリーを食ってほしくない一心があったのかは覚えてませんが、唐突にラベルだけint8に書き換えてしまっており、そんなことは全く覚えていない現在の私はCUDAのエラーかと思い、最初はConditional Batch Normalizationの部分にエラーが出ているなどとは露も知りませんでした。
地道にprint文を挟み続け結果Conditional Batch Normalizationの部分にエラーがあると気づいたのですが、根本のエラーの原因はただ型の不一致というしょうもないオチでした。
#対策
もはや対策を書くほどでもないですが、ただ型を一致させましょうというだけです。
#おわりに
たぶんembed_idを使うのは時系列のモデルを使う方が多いと思うのですが、もしこの記事が役に立てば幸いです。