「CUDA error: device-side assert triggered」の原因と対処
結論を先に。多くは、分類のラベルがクラス数の範囲外(例: クラス数 10 なのにラベルに 10 が入っている)か、Embedding などのインデックスが範囲外であることが原因です。CPU で再現すると本当のエラー箇所がわかります。
RuntimeError: CUDA error: device-side assert triggered原因
GPU 上で範囲外アクセスが起きると、この一般的なメッセージになります。典型例は、CrossEntropyLoss に渡すラベルが [0, クラス数-1] の範囲を外れている、Embedding のインデックスが語彙数を超えている、などです。
対処
- まず本当のエラー箇所を出す。GPU はエラー位置がずれて見えるので、同期実行にするか CPU で動かします。
CUDA_LAUNCH_BLOCKING=1 python train.py- ラベルの範囲を確認する。0 始まりで、クラス数未満に収まっているかを見ます。
print(y.min().item(), y.max().item()) # 0 〜 (num_classes - 1) に収まるべき- Embedding を使っているなら、入力 ID が
num_embeddingsを超えていないか確認します。
まとめ
- 原因の多くはラベルやインデックスの範囲外
CUDA_LAUNCH_BLOCKING=1で本当の発生箇所を出すy.min(), y.max()がクラス数の範囲に収まるか確認- Embedding は語彙数を超えていないか確認する