このプロジェクトはこちらへ移動しました。 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
の行列