RTX 3060 12GBでSD 3.5 Largeを動かすoffload設定とfp8量子化

RTX 3060 12GBでSD 3.5 Largeを動かすoffload設定とfp8量子化

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

RTX 3060の12GB VRAMにStable Diffusion 3.5 Largeを載せるには、起動フラグとモデル精度の設定を組み合わせたオフロード構成が欠かせません。デフォルトのまま起動しようとするとOOM(Out of Memory)エラーで終了することになります。この記事では、ComfyUIを使ってSD 3.5 LargeをRTX 3060 12GBで起動・生成できる状態にするための設定を、順を追って説明します。

SD 3.5 Large のメモリ要件を把握する

Stability AIの公式発表によると、SD 3.5 Largeは8.1Bパラメータのモデルです。アーキテクチャはSD 1.5やSDXLのUNetではなく、MMDiT(Multimodal Diffusion Transformer)を採用しています。読み込まれるコンポーネントとVRAM概算(執筆時点の情報にもとづく推算)をまとめます。

コンポーネント 役割 bf16での概算VRAM
MMDiTトランスフォーマー 拡散過程の本体 約16GB
T5-XXL テキストエンコーダ(長文対応) 約5GB(bf16)/ 約10GB(fp32)
CLIP-L / CLIP-G テキストエンコーダ 合計約1GB
VAE latent↔画像の変換 約0.5GB

すべてをbf16でVRAMに乗せると22GB超になります。12GBに収めるには次の2つを組み合わせます。

  • トランスフォーマーをfp8に量子化する(約16GB → 約8GBに削減)
  • T5-XXLをfp8版に差し替える(約5GB → 約2.5GBに削減)

T5-XXLはプロンプトのエンコード時だけ使われ、拡散ステップ中はアイドルになります。このコンポーネントをCPU RAMに退避させることで、推論中のVRAMを大きく削減することも可能です。

ComfyUI の起動フラグ

ComfyUIは起動時の引数でVRAM管理モードを切り替えられます。まず --fp8_e4m3fn だけで試します。

cd ~/ComfyUI
setsid nohup venv/bin/python main.py \
  --port 8188 \
  --fp8_e4m3fn \
  > /tmp/comfy_start.log 2>&1 < /dev/null & disown

OOMが解消しない場合は --lowvram を追加します。

cd ~/ComfyUI
setsid nohup venv/bin/python main.py \
  --port 8188 \
  --fp8_e4m3fn \
  --lowvram \
  > /tmp/comfy_start.log 2>&1 < /dev/null & disown

主要フラグの意味を整理します。

フラグ 効果
--fp8_e4m3fn モデルの重みをfp8(e4m3fn形式)に量子化。VRAM消費をbf16比で約半減
--fp8_e5m2 fp8の別フォーマット。e4m3fnより表現できる値の範囲が広い
--lowvram 未使用モジュールをCPU RAMへ退避。推論ごとにCPU↔GPU転送が発生する
--normalvram デフォルト動作。モデルをVRAMに保持しようとする
--highvram すべてVRAMに保持。16GB以上向け
--cpu-vae VAEをCPUで実行。デコード時にOOMが起きる場合に追加

--lowvram は推論のたびにCPU↔GPU間の転送が発生するため生成時間が伸びます。--fp8_e4m3fn だけでOOMが解消できるなら --lowvram は追加しないほうが速度の観点から有利です。fp8量子化による画質への影響は生成内容によって異なります。顕著な劣化が気になる場合は --fp8_e5m2 も試す価値があります。

T5-XXL のモデルファイル選択

SD 3.5 Largeのワークフローではテキストエンコーダの読み込みに Triple CLIP Loader ノードを使います。T5-XXLは複数の精度で配布されており、選ぶファイルによってVRAM消費が変わります。

T5-XXLのファイル 概算VRAM 備考
t5xxl_fp32.safetensors 約10GB 精度最高。12GB環境では単独でVRAMをほぼ埋める
t5xxl_fp16.safetensors 約5GB --lowvram との組み合わせが必要になりやすい
t5xxl_fp8_e4m3fn.safetensors 約2.5GB 12GBで他コンポーネントと共存しやすい

