web-dev-qa-db-ja.com

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

これは、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メモリをほとんど使用せずに大規模なディープラーニングモデルをトレーニングするためのヒントや秘訣はあるのでしょうか。前もって感謝します!

編集:ディープラーニングの初心者です。それがダミーの質問である場合は謝罪してください:)

2
voilalex

バッチを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

5
Nicolas Gervais

とはいえ、

    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がメモリ不足になる理由を把握し、カーネルを再起動して、エラーが再発しないようにすることができます(私の場合と同じように)。

データを繰り返し渡すことは役立つかもしれませんが、ネットワークのレイヤーのサイズを変更したり、それらを分割したりすることも効果的であることが証明されます(たとえば、転移学習を行っている間、モデルが大量のメモリを占有することもあります)。

2
SHAGUN SHARMA