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

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

ComfyUIで複数のLoRA(Low-Rank Adaptation)モデルを1つの画像生成ワークフローに適用しようとすると、ユーザーは主に2つの課題に直面します。1つ目は、複数のLoRAの影響を適切に調整・制御する方法に関する技術的な課題です。単純に複数のLoRAをロードして適用するだけでは、意図しない画風の混在や、特定のLoRAの特徴が強すぎる/弱すぎるといった結果になることが頻繁にあります。

2つ目は、実際の操作中に発生する具体的なエラーです。特に、異なる作者やバージョンで作成されたLoRAを組み合わせて使用する際、以下のようなエラーメッセージが表示され、ワークフローがクラッシュすることがあります。

KeyError: 'diffusion_model'
# または
Error occurred when executing LoraLoader: 'down_blocks.0...'
# あるいは
RuntimeError: The size of tensor a (320) must match the size of tensor b (1280)...

本記事では、複数のLoRAを効果的に活用するための重み調整テクニックと、それに伴う一般的なエラーの解決方法をステップバイステップで解説します。

原因の解説

1. 重み調整が難しい理由

各LoRAモデルは、安定拡散モデルの特定のニューラルネットワーク層に「追加の重み」として適用されます。複数のLoRAを同時に適用すると、これらの追加重みが同じ層に加算され、互いに干渉し合います。重みの値(strength)が適切でないと、一方のLoRAの特徴が他方を打ち消したり、不自然なアーティファクトを生み出したりする原因となります。

2. 「KeyError」や「RuntimeError」が発生する根本原因

これらのエラーは、主に以下の3つの互換性問題に起因しています。

a) ベースモデルとの互換性: LoRAは特定のベースモデル(例:SD1.5, SDXL)に対して学習されています。異なるアーキテクチャのモデルに適用しようとすると、層の名前や次元が一致せず「KeyError」が発生します。

b) LoRA同士の学習設定の不一致: 異なる解像度やRank値(LoRAの内部次元)で学習されたLoRAを組み合わせると、テンソルの形状が合わず「RuntimeError」が発生します。

c) メタデータの欠如または破損: 一部のLoRAファイルには、ComfyUIが正しくロードするために必要なメタデータが含まれておらず、ノードがモデルを適切にマージできなくなります。

解決方法:ステップバイステップガイド

ステップ1:基本ワークフローの構築

まず、単一のLoRAが正しく動作する最小限のワークフローを構築します。ComfyUIの標準ノード「LoraLoader」を使用します。この段階でエラーが発生する場合は、LoRAファイルまたはベースモデル自体に問題がある可能性が高いです。

ステップ2:複数LoRA適用の基本形

複数のLoRAを適用する最も単純な方法は、「LoraLoader」ノードを直列に接続する方法です。1つ目のLoraLoaderの出力(MODEL)を2つ目のLoraLoaderの入力(MODEL)に接続します。各ノードで異なるLoRAファイルと重み(strength)を設定します。

ワークフロー例:
[CheckpointLoader] -> [LoraLoader A (weight=0.8)] -> [LoraLoader B (weight=0.5)] -> [CLIP] & [KSampler]...

この方法では、後ろのLoRAが前のLoRAをロードした後のモデルにさらに追加されるため、重みは累積的に影響します。

ステップ3:高度な重み調整テクニック

直列接続だけでは細かい制御が難しい場合、以下のテクニックを用います。

a) 重みのマイナス値の活用: 特定のLoRAの影響を「打ち消す」ために、strengthにマイナス値(例: -0.3)を設定できます。例えば、画風が強すぎるLoRAの影響を弱めたい場合に有効です。

b) プロンプトによる重み指定: CLIP Text Encodeノードにおけるプロンプト記法を活用します。特定のLoRAにのみ強く重みをかけたいトリガーワードには (trigger_word:1.3) のように強度を指定し、他のLoRAのトリガーワードは [trigger_word:0.7] のように弱めます。これにより、プロンプトエリアごとの影響度を調整可能です。

c) 「Lora Loader Stack」カスタムノードの使用(上級者向け): ComfyUI Managerから「ComfyUI-Custom-Scripts」などのカスタムノードをインストールすると、複数のLoRAとその重みを一括管理できる専用ノードが利用可能になる場合があります。これによりワークフローが整理され、調整が容易になります。

