これは、GPUメモリが少ないPyTorchユーザーにとってかなり一般的なメッセージだと思います。
RuntimeError: CUDA out of memory. Tried to allocate ???? MiB (GPU ????; ???? GiB total capacity; ???? GiB already allocated; ???? MiB free; ???? cached)
コースワークのオブジェクト検出アルゴリズムを研究したいと考えています。また、多くのディープラーニングアーキテクチャは大容量のGPUメモリを必要とするため、私のマシンではこれらのモデルをトレーニングできません。各レイヤーをGPUにロードしてからロードし直すことで画像を処理しようとしました:
for m in self.children():
m.cuda()
X = m(X)
m.cpu()
torch.cuda.empty_cache()
しかし、それはあまり効果的ではないようです。 GPUメモリをほとんど使用せずに大規模なディープラーニングモデルをトレーニングするためのヒントや秘訣はあるのでしょうか。前もって感謝します!
編集:ディープラーニングの初心者です。それがダミーの質問である場合は謝罪してください:)
バッチをCUDAに繰り返し送信し、小さいバッチサイズを作成します。最初は一度にすべてのデータをCUDAに送信しないでください。むしろ、次のようにしてください。
for e in range(epochs):
for images, labels in train_loader:
if torch.cuda.is_available():
images, labels = images.cuda(), labels.cuda()
# blablabla
より少ないメモリを使用するdtypes
を使用することもできます。例えば、 torch.float16
またはtorch.half
。
とはいえ、
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がメモリ不足になる理由を把握し、カーネルを再起動して、エラーが再発しないようにすることができます(私の場合と同じように)。
データを繰り返し渡すことは役立つかもしれませんが、ネットワークのレイヤーのサイズを変更したり、それらを分割したりすることも効果的であることが証明されます(たとえば、転移学習を行っている間、モデルが大量のメモリを占有することもあります)。