背景:
NLP 関連のコードでは、N2N デコーダの形式があります。前のラウンドの予測結果を現在のラウンドの入力として使用し、現在のラウンドの特徴と一緒に現在のラウンドの結果を予測します。私はほとんどのコードが teacher forcing を使用しており、行列の乗算を使用して結果を迅速に得ています。テスト段階では、for ループを使用して 1 回ごとに結果を予測します。
問題:
テスト段階では、torch.no_grad () を使用するため、メモリの問題は発生しません。しかし、トレーニング段階では、teacher forcing を使用しない場合、つまり行列の乗算を使用せずに結果を 1 回ごとに得る場合、メモリ不足のエラーが発生します。
解決策:
加算やリストの追加が関係するすべての場所で、.data [0] の形式を使用して計算グラフを継承しないようにします。
例:
このプロジェクトでは、 GitHub - gongliym/data2text-transformer: Enhanced Transformer Model
for Data-to-Text Generation 、最終的にはテキストが生成されるため、N2N の形式が関係しています。テスト時に torch.no_grad () を使用しない場合、メモリがオーバーフローします。.model/src/model/transformer.py というファイルで、自己増加の位置を変更すると、380 行目のように:
tensor = tensor + attn
次のように変更します:
tensor = tensor + attn.data[0]
このようにすると、メモリのオーバーフローは発生しません。
その他:
上記の状況では、torch.cuda.empty_cache () コマンドは適用されません。このコマンドを使用してもキャッシュは解放されず、トレーニング時間が大幅に向上します。