ステップ4:エラー「KeyError: ‘diffusion_model’」への対処

このエラーが発生した場合、以下の手順で解決を試みてください。

1. ベースモデルの確認: 使用しているチェックポイント(安定拡散モデル)が、LoRAの学習元と一致しているか確認します。SD1.5用LoRAをSDXLモデルに適用しようとしていないか注意してください。

2. LoRAファイルの再ダウンロード/変換: LoRAファイルが破損している可能性があります。可能であれば、別のソースから再ダウンロードするか、元の学習者にSD1.5/ SDXLどちら用かを確認します。CivitAIなどのサイトでは、モデルページに「Base Model」の記載があります。

3. 「LoraLoader」ノードの代わりに「Lora Loader (Simple)」を使用: コミュニティで提供される一部のカスタムノードは、内部処理が異なりエラーを回避できる場合があります。ComfyUI Managerで「Efficiency Nodes」などをインストールして試してみてください。

4. LoRAのマージを試みる(最終手段): 外部ツール(Kohya-ssのマージスクリプトやWebUIの「Additional Networks」拡張機能など)を使用して、あらかじめ複数のLoRAを1つのsafetensorsファイルにマージします。その後、そのマージ済みファイルを単一のLoRAとしてComfyUIに読み込ませます。これにより互換性問題は解消されますが、重みの動的調整はできなくなります。

コード例・コマンド例

エラーログの確認例

エラー発生時、ComfyUIのコンソールまたはターミナルには詳細なログが出力されます。問題の層を特定するために以下のような部分を探します。

Loading lora: "style_lora.safetensors"
Traceback (most recent call last):
  File "...comfyexecution.py", line 176, in recursive_execute
    output_data, output_ui = get_output_data(obj, input_data_all)
  File "...comfyexecution.py", line 119, in get_output_data
    return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True)
  File "...comfyexecution.py", line 97, in map_node_over_list
    results.append(getattr(obj, func)(**slice_dict(input_data_all, i)))
  File "...comfyextrasnodes_loras.py", line 60, in load_lora
    key = "lora_unet_down_blocks_0_attentions_0_proj_in"
KeyError: 'lora_unet_down_blocks_0_attentions_0_proj_in'

このログは、LoRAファイルが期待する層のキー名(’lora_unet_down_blocks_0_attentions_0_proj_in’)が、現在のベースモデルの中に見つからなかったことを示しています。

推奨ワークフロー設定例

以下は、キャラクターLoRAと画風LoRAを組み合わせ、プロンプトで重みを微調整する例です。

Positive Prompt:
(masterpiece, best quality), 1girl, (character_lora_trigger:1.2),
in a forest, (painting_style_lora_trigger:0.9), vibrant colors

Negative Prompt:
(worst quality, low quality:1.4)

Workflow Connection:
CheckpointLoader -> LoraLoader(character.safetensors, strength=0.8)
                -> LoraLoader(style.safetensors, strength=0.6)
                -> CLIP Text Encode (Positive/Negative)
                -> KSampler...

この設定では、キャラクターLoRAはファイル読み込み時点で強度0.8、さらにプロンプト内でそのトリガーワードを1.2倍に強調しています。画風LoRAは基本強度0.6、プロンプト内では0.9倍とやや抑えめにしています。

まとめ・補足情報

ComfyUIで複数のLoRAを活用するには、単なる適用ではなく「重みの調整」が鍵となります。直列接続による基本形から始め、マイナス重みやプロンプト指定による微調整を組み合わせることで、創造性の幅が大きく広がります。

エラーが発生した際は、まずベースモデルとLoRAの互換性を疑い、次にファイルの完全性を確認するという系統的なトラブルシューティングが有効です。コミュニティで共有されている多くのLoRAはSD1.5用であることを念頭に置き、SDXLを使用する際は特に注意が必要です。

最後に、複雑なLoRAの組み合わせは生成結果の予測を難しくします。良い結果を得るためには、各LoRAの単体での挙動を理解した上で、少しずつ重みを変化させながら試行錯誤を繰り返すことが最も確実な方法です。このプロセス自体が、AI画像生成における重要な「創作作業」の一部なのです。

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