【ComfyUI】LoRAを複数適用する際の重み調整テクニックと「KeyError: ‘diffusion_model.’」エラー解決法

問題の概要:複数LoRA適用時の重み調整とエラー

ComfyUIで複数のLoRA(Low-Rank Adaptation)モデルを1つの画像生成ワークフローに適用しようとすると、ユーザーは主に2つの課題に直面します。第一に、複数のLoRAを単純にロードして適用しただけでは、それぞれの影響度(重み)を細かく制御できず、意図した通りの画像が生成されないという問題です。第二に、ワークフローの構築や実行中に、モデルのキー関連エラーが頻繁に発生します。具体的には、以下のようなエラーメッセージがターミナルやComfyUIの画面に表示されることがあります。

KeyError: 'diffusion_model.'
RuntimeError: Error occurred when executing KSampler: The size of tensor a (320) must match the size of tensor b (1280) at non-singleton dimension 1
Error loading model: 'down_blocks.0.attentions.0.proj_in.weight'

これらの問題は、キャラクターの外見(スタイルLoRA)と特定の衣装(衣装LoRA)を組み合わせる、または背景(背景LoRA)と画風(画風LoRA)を融合させるなど、複数の概念を同時に反映させたい場合に顕著になります。単にLoRAを積み重ねるだけでは、影響が強すぎたり弱すぎたり、あるいは衝突してノイズの多い出力になったりするのです。

原因の解説

問題の根本原因は、モデルのマージ処理とLoRAの適用メカニズムにあります。

1. 重み調整ができない原因

ComfyUIの標準ノード(例: `LoraLoader`)は、単一のLoRAファイルとその強度(strength)を指定するように設計されています。複数の`LoraLoader`ノードをチェーンで接続して適用することは可能ですが、後から適用されるLoRAが前のLoRAの効果を上書きしたり、強度の掛け算が直感的でなかったりします。各LoRAがモデルのどの部分に、どの程度の重みで影響を与えるかを独立して制御する仕組みが、標準機能としては限られているのです。

2. 「KeyError」やサイズ不一致エラーの原因

このエラーは、適用しようとしているLoRAモデルと、ベースとなるStable Diffusionモデル(checkpoint)のアーキテクチャが互換性がない場合に発生します。主な原因は以下の通りです。

  • ベースモデルとLoRAのバージョン不一致: SD1.5用にトレーニングされたLoRAをSDXLベースモデルに適用しようとする(またはその逆)。
  • LoRAのフォーマット問題: 学習時の設定や保存形式によって、モデル内部のキー名(`diffusion_model.` で始まるレイヤー名など)が期待されるものと異なる。
  • カスタムモデルの特殊構造: 特定の派生モデル(DreamShaper, ChilloutMix等)は内部構造が微妙に変更されている場合があり、汎用LoRAとの互換性が失われる。

解決方法:重み調整テクニックとエラー回避

以下では、複数LoRAの重みを調整する実践的な方法と、エラーを回避する手順をステップバイステップで説明します。

ステップ1:環境とカスタムノードの確認

まず、ComfyUIマネージャーから、複数LoRAの重み調整に有用なカスタムノードがインストールされているか確認します。特に 「ComfyUI-Impact-Pack」 に含まれる `Lora Loader Stack (Impact)` ノードや、「WAS Node Suite」 のLoRA関連ノードは高度な制御を可能にします。インストールされていない場合は、マネージャーから追加してください。

ステップ2:「Lora Loader Stack」ノードによる重み調整

Impact Packの `Lora Loader Stack` ノードは、複数のLoRAとその個別の強度を一括して指定し、ベースモデルとCLIPに適用することを可能にします。

  1. ワークフローで、`Checkpoint Loader` から出力された `MODEL` と `CLIP` を `Lora Loader Stack` ノードの入力に接続します。
  2. ノードのプロパティで、`lora_name` フィールドに適用したいLoRAのファイル名(拡張子なし)をカンマ区切りで列挙します(例: `sd15_lora_style, sd15_lora_dress`)。
  3. `strength_model` と `strength_clip` フィールドに、それぞれに対応する強度をカンマ区切りの数値で指定します(例: `0.8, 0.5`)。これで、最初のLoRAはモデル強度0.8、CLIP強度0.8、2番目のLoRAはモデル強度0.5、CLIP強度0.5で適用されます。

この方法により、各LoRAの影響度を数値で精密にコントロールできます。

ステップ3:エラー「KeyError: ‘diffusion_model.’」の解決

