「CUDA error: device-side assert triggered」の原因と対処

結論を先に。多くは、分類のラベルがクラス数の範囲外(例: クラス数 10 なのにラベルに 10 が入っている)か、Embedding などのインデックスが範囲外であることが原因です。CPU で再現すると本当のエラー箇所がわかります。

RuntimeError: CUDA error: device-side assert triggered

原因

GPU 上で範囲外アクセスが起きると、この一般的なメッセージになります。典型例は、CrossEntropyLoss に渡すラベルが [0, クラス数-1] の範囲を外れている、Embedding のインデックスが語彙数を超えている、などです。

対処

  1. まず本当のエラー箇所を出す。GPU はエラー位置がずれて見えるので、同期実行にするか CPU で動かします。
CUDA_LAUNCH_BLOCKING=1 python train.py
  1. ラベルの範囲を確認する。0 始まりで、クラス数未満に収まっているかを見ます。
print(y.min().item(), y.max().item()) # 0 〜 (num_classes - 1) に収まるべき
  1. Embedding を使っているなら、入力 ID が num_embeddings を超えていないか確認します。

まとめ

  • 原因の多くはラベルやインデックスの範囲外
  • CUDA_LAUNCH_BLOCKING=1 で本当の発生箇所を出す
  • y.min(), y.max() がクラス数の範囲に収まるか確認
  • Embedding は語彙数を超えていないか確認する