Stable DiffusionのVAEで色がくすむ・灰色になる原因と対処

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。
Stable Diffusion WebUI で VAE を切り替えた途端、生成画像が全体に灰色っぽくくすんで彩度が落ちた——このページはその症状を切り分けて直すための手順書です。原因はだいたい「モデルと VAE の世代ずれ」「fp16 VAE のオーバーフロー」「VAE の二重適用・別物の適用」の3つに絞れます。上から順に確認すれば、たいてい元の発色に戻せます。
なお私は SD WebUI を --api 付きで起動して txt2img を叩く運用をしていますが、以下は API 経由でも画面操作でも同じ設定を触るので、どちらでも読めるように書きます。環境(GPU・OS・WebUI のバージョン)によって表示名が少し違うことがあります。
まず切り分ける:どの段階で色が失われているか
VAE は潜在空間(latent)を最終的な RGB 画像に復号(デコード)する部分です。色がくすむ・灰色になるのは、ほぼこのデコード段階の問題なので、まず切り分けます。
- VAE を
Automatic(=モデル内蔵)に戻して生成し、発色が正常に戻るか見る。戻るなら「外部 VAE 側」に原因がある。 - 別のプロンプト・別のモデルでも同じくくすむか確認する。特定モデルだけなら組み合わせ問題、全部なら設定・起動オプション側を疑う。
- 灰色というより「真っ黒」「ノイズだらけ」に近いなら、後述の NaN(オーバーフロー)系が濃厚。
この3点で「外部 VAE 依存」「モデル依存」「全体設定依存」のどれかに寄せてから、下の原因を当てていきます。切り分けの発想はLoRAのweightを上げても効かない・反映されない原因を切り分けると同じで、変数を一つずつ固定するのが近道です。
原因1:モデルとVAEの世代がずれている
よく挙げられるのが、SD1.5 系モデルに SDXL 用 VAE を当てる(またはその逆)ケースです。世代が違う VAE は潜在空間のスケールが合わず、色が抜けたり破綻したりすることがあります。
- SD1.5 系:
vae-ft-mse-840000-ema-pruned(stabilityai の sd-vae-ft-mse 系)が定番。 - SDXL 系:
sdxl_vae。fp16 で黒画像・NaN になりやすいので、madebyollin のsdxl-vae-fp16-fixを使うと安定しやすいとされています(後述の fp16 問題対策も兼ねる)。
VAE ファイルは models/VAE/ に置き、設定 → Stable Diffusion → SD VAE のドロップダウンで選びます。API から固定したいときは override_settings で指定します。
{
"prompt": "...",
"steps": 6,
"override_settings": {
"sd_vae": "vae-ft-mse-840000-ema-pruned.safetensors"
},
"override_settings_restore_afterwards": true
}
モデルによっては VAE がすでに焼き込まれている(baked-in)ものがあり、そこへ別世代の VAE を上書きすると発色が濁ります。焼き込み済みモデルなら、まず Automatic で試すのが安全です。
原因2:fp16 VAE のオーバーフローで灰色・黒つぶれ
VAE を半精度(fp16)で動かすと、デコード時に数値があふれて NaN になり、画像が真っ黒・灰色・ノイズになることがあります。省メモリのために fp16 で回している環境で起きやすい症状です。
対処は起動オプションで VAE だけ 32bit に上げることです。
# webui-user.sh などの COMMANDLINE_ARGS に追加
--no-half-vae
それでも改善しないときは --no-half(モデル全体を単精度化。VRAM は増える)も選択肢です。私は Mac の Apple Silicon で 1024×1536 を作るときに --opt-sdp-attention がバッファ確保で落ちるため --opt-split-attention に切り替えるなど、環境ごとにオプションを調整しています。VAE の精度も同じで、GPU と VRAM 量によって最適解が変わるため、まず --no-half-vae を単体で試すのがおすすめです。
WebUI の 設定 には「NaN が出たら VAE を自動的に 32bit float に戻す」系のオプションもあります。これを有効にしておくと、あふれた回だけ自動でフォールバックしてくれます(項目名は執筆時点のバージョンによって表記が異なる場合があります)。
原因3:VAEの二重適用・別物が効いている
発色が「少しだけ濁る」程度のときは、意図しない VAE が効いていることがあります。確認ポイントを表にまとめます。
| 確認箇所 | 見るところ | ありがちな失敗 |
|---|---|---|
| SD VAE ドロップダウン | Automatic/None/指定ファイル |
前回の指定が残ったまま別モデルに適用 |
| モデルの baked VAE | モデル配布ページの記載 | 焼き込み済みに外部VAEを上書き |
| img2img のカラー補正 | 「Apply color correction to img2img」 | ONで色調が寄り、くすんで見える |
| API の override_settings | sd_vae の値 |
restore_afterwards を付け忘れて次回にも残る |
API をバッチで叩いていると、前のリクエストの override_settings がセッションに残って次の生成に影響することがあります。私は Claude Code CLI を subprocess から呼んで記事生成をバッチ化していますが、画像生成でも同じで、状態を持つ設定は毎回明示するか override_settings_restore_afterwards を付けて戻すのが安全です。
また LCM-LoRA を使い、サンプラー LCM / Steps 6 / CFG 1.5 のような低ステップ設定で回すときは、そもそも階調が浅くなりがちです。VAE 起因の「くすみ」と、低ステップ由来の「のっぺり」は別物なので、VAE を Automatic に戻しても改善しない場合はサンプラー・ステップ側も疑ってください。
まとめ:次に取る一手
色がくすむ・灰色になるときは、(1) VAE を Automatic に戻して切り分け、(2) モデルと同世代の VAE を選び、(3) --no-half-vae を付けて再生成、の順で当たれば解決できることが多いはずです。まず今すぐできる一手として、--no-half-vae を起動オプションに追加し、VAE を Automatic にして1枚生成し、正常な発色が戻るかを確認してみてください。そこが基準点になり、どの設定を戻すと濁るのかを一つずつ特定できます。
よくある質問
VAEを適用したら真っ黒・灰色の画像になります。なぜですか?
fp16でVAEをデコードした際に数値があふれてNaNになるのが典型です。起動オプションに --no-half-vae を追加し、それでも直らなければ --no-half も試してください。SDXLでは fp16-fix 版VAEも有効です。
SD1.5とSDXLでVAEは共用できますか?
できません。潜在空間のスケールが異なるため、世代違いのVAEを当てると色が抜けたり破綻します。SD1.5はsd-vae-ft-mse系、SDXLはsdxl_vae系を使い分けてください。
VAEをAutomaticに戻すと発色が正常になります。原因はどこですか?
外部VAE側の問題です。モデルとの世代ずれ、焼き込み済みモデルへの上書き、fp16オーバーフローのいずれかを順に確認します。まず同世代の推奨VAEに変えて試すのが早いです。