checkpointが読み込めない【バグ:RuntimeError】

2023年8月15日

広告

記事内容

ランタイムエラー

stable-diffusion-webuiのバージョンを「v1.4.0」に更新後に一部のcheckpointがランタムエラーで読み込めない現象の回避方法を紹介します。

症状

checkpoint(モデル)ファイルを沢山集めていますがstable-diffusion-webuiのバージョンアップ後に、ホンの一部ですがモデルが読み込めない状態に陥りました。

読み込めないcheckpointモデルは「facebombmix_v1.safetensors」と他、数点 ありました。

エラーの症状から説明します。

facebombmixに切り替えようとすると読み込む動作はしますがエラーが出てしまい、切り替え前のcheckpointモデルに戻ってしまいます。

エラーログの一部は以下の通り、(データー量が多くて1/10程度の記載)

Loading weights [aad629159b] from F:\stable-diffusion-webui\models\Stable-diffusion\3D\facebombmix_v1.safetensors
Loading VAE weights found near the checkpoint: F:\stable-diffusion-webui\models\VAE\facebombmix_v1Bakedvae.safetensors
Failed to load checkpoint, restoring previous
Loading weights [07f029f6d1] from F:\stable-diffusion-webui\models\Stable-diffusion\3D\cartoonish_v1.safetensors
Applying attention optimization: Doggettx... done.
changing setting sd_model_checkpoint to 3D\facebombmix_v1.safetensors [aad629159b]: RuntimeError
Traceback (most recent call last):
  File "F:\stable-diffusion-webui\modules\shared.py", line 605, in set
    self.data_labels[key].onchange()
  File "F:\stable-diffusion-webui\modules\call_queue.py", line 13, in f
    res = func(*args, **kwargs)
  File "F:\stable-diffusion-webui\webui.py", line 226, in <lambda>
    shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights()), call=False)
  File "F:\stable-diffusion-webui\modules\sd_models.py", line 556, in reload_model_weights
    load_model_weights(sd_model, checkpoint_info, state_dict, timer)
  File "F:\stable-diffusion-webui\modules\sd_models.py", line 336, in load_model_weights
    sd_vae.load_vae(model, vae_file, vae_source)
  File "F:\stable-diffusion-webui\modules\sd_vae.py", line 143, in load_vae
    _load_vae_dict(model, vae_dict_1)
  File "F:\stable-diffusion-webui\modules\sd_vae.py", line 168, in _load_vae_dict
    model.first_stage_model.load_state_dict(vae_dict_1)
  File "F:\stable-diffusion-webui\venv\lib\site-packages\torch\nn\modules\module.py", line 2041, in load_state_dict
    raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for AutoencoderKL:
        Missing key(s) in state_dict: "encoder.conv_in.weight", "encoder.conv_in.bias", "encoder.down.0.block.0.norm1.weight", "encoder.down.0.block.0.norm1.bias", "encoder.down.0.block.0.conv1.weight", "encoder.down.0.block.0.conv1.bias", "encoder.down.0.block.0.norm2.weight", "encoder.down.0.block.0.norm2.bias", "encoder.down.0.block.0.conv2.weight", "encoder.down.0.block.0.conv2.bias", "encoder.down.0.block.1.norm1.weight", "encoder.down.0.block.1.norm1.bias", "encoder.down.0.block.1.conv1.weight", "encoder.down.0.block.1.conv1.bias", "encoder.down.0.block.1.norm2.weight", "encoder.down.0.block.1.norm2.bias", "encoder.down.0.block.1.conv2.weight", "encoder.down.0.block.1.conv2.bias", "encoder.down.0.downsample.conv.weight", "encoder.down.0.downsample.conv.bias", "encoder.down.1.block.0.norm1.weight", "encoder.down.1.block.0.norm1.bias", "encoder.down.1.block.0.conv1.weight", "encoder.down.1.block.0.conv1.bias", "encoder.down.1.block.0.norm2.weight", "encoder.down.1.block.0.norm2.bias", "encoder.down.1.block.0.conv2.weight", "encoder.down.1.block.0.conv2.bias", "encoder.down.1.block.0.nin_shortcut.weight", "encoder.down.1.block.0.nin_shortcut.bias", "encoder.down.1.block.1.norm1.weight", "encoder.down.1.block.1.norm1.bias", "encoder.down.1.block.1.conv1.weight", "encoder.down.1.block.1.conv1.bias", "encoder.down.1.block.1.norm2.weight", "encoder.down.1.block.1.norm2.bias", "encoder.down.1.block.1.conv2.weight", "encoder.down.1.block.1.conv2.bias", "encoder.down.1.downsample.conv.weight", "encoder.down.1.downsample.conv.bias", "encoder.down.2.block.0.norm1.weight", "encoder.down.2.block.0.norm1.bias",

