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で動かすための設定を優先順にまとめます。
--fp8_e4m3fnを起動フラグに追加する——トランスフォーマーのVRAMをbf16比で約半減できます- T5-XXLは
t5xxl_fp8_e4m3fn.safetensorsを使う——VRAMを約2.5GBに抑えられます - それでもOOMが出るなら
--lowvramを追加する——生成速度は落ちますが確実にVRAMを抑えられます - デコード時にクラッシュするなら
--cpu-vaeを追加する——VAEデコードの所要時間は解像度やCPUの性能によって異なります
まず1と2だけで起動を試み、ログを見ながら必要なフラグを足していくのが効率的です。どのコンポーネントでOOMが起きているかをログで特定してから対処すると、最小限の設定で動作点を見つけられます。
同じRTX 3060 12GBで別の生成AIモデルを動かす場合のVRAM見積もりについては、ACE-Step × RTX 3060 12GB|30秒音楽生成の所要時間をスペックから推算するも参考にしてください。
この記事で触れたもの
- Stable Diffusion 画像生成 解説書楽天で探す
よくある質問
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エラーを返す場合に有効です。