【Stable Diffusion】VAE選択ガイド:baked VAEとの違いと「NansException」エラーの解決法

問題の概要: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」をクリックして設定を反映させます。

SD VAE設定画面

ステップ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で高品質な画像を生成するための必須のステップです。問題が発生した際のチェックリストは以下の通りです。

  1. 画像が暗い/色味がおかしい → モデルに合った外部VAEを設定する。
  2. 「NansException」エラー → `–no-half-vae` 引数の追加または設定でVAEの計算精度をFP32に変更する。
  3. 画質に不満がある → baked VAEモデルでも、高品質な外部VAEに差し替えてみる。

補足情報:

  • 多くの場合、モデルの作者が推奨するVAEを使用することが最も安全です。説明文を必ず確認しましょう。
  • VAEを差し替えても、生成される画像の「構図」や「スタイル」が大きく変わることは稀です。主に「色味」「明るさ」「詳細表現」が改善されます。
  • メモリ使用量に注意:高精度なVAE(FP32)はVRAMを多く消費します。メモリ不足の場合は、生成バッチサイズを減らすなどの調整が必要です。
  • LoRA/LyCORISを使用する場合:これらはモデルに追加されるアダプタなので、ベースモデルが使用するVAEの設定がそのまま適用されます。LoRA単体でVAEを含むことはほとんどありません。

VAEの理解と適切な設定は、Stable Diffusionを使いこなす上での重要な基礎知識です。本ガイドを参考に、思い通りの高品質な画像生成を実現してください。

この記事は役に立ちましたか?