ネット上の情報

ネツト上にも少ないですが情報は存在します。

[バグ]: SD v2.0-768 “ランタイムエラー: 潜在拡散のstate_dictの読み込み中にエラーが発生しました" ·問題 #5070 ·自動1111/安定拡散ウェブ ·ティッカー (github.com)

この記事に書かれている対策を行いましたが 結論としては上手く機能しませんでした。

内容は以下のデーターをメモ帳に貼り付け、ファイル名を「facebombmix_v1」に、拡張子を「,YAML]に変更してcheckpointモデルと同じフォルダーに保管すると読み込める様に成ると書かれています、ですがこの情報2022年の物ですのでstable-diffusionバージョンアップで対策は行われていると思われます。

model:
  base_learning_rate: 1.0e-4
  target: ldm.models.diffusion.ddpm.LatentDiffusion
  params:
    parameterization: "v"
    linear_start: 0.00085
    linear_end: 0.0120
    num_timesteps_cond: 1
    log_every_t: 200
    timesteps: 1000
    first_stage_key: "jpg"
    cond_stage_key: "txt"
    image_size: 64
    channels: 4
    cond_stage_trainable: false
    conditioning_key: crossattn
    monitor: val/loss_simple_ema
    scale_factor: 0.18215
    use_ema: False # we set this to false because this is an inference only config

    unet_config:
      target: ldm.modules.diffusionmodules.openaimodel.UNetModel
      params:
        use_checkpoint: True
        use_fp16: True
        image_size: 32 # unused
        in_channels: 4
        out_channels: 4
        model_channels: 320
        attention_resolutions: [ 4, 2, 1 ]
        num_res_blocks: 2
        channel_mult: [ 1, 2, 4, 4 ]
        num_head_channels: 64 # need to fix for flash-attn
        use_spatial_transformer: True
        use_linear_in_transformer: True
        transformer_depth: 1
        context_dim: 1024
        legacy: False

    first_stage_config:
      target: ldm.models.autoencoder.AutoencoderKL
      params:
        embed_dim: 4
        monitor: val/rec_loss
        ddconfig:
          #attn_type: "vanilla-xformers"
          double_z: true
          z_channels: 4
          resolution: 256
          in_channels: 3
          out_ch: 3
          ch: 128
          ch_mult:
          - 1
          - 2
          - 4
          - 4
          num_res_blocks: 2
          attn_resolutions: []
          dropout: 0.0
        lossconfig:
          target: torch.nn.Identity

    cond_stage_config:
      target: ldm.modules.encoders.modules.FrozenOpenCLIPEmbedder
      params:
        freeze: True
        layer: "penultimate"

ハードの状態

checkpointモデルは (2,082,643KB)意外と大きなデーターですPythonの使用メモリー不足を疑いましたが物理メモリー量の半分50%程度ですので問題は無いようです。

stable-diffusionはVRAMを使うので物理メモリー量は対して問題になりません、分かっては居たのですが念のためです。

改善方法

説明でネタバレしてますが、問題なのは「facebombmix_v1.safetensors」のファイル名です。「f]の文字なのか「facebombmix」全体が問題なのか原因は定かでは有りませんがファイル名を崩してやれば問題は解決します。

「facebombmix_v1.safetensors」の頭の「f」の文字を消す、又は 「1_facebombmix_v1.safetensors」の様に最初に「1_」を加えて「f」が先頭にならない様にすると読み込まれる様になります。

原因が分かれば簡単に対応できますが、原因の特定に苦戦してしまいました。
恐らくface(フェイス)と言う単語がプログラム上で使われており、ファイル名を習得した時点でエラーを誘発させたのではないのかと思います。顔・手・足など良く使われる単語のファイル名はエラーになる可能性が高いかもしれません。