問題の概要:複数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に適用することを可能にします。
- ワークフローで、`Checkpoint Loader` から出力された `MODEL` と `CLIP` を `Lora Loader Stack` ノードの入力に接続します。
- ノードのプロパティで、`lora_name` フィールドに適用したいLoRAのファイル名(拡張子なし)をカンマ区切りで列挙します(例: `sd15_lora_style, sd15_lora_dress`)。
- `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.’」の解決
このエラーが発生した場合、以下の手順で対処します。
- モデルの互換性確認: 使用しているベースチェックポイントとLoRAのバージョン(SD1.5 vs SDXL)が一致していることを最初に確認してください。LoRAファイル名や説明文が手がかりになります。
- LoRAの再ダウンロード/変換: LoRAファイルが破損している可能性があります。信頼できるソースから再ダウンロードするか、`.safetensors` 形式のファイルを使用するようにします。
- カスタムノード「Lora Loader (Advanced)」の使用: 一部のカスタムノードは、互換性のないキーを無視したり、強制的に読み込もうとするオプションを提供しています。Impact Packの `Lora Loader (Advanced)` ノードでは、`strength` の他に `model` と `clip` への影響を分離して設定できる場合があり、エラーを回避できることがあります。
- 最終手段:モデルの再マージ: 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の表現力を劇的に拡張する強力な技術となります。