このプロジェクトはこちらへ移動しました。 https://github.com/laksjdjf/cgem156-ComfyUI/tree/main/scripts/lora_merger
このリポジトリはComfyUI上でLoRAのマージを実装したものです。

全てのノードはlora_mergeに入っています。
Load LoRA Weight Only: LoRAを単体で読み込みます。LoRA LoRA from Weight: LoRAをモデルに適用します。Merge LoRA: 二つのLoRAをマージします。Save LoRA: LoRAをComfyUI/models/lorasにセーブします。※設定したstrengthを適用したLoRAが保存されます。
4つ設定があります。dtypeはLoRAの型になります。ファイルサイズを軽くしたいときはfloat16やbfloat16にしてください。
rank, deviceはmodeをsvdにしたときのみ参照されます。
modeの説明:
add:加算によってマージします。二つのLoRAのrankがイコールではない場合、エラーが起きます。また二つのLoRAが全く違うものである場合精度は低くなります。concat:結合によってマージします。rankは二つのLoRAの合計になってしまいますが、正確なマージになります。svd:特異値分解を利用してマージします。rankを設定することで、自由にマージ先のrankを変えることができます。ただし時間がかかるほか、精度も少し落ちます。deviceでGPUで計算するかCPUで計算するか選べます。
LoRA LoRA from Weightのlbw欄に、sd-webui-lora-block-weightに沿った文字列を記入するといい感じになります。プリセットはpreset.txtで追加できます。RとかUには未対応です。
- メタデータのことはよく分からないので何も考慮してません。
- LyCORISのLoHAやLokrには未対応です。というかこれらはマージできるのか?
- 異なる学習コードで作成されたLoRA同士のマージはうまくいかない可能性があります。
二つのLoRAのup層、down層、alpha、rank、strengthをそれぞれ、
すると、欲しいLoRAは、以下の通りです。
1.どちらか一方のLoRAにしかないモジュールについて
片方しかない場合、ある方
とします。行列積をとることを考えて、
- 両方ある場合
モードによって異なります。
add:
down層、up層をそれぞれ重み付き加算することによってマージします。
とします。
となります。正直意味わからないんですが、同じLoRAを
concat:
down層、up層をそれぞれrank方向に結合することによってマージします。
とします。
svd
として rankの行列