どこよりも丁寧に画像付きで解説。Stable Diffusion web UI(AUTOMATIC1111)の拡張機能タブ(Extension)から「Merge Block Weighted GUI」を用いて、各種設定項目の意味と設定方法、層別マージの出力画像への影響をU-Net層ごとにまとめました。
層別マージは複雑なため、モデルマージ初心者はただのマージから始めるのがおすすめです。
1,まずMerge Block Weighted GUIをインストール
https://github.com/bbc-mc/sdweb-merge-block-weighted-gui
コチラを参考にながら上記URLを使って「Merge Block Weighted GUI」をインストールします。
このようになればインストールできています。

拡張機能をインストールしたらWebUIを再起動しましょう。
2,Merge Block Weightedの各種設定項目解説

Merge Block Weightedには旧バージョンの「MBW」タブと、新バージョンの「MBW Each」があります。
各層の値をモデル別に設定できる新バージョン「MBW Each」の設定項目をここでは解説しています。基本みんな新しい方を使うと思うので。
Model A/Model B Output Model Name

Model A/Model Bで混ぜたい2つのモデルを選択します。

Output Model Nameで完成したマージモデルの保存名を設定します。
IN00~IN11/OUT11~OUT00/M00

- 「INxx」は入力ブロックで全12ブロックあります
- 「OUTxx」は出力ブロックで、同様に全12ブロックあります
- 00層が一番浅い層で、11が一番深い層です
- 「M00」は中間ブロックで1ブロックだけあります
基本的に上記の値を色々変えてモデルを混ぜていくのが階層別マージです。
Model A/Model Bの割合を各層ごとに指定できます。
下のような図でよくU-Net層が説明されています。
左側の緑色がIN(入力)ブロック、オレンジ色中央がM(中間)ブロック、右側の赤色がOUT(出力)ブロックです。

図解するとアルファベットのUの字のようにブロックが位置するのでU-Netと呼ばれます。
各U-Net層の具体的な出力画像への影響などは後述します。
Preset Weights
階層別マージは奥が深すぎるので、各層のマージ比率の代表例がプリセットとしていくつか与えられています。
まずはプリセットを用いてマージ比率を設定するのが良いでしょう。

例えば「GRAD_A」を選択すると、このようにマージします。


Weight values

マージ比率は以下のような数値の羅列でも設定できます。
0,0.0833333333,0.1666666667,0.25,0.3333333333,0.4166666667,0.5,0.5833333333,0.6666666667,0.75,0.8333333333,0.9166666667,1.0,0.9166666667,0.8333333333,0.75,0.6666666667,0.5833333333,0.5,0.4166666667,0.3333333333,0.25,0.1666666667,0.0833333333,0
数値は以下のようにModel B側の各層の値を、IN→M→OUT順で記載します。
IN_B_00,IN_B_01,IN_B_02,......,IN_B_11,M_B_00,OUT_B_00,......,OUT_B_11
各層のマージ比率を簡単に共有できるようになっているんですね。
数値の羅列で設定する際は「Apply block weight from text」ボタンを押します。

base_alpha

値 | base_alphaの意味 |
---|---|
0 | マージされたモデルはModel_Aのエンコーダー(Text Encoder、Auto Encoder) を100%使用 |
1 | マージされたモデルはModel_Bのエンコーダー(Text Encoder、Auto Encoder) を100%使用 |
verbose console output/Allow overwrite output-model

- verbose console output:詳細な情報をコンソールに出力
- Allow overwrite output-model:同名のモデルファイルの上書きを許可
Save as half/Save as safetensors

- Save as half:fp16精度でモデルを保存。基本チェックを入れます
- Save as safetensors:ckptファイルでなくsafetensorsファイルとしてモデルを保存。基本チェックを入れます
Skip/Reset CLIP position_ids

CLIP内のIDの位置をどうするか?
つまり入力したプロンプト(トークン)を埋め込みベクトルに変換する際の位置設定でしょうか?
選択肢 | 設定の意味 |
---|---|
None | 通常のマージ同様何もしません |
Skip | position_ids値をスキップしModel_Aの値を使用して効果を出します←???? |
Force Reset | position_ids 値を tensor([[range(77)]]) に置き換えます |
私の英語力ではSkipの説明が訳分からんことになってるので原文載せときます。
Skip position_ids key to eject effect. Value of Model A used.
3,階層別マージによるU-Net層ごとの出力画像への影響まとめ
例によって全てが手探りの沼ですが、検証を行った有志により得られた知見まとめました。
検証自体は多数行われているので、いくつか代表的なものを踏まえてまとめます。
スレ、Discordや私自身の試行錯誤により得られた知見も含め、以下のように特徴がまとまりました。
あくまで雰囲気というか主観評価であるため諸々ご了承ください。
U-Net層ごとの画像への影響まとめ(考察)
層 | 影響範囲 | 影響箇所 |
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 | 画像全体 | 色彩や塗り |
M00は大まかな全体への影響を持つと推測されていますが、正直よくわからないです。。。
IN層・OUT層ともに00などの浅い層は細部、11などの深い層は全体に対して影響を持つと考えられます。
追記:詳細な検証記事がnoteにありました。とても参考になります。
複雑に感じた方はまず普通のマージから始めるのも手です。
主要なモデル一覧や、DreamBoothにおすすめのグラボなど関連記事もご覧ください