問題の概要:VAE選択による画像生成の失敗とエラー
Stable Diffusionで画像生成を行う際、モデル(Checkpoint)を正しく読み込んでいるにもかかわらず、以下のような問題に遭遇することがあります。
- 生成される画像全体が暗く、灰色や緑がかった色味になる。
- 顔やテクスチャがぼやけ、詳細が失われてしまう。
- 高解像度で生成すると、画像が崩壊したり、ノイズだらけになる。
- 以下のような具体的なエラーメッセージが表示され、生成が中断される。
NansException: A tensor with all NaNs was produced in VAE. This could be because there's not enough precision to represent the picture. Try adding --no-half-vae commandline argument to fix this.
これらの問題の多くは、モデルと互換性のないVAE(Variational Autoencoder)が選択されている、またはVAEの設定が適切でないことが原因です。特に「baked VAE」と「外部VAE」の違いを理解していないと、混乱の元となります。
原因の解説:VAEの役割と「baked」の意味
VAEは、Stable Diffusionの画像生成プロセスにおいて、潜在空間(Latent Space)と画像空間(Pixel Space)を相互に変換する役割を担うニューラルネットワークです。具体的には、ノイズから生成された「潜在表現」を、私たちが見ることができる「画像」にデコード(復号)します。
「baked VAE」とは?
「baked」(焼き込まれた)VAEとは、モデルファイル(.ckptまたは.safetensors)にすでにVAEの重みが含まれている状態を指します。多くの初期のStable Diffusion 1.xモデル(SD 1.4, 1.5)や、それらを基にしたLoRAモデルはこの形式です。baked VAEモデルでは、特にVAEを指定しなくても、モデル内蔵のVAEが自動的に使用されます。
「外部VAE」が必要な場合
一方、Stable Diffusion 2.x以降のモデルや、多くのFine-tunedモデル(Anything V3, NovelAIのモデルなど)は、モデルファイルにVAEが含まれていません。これらはbaked VAEではないため、ユーザーが明示的に適切な外部VAEファイル(.ptまたは.safetensors)を読み込む必要があります。これを怠ると、冒頭で述べた「暗い画像」や「詳細の欠如」といった問題が発生します。
また、baked VAEであっても、そのVAEの性能が低い(例:SD 1.5標準VAE)場合、より高品質な外部VAE(例:`vae-ft-mse-840000-ema-pruned.ckpt`)に差し替えることで、画質の向上が見込めます。
解決方法:VAEの選択と設定手順
ここでは、AUTOMATIC1111のWebUIを例に、問題を解決するステップを説明します。
ステップ1:使用するモデルの特性を確認する
モデルをダウンロードしたサイト(Civitai, Hugging Face等)の説明文を確認し、以下の点をチェックします。
- 「This model does NOT have a baked-in VAE.」(このモデルにはbaked VAEが含まれていません)と書かれていないか。
- 推奨されるVAEが指定されていないか(例:「Use with the kl-f8-anime2 VAE」)。
ステップ2:適切なVAEファイルを準備する
一般的に使用される代表的なVAEファイルは以下の通りです。これらを`stable-diffusion-webui/models/VAE`ディレクトリに配置します。
- SD 1.x系モデル向け(高画質・汎用): `vae-ft-mse-840000-ema-pruned.ckpt` (Hugging Faceから入手可能)
- アニメ系モデル向け: `kl-f8-anime2.ckpt` (Waifu Diffusion等で使用)
- SD 2.x系モデル向け: モデルと一緒に配布されている`vae`フォルダ内のファイル。
ステップ3:WebUIでVAEを設定する
1. WebUIの「Settings」タブを開きます。
2. 左側のメニューから「Stable Diffusion」を選択します。
3. 「SD VAE」のドロップダウンメニューを探します。
4. メニューから、ステップ2で配置した適切なVAEを選択します(例:`vae-ft-mse-840000-ema-pruned`)。
5. 画面最上部の「Apply settings」をクリックし、続いて「Reload UI」をクリックして設定を反映させます。

