LoginSignup
7
3

More than 3 years have passed since last update.

Chainerで謎のCUDAのエラー

Posted at

何が起きたか

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を使うのは時系列のモデルを使う方が多いと思うのですが、もしこの記事が役に立てば幸いです。

7
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3