PyTorch で「CUDA メモリ不足」を回避する方法 質問する

PyTorch で「CUDA メモリ不足」を回避する方法 質問する

これは、GPU メモリが少ない PyTorch ユーザーにとっては非常に一般的なメッセージだと思います。

RuntimeError: CUDA out of memory. Tried to allocate X MiB (GPU X; X GiB total capacity; X GiB already allocated; X MiB free; X cached)

各レイヤーを GPU にロードしてから再度ロードすることで画像を処理しようとしました。

for m in self.children():
    m.cuda()
    x = m(x)
    m.cpu()
    torch.cuda.empty_cache()

しかし、あまり効果的ではないようです。GPU メモリをほとんど使用せずに大規模なディープラーニング モデルをトレーニングするためのヒントやコツがあるかどうか疑問に思っています。

ベストアンサー1

それでも

import torch
torch.cuda.empty_cache()

占有されているCUDAメモリをクリアするための良い代替手段を提供し、また、使用されていない変数を手動でクリアすることもできます。

import gc
del variables
gc.collect()

しかし、これらのコマンドを使用した後でも、pytorch は実際にはメモリをクリアせず、変数によって占有されているメモリへの参照をクリアするため、エラーが再び発生する可能性があります。そのため、カーネルを再起動して最適な batch_size を見つけた後に batch_size を減らすことが最善の選択肢です (ただし、あまり実現可能ではない場合もあります)。

GPU のメモリ割り当てについてより深く理解するための別の方法は、以下を使用することです。

torch.cuda.memory_summary(device=None, abbreviated=False)

ここで、両方の引数はオプションです。これにより、メモリ割り当てのわかりやすい概要が提供され、CUDA がメモリ不足になった理由を把握し、カーネルを再起動してエラーが再発しないようにすることができます (私の場合と同じように)。

データを反復的に渡すことは役立つかもしれませんが、ネットワークのレイヤーのサイズを変更したり、レイヤーを分割したりすることも効果的です (たとえば、転移学習の実行中にモデルが大量のメモリを占有することがあるため)。

おすすめ記事