ステップ4:「NansException」エラーの対処法
正しいVAEを選択しても上記のエラーが発生する場合、VAEの計算精度に関する問題です。以下の2つの方法で解決できます。
方法A:WebUIの設定を変更する(推奨)
1. 「Settings」→「Stable Diffusion」に移動。
2. 「VAE precision」の設定を「FP32 (full precision)」または「FP16 without fallback」に変更します。
3. 「Apply settings」→「Reload UI」。
方法B:コマンドライン引数を追加する
WebUIを起動するバッチファイル(`webui-user.bat`)を編集します。
@echo off
set COMMANDLINE_ARGS=--no-half-vae --precision full --no-half
...(以下既存の設定)
`–no-half-vae`はVAEの計算を半精度(FP16)ではなく単精度(FP32)で行うように指示し、NaN(非数)の発生を防ぎます。
コード例・コマンド例
VAEの有無を簡易チェックするPythonスクリプト
モデルファイルにVAEが含まれているか(bakedか)を大まかに確認するスクリプトです。
import torch
from safetensors.torch import load_file
def check_vae_in_model(model_path):
try:
if model_path.endswith('.safetensors'):
state_dict = load_file(model_path)
else:
state_dict = torch.load(model_path, map_location='cpu')
# VAEに関連するキーワードを持つ重みを探す
vae_keys = [k for k in state_dict.keys() if 'first_stage_model' in k or 'decoder' in k or 'encoder' in k]
if vae_keys:
print(f"このモデルはVAE重みを含んでいる可能性が高いです (baked VAE)。検出されたキー数: {len(vae_keys)}")
# 最初の数個のキーを表示
for key in vae_keys[:5]:
print(f" - {key}")
else:
print("このモデルは明らかなVAE重みを含んでいないようです (baked VAEではない可能性が高い)。")
except Exception as e:
print(f"エラーが発生しました: {e}")
# 使用例
check_vae_in_model("your_model.safetensors")
Diffusersライブラリで明示的にVAEを読み込む例
from diffusers import StableDiffusionPipeline, AutoencoderKL
import torch
# 1. モデルとVAEを別々に指定して読み込む(baked VAEではない場合)
model_id = "path/to/your/model"
vae_id = "stabilityai/sd-vae-ft-mse" # またはローカルパス
vae = AutoencoderKL.from_pretrained(vae_id, torch_dtype=torch.float16)
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
vae=vae, # 明示的にVAEを渡す
torch_dtype=torch.float16,
safety_checker=None # 必要に応じて
).to("cuda")
# 2. baked VAEモデルを読み込む(VAEを指定しない)
pipe_baked = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", # SD1.5はbaked VAE
torch_dtype=torch.float16
).to("cuda")
まとめ・補足情報
VAEの適切な選択は、Stable Diffusionで高品質な画像を生成するための必須のステップです。問題が発生した際のチェックリストは以下の通りです。
- 画像が暗い/色味がおかしい → モデルに合った外部VAEを設定する。
- 「NansException」エラー → `–no-half-vae` 引数の追加または設定でVAEの計算精度をFP32に変更する。
- 画質に不満がある → baked VAEモデルでも、高品質な外部VAEに差し替えてみる。
補足情報:
- 多くの場合、モデルの作者が推奨するVAEを使用することが最も安全です。説明文を必ず確認しましょう。
- VAEを差し替えても、生成される画像の「構図」や「スタイル」が大きく変わることは稀です。主に「色味」「明るさ」「詳細表現」が改善されます。
- メモリ使用量に注意:高精度なVAE(FP32)はVRAMを多く消費します。メモリ不足の場合は、生成バッチサイズを減らすなどの調整が必要です。
- LoRA/LyCORISを使用する場合:これらはモデルに追加されるアダプタなので、ベースモデルが使用するVAEの設定がそのまま適用されます。LoRA単体でVAEを含むことはほとんどありません。
VAEの理解と適切な設定は、Stable Diffusionを使いこなす上での重要な基礎知識です。本ガイドを参考に、思い通りの高品質な画像生成を実現してください。