fp8版のT5-XXL(t5xxl_fp8_e4m3fn.safetensors)をVRAMに置き、起動フラグでトランスフォーマーも --fp8_e4m3fn で量子化すれば、理論上は12GB以内に収まる計算になります。ただし推論中のアクティベーションや中間テンソルも加わるため、実際に収まるかどうかは解像度や環境によって異なります。

fp8版T5-XXLはStability AIのHugging Faceリポジトリから入手できます(執筆時点。アクセスにはライセンスへの同意が必要です)。モデルファイルはComfyUIの標準ディレクトリに配置します。

ComfyUI/
└── models/
    └── clip/
        ├── clip_l.safetensors
        ├── clip_g.safetensors
        └── t5xxl_fp8_e4m3fn.safetensors

Triple CLIP Loaderノードの clip_name3 にこのファイルを指定します。

OOM が出たときのトラブルシューティング

ログでどのコンポーネントが原因かを特定する

tail -f /tmp/comfy_start.log

CUDA out of memory エラーが出たとき、その直前の行に何をロード中だったかが記録されています。タイミングで対処が変わります。

OOMが起きるタイミング 対処
T5-XXLのロード時 fp8版T5に差し替えるか --lowvram を追加
拡散ステップ中 --fp8_e4m3fn または --lowvram を追加
デコード(latent→画像)時 --cpu-vae を追加

プロセスの確認はポートから引く

ComfyUIが起動しているか確認するにはポートからPIDを引く方法を使います。

ss -tlnp | grep :8188

pgrep -f main のようなパターンマッチは、コマンド文字列に自分自身がマッチしてSSHセッションごと落ちる可能性があるため避けてください。

nvidia-smi が使えない場合

ドライバ更新後に再起動していない環境では nvidia-smi が NVML mismatch エラーを返すことがあります。その場合はPyTorchのAPIで確認できます。

python3 -c "import torch; print(torch.cuda.memory_summary())"

まとめ

SD 3.5 LargeをRTX 3060 12GBで動かすための設定を優先順にまとめます。

  1. --fp8_e4m3fn を起動フラグに追加する——トランスフォーマーのVRAMをbf16比で約半減できます
  2. T5-XXLは t5xxl_fp8_e4m3fn.safetensors を使う——VRAMを約2.5GBに抑えられます
  3. それでもOOMが出るなら --lowvram を追加する——生成速度は落ちますが確実にVRAMを抑えられます
  4. デコード時にクラッシュするなら --cpu-vae を追加する——VAEデコードの所要時間は解像度やCPUの性能によって異なります

まず1と2だけで起動を試み、ログを見ながら必要なフラグを足していくのが効率的です。どのコンポーネントでOOMが起きているかをログで特定してから対処すると、最小限の設定で動作点を見つけられます。

同じRTX 3060 12GBで別の生成AIモデルを動かす場合のVRAM見積もりについては、ACE-Step × RTX 3060 12GB|30秒音楽生成の所要時間をスペックから推算するも参考にしてください。

この記事で触れたもの

よくある質問

SD 3.5 LargeはRTX 3060 12GBだけで動きますか?

fp8量子化とT5-XXLのfp8版を組み合わせることで動作できると考えられます。`--fp8_e4m3fn`でトランスフォーマーを量子化し、T5-XXLは`t5xxl_fp8_e4m3fn.safetensors`を使うのが基本構成です。それでもOOMが出る場合は`--lowvram`を追加します。

--lowvramと--fp8_e4m3fnはどちらを先に試せばよいですか?

`--fp8_e4m3fn`を先に試してください。これだけでOOMが解消できれば生成速度への影響が最小限です。OOMが残る場合に`--lowvram`を追加します。`--lowvram`はCPU↔GPU転送が増えるため生成時間が伸びます。

デコード時だけOOMが起きる場合の対処法は?

起動コマンドに`--cpu-vae`を追加してください。VAEの処理をCPUで行うため生成時間は若干増えますが、デコード時のVRAMピーク消費を下げられます。VAEは比較的小さいコンポーネントなので速度への影響は軽微です。

nvidia-smiが使えないときにVRAM使用量を確認するには?

`python3 -c "import torch; print(torch.cuda.memory_summary())"`でPyTorch経由の確認が可能です。ドライバ更新後に再起動していない環境でnvidia-smiがNVML mismatchエラーを返す場合に有効です。