このエラーが発生した場合、以下の手順で対処します。

  1. モデルの互換性確認: 使用しているベースチェックポイントとLoRAのバージョン(SD1.5 vs SDXL)が一致していることを最初に確認してください。LoRAファイル名や説明文が手がかりになります。
  2. LoRAの再ダウンロード/変換: LoRAファイルが破損している可能性があります。信頼できるソースから再ダウンロードするか、`.safetensors` 形式のファイルを使用するようにします。
  3. カスタムノード「Lora Loader (Advanced)」の使用: 一部のカスタムノードは、互換性のないキーを無視したり、強制的に読み込もうとするオプションを提供しています。Impact Packの `Lora Loader (Advanced)` ノードでは、`strength` の他に `model` と `clip` への影響を分離して設定できる場合があり、エラーを回避できることがあります。
  4. 最終手段:モデルの再マージ: GUIツール(Kohya-ss GUIの「LoRAのマージ」機能など)を使用して、問題のLoRAを互換性のあるベースモデルと事前にマージし、単一のチェックポイントファイルとしてComfyUIで読み込む方法もあります。これにより、LoRA適用段階でのキーエラーを根本から回避できます。

コード例・コマンド例

ワークフローAPI実行例(複数LoRA適用)

ComfyUIのAPIをプログラムから呼び出す場合、`LoraLoader` ノードを連鎖させるJSONワークフロー定義は以下のようになります。この例では、2つのLoRAを異なる強度で適用しています。

{
  "3": {
    "class_type": "LoraLoader",
    "inputs": {
      "model": ["1", 0], // ベースモデルからの接続
      "clip": ["1", 1],  // ベースCLIPからの接続
      "lora_name": "style_lora.safetensors",
      "strength_model": 0.7,
      "strength_clip": 0.9
    }
  },
  "4": {
    "class_type": "LoraLoader",
    "inputs": {
      "model": ["3", 0], // 1つ目のLoRA適用後のモデル
      "clip": ["3", 1],  // 1つ目のLoRA適用後のCLIP
      "lora_name": "dress_lora.safetensors",
      "strength_model": 0.4, // 2つ目のLoRAは弱めに
      "strength_clip": 0.4
    }
  }
  // ... 以降、サンプラーなどに "4" の出力を接続
}

注意点: この連鎖方式では、後続のLoRAの強度は、すでに前のLoRAが適用されたモデルに対して相対的に適用されます。絶対的な強度調整には前述の `Lora Loader Stack` ノードを使用する方が直感的です。

エラーログの確認コマンド

ComfyUIをコマンドラインから起動している場合、エラーの詳細はターミナルに表示されます。エラー発生時に以下のようなスタックトレースを確認し、`KeyError` の後ろにある具体的なキー名を手がかりに問題のLoRAを特定できます。

(comfyui) $ python main.py
...
Loading lora: style_lora.safetensors
Traceback (most recent call last):
  File "...comfyextrasnodes.py", line 1234, in load_lora
    key = 'diffusion_model.' + k
KeyError: 'diffusion_model.input_blocks.1.1.transformer_blocks.0.attn2.to_k.weight'
# このエラーは、LoRAに含まれるキー 'input_blocks.1.1...' が、
# 現在のベースモデルでは 'diffusion_model.' プレフィックス付きで見つからないことを意味する。

まとめ・補足情報

ComfyUIで複数のLoRAを効果的に活用するには、単なる適用ではなく「重み調整」という考え方が不可欠です。`Lora Loader Stack` のようなカスタムノードを利用すれば、各LoRAの影響度を数値で微調整し、意図した画像合成を実現できる可能性が大幅に高まります。

また、頻発するキーエラーは、使用するモデル群のバージョン一致性を常に意識することで、多くを未然に防ぐことができます。SD1.5とSDXLは生態系が分かれつつあるため、LoRAを探す際もそのバージョンを第一のフィルターとする習慣をつけましょう。

補足:実験的アプローチ どうしても互換性のないLoRAを使いたい場合、`.safetensors` ファイルを直接編集するツール(`safetensors` Pythonライブラリ等)を用いて、キー名のプレフィックスを書き換えるという荒業もありますが、モデル破損のリスクが高いため、バックアップを取った上で慎重に行ってください。多くの場合、適切なモデルとLoRAの組み合わせを見つける方が、近道であり確実です。

複数LoRAの調整は試行錯誤が必要な作業ですが、適切なツールと知識を持てば、Stable Diffusionの表現力を劇的に拡張する強力な技術となります。

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