- Model merge extention for AUTOMATIC1111's stable-diffusion-webui
- Merge models can be loaded directly for generation without saving
すべての更新履歴はこちらにあります。
All updates can be found here.
-
ランダムマージモードが追加されました
-
モデルの描き込み・色調調整機能を追加しました
-
機能更新, コサイン類似度を用いた最適値計算機能を強化しました詳細
-
新機能, 新しいマージ方式tensorを導入しました 詳細
-
XYプロットに新しい軸タイプを追加しました : calcmode,prompt
一部LoRA関係の機能を使用する場合diffusers(0.10.2以降),sklearnが必要です。
このextentionではモデルをマージした際、保存せずに画像生成用のモデルとして読み込むことができます。 これまでマージしたモデルはいったん保存して気に入らなければ削除するということが必要でしたが、このextentionを使うことでHDDやSSDの消耗を防ぐことができます。
通常のマージです。alphaが使用されます。α=0の場合Model A, α=1 の時model Bになります。
差分マージです。
マージを3モデル同時に行います。alpha,betaが使用されます。モデル選択窓が3つあったので追加した機能ですが、ちゃんと動くようです。MBWでも使えます。それぞれMBWのalpha,betaを入力してください。
Weight sumを2回行います。alpha,betaが使用されます。MBWモードでも使えます。それぞれMBWのalpha,betaを入力してください。
チェックするとブロックごとのマージ(階層マージ)が有効になります。各ブロックごとの比率は下部のスライダーかプリセットで設定してください。
cosineを選択すると、設定されたマージ比率を中心として、コサイン類似度を用いた比較を行い、マージによるロスをなくすような比率を計算し、その比率を用いてマージを行います。
詳しくは下記を参照して下さい(英語です)
考案されたrecoilme氏とこの手法を紹介し最適化してくれたSwiftIllusion氏に感謝します。
hako-mikan#33
https://github.com/recoilme/losslessmix
save metadataを有効にするとマージ条件をメタデータとして埋め込めます。safetensor形式のみ有効です。埋め込まれた条件はMetadataタブで確認できます。
マージした後、生成用モデルとして読み込みます。 左上のモデル情報とは違うモデルがロードされていることに注意してください。 左上のモデル選択画面でモデルを選択しなおすとリセットされます
text2imageタブの設定で画像生成を行います
マージしたのち画像を生成します
マージログから設定を読み込みます。ログはマージが行われるたびに更新され、1から始まる連番のIDが付与されます。IDを生成される画像やPNG infoに記載することも可能で、write merged model ID toから設定してください。-1でSetをすると最後にマージした設定を読み出します。マージログはextention/sd-webui-supermerger/mergehistory.csvに保存されます。他アプリで開いた状態だと読み取りエラーを起こすので注意してください。Historyタブで閲覧や検索が可能です。検索は半角スペースで区切ることでand/or検索が可能です。
Hires-fixを有効化できます。batch sizeを変更できます。batch sizeはXY plotでは無効化されます。
こちらを参照して下さい。
連続マージ画像生成を行います。すべてのマージモードで有効です。
アルファ、ベータを変更します。tensorモードでも有効です。
アルファ、ベータを同時に変更します。アルファ、ベータの間は半角スペースで区切り、各要素はカンマで区切ってください。数字ひとつの場合はアルファベータ共に同じ値が入力されます。tensorモードでも有効です。
例: 0,0.5 0.1,0.3 0.4,0.5
階層マージを行います。改行で区切った比率を入力してください。プリセットも使用可能ですが、改行で区切ることに注意をして下さい。Triple,Twiceの場合は2行で1セットで入力して下さい。奇数行だとエラーになります。
シードを変更します。-1と入力すると、反対の軸方向には固定されたseedになります。
モデルを変更します。モデル選択窓で選択されたモデルは無視されます。
MBWにおいて特定のブロックのみを変化させます。反対の軸はalphaまたはbetaを選んでください。ブロックIDを入力すると、そのブロックのみalpha(beta)が変わります。他のタイプと同様にカンマで区切ります。スペースまたはハイフンで区切ることで複数のブロックを同時に変化させることもできます。最初にNOTをつけることで変化対象が反転します。NOT IN09-OUT02とすると、IN09-OUT02以外が変化します。NOTは最初に入力しないと効果がありません。
IN01,OUT10 OUT11, OUT03-OUT06,OUT07-OUT11,NOT M00 OUT03-OUT06 この場合
- 1:IN01のみ変化
- 2:OUT10およびOUT11が変化
- 3:OUT03からOUT06が変化
- 4:OUT07からOUT11が変化
- 5:M00およびOUT03からOUT06以外が変化
ブロックID(大文字のみ有効) BASE,IN00,IN01,IN02,IN03,IN04,IN05,IN06,IN07,IN08,IN09,IN10,IN11,M00,OUT00,OUT01,OUT02,OUT03,OUT04,OUT05,OUT06,OUT07,OUT08,OUT09,OUT10,OUT11
計算方式を変更します。適用できるマージモードとの対応に注意して下さい。カンマで区切ります
プロンプトを変更できます。txt2imgのプロンプトは無視されます。ネガティブプロンプトは有効です。 改行で区切ることに注意をして下さい。
Reserve XY plotボタンはすぐさまプロットを実行せず、ボタンを押したときの設定のXYプロットの実行を予約します。予約したXYプロットは通常のXYプロットが終了した後か、ReservationタブのStart XY plotボタンを押すと実行が開始されます。予約はXYプロット実行時・未実行時いつでも可能です。予約一覧は自動更新されないのでリロードボタンを使用してください。エラー発生時はそのプロットを破棄して次の予約を実行します。すべての予約が終了するまで画像は表示されませんが、Finishedになったものについてはグリッドの生成は終わっているので、Image Browser等で見ることが可能です。
「|」を使用することで任意の場所で予約へ移動することも可能です。
0.1,0.2,0.3,0.4,0.5|0.6,0.7,0.8,0.9,1.0とすると
0.1,0.2,0.3,0.4,0.5
0.6,0.7,0.8,0.9,1.0
というふたつの予約に分割され実行されます。これは要素が多すぎてグリッドが大きくなってしまう場合などに有効でしょう。
ランダムにマージ比率を決定します。一度の複数のランダムマージが行えます。比率は各ブロック、各エレメントごとにランダムにすることが可能です。
Let the Dice rollで使用できます。Random Mode
を選択しRun Rand
を押すとNum of challenge
の回数分ランダムにウェイトが設定されて画像が生成されます。生成はXYZモードで動作するのでSTOP
ボタンが有効です。Seed for Random Ratio
は-1
に設定して下さい。Num of challengeの回数が2回以上の場合、自動的に-1に設定されます。同じseedを使うと再現性があります。生成数が10を超える場合グリッドは自動的に2次元になります。Settings
のalpha
、beta
はチェックするとランダム化されます。Elementalの場合beta
は無効化されます。
26ブロックすべてに対してランダムなウェイトが設定されます。R
、U
、X
の違いは乱数の値の範囲です。Xは各層に対してlower limit
~ upper limit
で指定します。
R : 0 ~ 1
U : -0.5 ~ 1.5
X : lower limit ~ upper limit
Elementすべてに対してランダムなウェイトが設定されます。ER
、EU
、EX
の違いは乱数の値の範囲です。Xは各層に対してlower limit
~ upper limit
で指定します。
ランダム化される階層を指定します。costom
で指定します。
R
、U
、X
、ER
、EU
、EX
が使用できます。
例:
U,0,0,0,0,0,0,0,0,0,0,0,0,R,R,R,R,R,R,R,R,R,R,R,R,R
U,0,0,0,0,0,0,0,0,0,0,0,0,ER,0,0,0,0,0,0,X,0,0,0,0,0
typeにrandom
を設定することで使用できます。ランダム化する回数を入力すると、回数分軸の要素が設定されます。
X type : seed, -1,-1,-1
Y type : random, 5
とすると、3×5のgridができ、5回分ランダムにウェイトが設定されたモデルで生成されます。ランダムかの設定はランダムのパネルで設定して下さい。ここがoff
では正常に動作しません。
モデルをメモリ上に保存することにより連続マージなどを高速化することができます。 キャッシュの設定はweb-uiのsettingから行ってください。
現在ロードされているモデルを消去します。これはkohya-ssのGUIを使用するときなどGPUメモリを開放するときに使用します。消去すると画像の生成はできません。生成する場合にはモデルを選び直して下さい。
LoRA関連の機能です。基本的にはkohya-ssのスクリプトと同じですが、階層マージに対応します。現時点ではV2.X系のマージには対応していません。
注意:LyCORISは構造が特殊なため単独マージのみに対応しています。単独マージの比率は1,0のみ使用可能です。他の値を用いるとsame to Strengthでも階層LoRAの結果と一致しません。 LoConは整数以外でもそれなりに一致します。
モデルにLoRAをマージします。複数のLoRAを同時にマージできます。
LoRA名1:マージ比率1:階層,LoRA名2:階層,マージ比率2,LoRA名3:マージ比率3・・・
と入力します。LoRA単独でも使用可能です。「:階層」の部分は無くても問題ありません。比率はマイナスを含めどんな値でも入力できます。合計が1にならないといけないという制約もありません(もちろん大きく1を越えると破綻します)。
ふたつのモデルの差分からLoRAを生成します。 demensionを指定すると指定されたdimensionで作製されます。無指定の場合は128で作製します。 alphaとbetaによって配合比率を調整することができます。(alpha x Model_A - beta x Model B) alpha, beta = 1が通常のLoRA作成となります。
colabで使用する場合に多くのエラーが発生することが報告されています。これは複数の原因によって発生しているようです。
まずはメモリの問題です。モデルはfp16モデルを使用することを推奨します。フルモデルを使用した場合8GB以上のメモリが必要になります。これはこのスクリプトが使用する量です。また、インストールされているdiffusersのバージョンが異なるとエラーが発生するようです。version 0.10.2で動作確認されています。
ひとつまたは複数のLoRA同士をマージします。kohya-ss氏の最新のスクリプトを使用しているので、dimensionの異なるLoRA同氏もマージ可能ですが、dimensionの変換の際はLoRAの再計算を行うため、生成される画像が大きく異なる可能性があることに注意してください。
calculate dimentionボタンで各LoRAの次元を計算して表示・ソート機能が有効化します。計算にはわりと時間がかかって、50程度のLoRAでも数十秒かかります。新しくマージされたLoRAはリストに表示されないのでリロードボタンを押してください。次元の再計算は追加されたLoRAだけを計算します。
same to Strengthオプションを使用しない場合は、kohya-ss氏の作製したスクリプトのマージと同じ結果になります。この場合、下図のようにWeb-ui上でLoRAを適用した場合と異なる結果になります。これはLoRAをU-netに組み込む際の数式が関係しています。kohya-ss氏のスクリプトでは比率をそのまま掛けていますが、適用時の数式では比率が2乗されてしまうため、比率を1以外の数値に設定すると、あるいはマイナスに設定するとStrength(適用時の強度)と異なる結果となります。same to Strengthオプションを使用すると、マージ時には比率の平方根を駆けることで、適用時にはStrengthと比率が同じ意味を持つように計算しています。また、マイナスが効果が出るようにも計算しています。追加学習をしない場合などはsame to Strengthオプションを使用しても問題ないと思いますが、マージしたLoRAに対して追加学習をする場合はだれも使用しない方がいいかもしれません。
下図は通常適用/same to Strengthオプション/通常マージの各場合の生成画像です。figma化とukiyoE LoRAのマージを使用しています。通常マージの場合はマイナス方向でも2乗されてプラスになっていることが分かります。
階層別マージについては下記を参照してください
https://github.com/bbc-mc/sdweb-merge-block-weighted-gui
このスクリプトではweb-ui、mbw-merge、kohya-ssのスクリプトを一部使用しています