Stable Diffusionで「 CUDA out of memory 」メモリ不足が発生した際の対策メモ

フルタニ

こんにちは、フルタニです。放送局で番組作りをしてました。CUDA out of memory を書きます。

Stable Diffusionで画像生成していて、メモリーが足りないとき発生するのがGPUメモリ不足(RuntimeError: CUDA out of memory)です。

知人の少し古いWindowsマシンで大きめな画像生成にチャレンジ中に発生しました。

エンジニアさんのマターなので正直対策はプロにまかせるのが正解ですが、解決した際のメモを残します。

メモリ不足が発生する原因とは

GPUメモリ不足(RuntimeError: CUDA out of memory)とはこのようなエラーです。

RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 4.00 GiB total capacity; 3.42 GiB already allocated; 0 bytes free; 3.48 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

画像生成AIStable Diffusionを使いこなす時必要なのが、高速なグラフィックボードと大容量のVRAMです。

メモリーはあればあるだけよく、実用的に動かすためには8GBは最低必要なので注意しましょう。

生成する画像サイズが大きすぎたり、プロンプトが長すぎたり、搭載しているGPUが非力すぎたりすると発生しやすくなります。

解決策

解決策のヒントは次の通り

  • システムを再起動する
  • 軽量版のbasujindal/stable-diffusionを使う
  • Nvidia CUDA Toolkit と一緒に Anaconda をインストールする
  • Stable Diffusion の最適化されたバージョンを使用する
  • Stable Diffusion フォルダー内の webui.bat ファイルをテキストで開き、冒頭に以下を追記した上でアプリをコマンドで立ち上げ直す
  • Stable Diffusion の最適化されたバージョンを使用する
  • Stable Diffusion フォルダー内の webui.bat ファイルをテキストで開き、冒頭に以下を追記した上でアプリをコマンドで立ち上げ直す

以上の対応策を見つけました。

set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6, max_split_size_mb:128

※webui-user.batと混同しないように注意。

Optimizations · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub

そのほかの対処法

1. 解像度を下げる

• 画像生成時の解像度が高いほどメモリ使用量が増加します。

• 解像度を低く設定(例: 512×512に変更)して試してみてください。

2. バッチサイズを減らす

• 一度に生成する画像の数(バッチサイズ)を減らすことで、必要なメモリ量を削減できます。

• コマンドラインやGUIの設定でバッチサイズを1に設定してください。

3. Precisionを「fp16」に変更

• モデルの計算精度を「float16(fp16)」に変更すると、メモリ使用量を削減できます。

• この設定は通常、Stable Diffusionの構成ファイルか起動スクリプトで行えます。

4. VRAM節約モードを有効にする

• Stable Diffusionの実行時に「低VRAMモード」や「–medvram」オプションを使用します。

• 極限までメモリを削減したい場合は「–lowvram」オプションも有効です。

5. 不要なプログラムを終了

• GPUメモリを消費している他のアプリケーション(例: Chrome、ゲームなど)を終了させると、使用可能なVRAMが増えます。

6. Swap領域の活用(代替案)

• CPUのRAMや仮想メモリを使用してGPUメモリ不足を補う方法です。

• 遅くなりますが、「xformers」や「DeepSpeed」ライブラリを利用することで効率化できます。

7. GPUメモリを解放

• 実行中にメモリが解放されない場合、以下を試してください:

1. Pythonスクリプトを終了し再起動。

2. 「nvidia-smi」コマンドでメモリ使用量を確認し、不要なプロセスを終了。

8. 高VRAMのGPUを使用する

• 使用しているGPUのVRAM容量が4GB未満の場合、特に高解像度や複雑なモデルで問題が発生しやすいです。可能ならVRAM容量が8GB以上のGPUに切り替えを検討してください。

9. モデルの圧縮または最適化

• モデルを最適化する方法として「xformers」を導入すると計算効率が改善されます。

• また、軽量化したモデル(例: pruned weights)を使用すると、メモリ消費が抑えられます。

10. ハードウェアを確認

• 安定性が必要な場合、ドライバやCUDA Toolkitのバージョンが適切か確認してください。古いバージョンや互換性のないものはエラーの原因になります。

Stable Diffusion runtime error – how to fix CUDA out of memory error

まとめ

初心者がStable Diffusionを使っていて CUDA out of memoryの発生を予防するには

  • なるべく最新のPCを使う
  • Stable Diffusionも最新のものを使う
  • グラボのメモリーは最低8GBは用意する

などの対策を取りましょう。