煒哥的AI學習筆記——SuperMerger插件學習
接下來學習的插件名字叫做 SuperMerger,它的作用正如其名,可以融合大模型或者 LoRA,一般來說會結合之前的插件 LoRA Block Weight 使用,在調整完成 LoRA 模型的權重后使用改插件進行重新打包。
除了 LoRA ,Checkpoint 也可以通過這個插件進行融合合并。實際上,目前市面上存在大量的 Checkpoint 模型都是經由合并這種方式得來,這類模型一般名字中都帶有 Mix,如國內比較知名的作者GhostInShell: https://www.zhihu.com/people/2e1f8efa42269a5e22d7f84e34c03468發(fā)布的模型 GhostMix 也是在自己的模型的基礎上和別人的模型融合而來。這本身就是一種模型制作的方式。
與 LoRA 相同,Checkpoint 內部也存在分層,這是模型融合的基礎,Checkpoint 內部存在 26 層分層內容,分別是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。同樣需要不斷地測試以確定不同層對于概念學習的作用
官方說明
This extension allows merged models to be loaded as models for image generation without saving them. This extension can prevent the use of HDD and SSD.
界面介紹
Merge 標簽
這個 Tab 下主要是針對 Checkpoint 融合的一些設置。
Model A\B\C。這個就是選擇需要融合的幾個模型。
Merge Mode。模型的融合方式,這里涉及到兩個變量,alpha 和 beta,計算方式直接見圖。

如 Weight sum ,當 alpha 等于 0.4 時,就是 0.6 的 A 模型融合上 0.4 的 B 模型。
Calcutation Mode。決定了模型融合的計算方式,設計到一些數(shù)學函數(shù)所以略微有些復雜,新手使用可以直接選 normal ,如果實在想要了解幾個選項的不同可以查看 https://github.com/recoilme/losslessmix
use MBW。使用分層的方式對模型進行融合。至于 MBW 代表的意思,還需要說到另一個插件 Merge Block Weighted: https://github.com/bbc-mc/sdweb-merge-block-weighted-gui#merge-block-weighted---gui 。嚴格來說這個插件才是用來精確調整分層效果的,這里使用這個插件的縮寫 MBW 代表需要分層調節(jié)。不過也不用單獨去下載這個插件,因為 SuperMerger 中已經集成了,就在頁面底部。
需要注意的是,在勾選了使用 MBW 后,會使用頁面底部設置的每一項的 alpha 值,而最上面設置的 alpha 和 beta 值就沒有用了。

兩個輸入框,第一個是分層的 alpha 權重,第二個是分層的 beta 權重。
比如如圖所示的話,MBW alpha = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1。而之前我們模式選擇的是 Weight sum:A×(1-alpha)+B×alpha,所以這邊就是模型 A 按 "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0" 分層權重和模型 B 按"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1" 的分層權重進行融合了。最后得出一個新的模型,這個是比單純的整體權重設置更加精準的融合控制。
當然如果麻煩的話可以使用后面一個 Tab 的"Weights Presets"中的字母進行替代,比如說我可以使用 "OUT07" 來替代掉上面的一長串數(shù)字。這個也是支持自己自定義的,和 LoRA-Block-Weight 一樣。

Merge、Gen、Stop。控制按鈕三人組,Merge 就是開始融合,Gen 是 generation 的縮寫,會根據(jù) txt2img 中的設置生成圖片(使用當前的模型,可以看右側 Current Model 中是哪個模型)如果指點擊 Gen 按鈕的話,就是用上一次 Merge 的模型,只有用 Merge&Gen 才會在融合之后用融合后的模型生成圖片看效果。Stop 即停止。
save settings

這里的設置項……雖然不是很難,不過非常的直接,不是很“用戶友好”,我還是快速說一遍。
save model,需要在預覽完成之后保存一個模型的話,就要勾選。不然按了 Merge 之后,雖然融合了模型,但是也沒有輸出,等于白用功了。模型保存在\stable-diffusion-webui\models\Stable-diffusion下,就是平常放 Checkpoint 的地方
overwrite 是覆蓋已存在的模型,如果不勾選,并且存在同名模型的話,會提示模型已存在沒有保存,比如我剛才故意沒勾,就提示我tdi_v1.1-000007x0.3+chilloutmix_NiPrunedFp32Fixx0.7.safetensors) existed and was not saved]。
safetensors 勾選了保存的格式就是.safetensors ,不勾選就是 ckpt。兩者的區(qū)別自行上網搜索。
fp16 勾選了保存的精度就是 fp16,不勾選應該是 fp32(未實測)。兩者的區(qū)別同樣自行搜索。
save metadata 的作用是唯一在官方文檔中有說明的,是將這次 merge 的條件保存到導出的文件里,這樣后面可以回過來查閱。
所以其實不勾 save model 的話后面的選項是完全沒用的,這就是“用戶不友好”的地方。
write merged model ID to
這邊先要講清楚 model ID 是什么, 這就需要先把 History 標簽拿上來講。
每次 Merge 一個模型,History 標簽中都會有記錄這次操作的詳細信息,包括模型名稱、權重等。這些都被記錄下來,那么 model ID 就是對應的記錄 ID 了。

勾選了 image 的,生成的圖片左上角就會出現(xiàn)對應的 ID 信息,方便后續(xù)查詢記錄。而 PNG info 就是將這個信息寫入到圖片文件內,就和 txt2img 中的 Prompt 等其他設置一樣。
不過很奇怪的是,我勾了 PNG info 之后,圖片的信息沒有變化,而且在同時勾了 image 和 PNG info 后,圖片的信息完全都沒了(圖片左上角的數(shù)字還在)??赡苁?bug 吧,目前版本是e161008b: https://github.com/hako-mikan/sd-webui-supermerger/commit/e161008b71facc6cb6cb6974e7b18bf0095a7a58。
Custom Name(Optional)。保存模型的名稱,不填的話會使用每個模型+對應權重合起來的命名方式進行命名。
merge from ID。保存的 ID 記錄派上用場了,可以從歷史記錄中拷貝之前配置(-1 代表最近的記錄)。
Restore faces, Tiling, Hires. fix, Batch size。和 txt2img\img2img 一樣的調參,猜測插件作者把這個放在這里只是為了方便。
Elemental Merge。搞不懂,不過 LoRA-block-weight 這個插件一樣也有這個設置項,后續(xù)可以對比著然后看看效果。

接下來到了 XYZ 圖部分了,還是和 txt2img 中的 XYZ Plot ,是通過交叉改變一些參數(shù),來找出最合適的參數(shù)組合。
XYZ 的具體用法就不介紹了,主要說一下每個參數(shù)的意義。

alpha。即上面的 alpha 值,這邊設置之后會代替上面設置的 alpha 值進多次生成圖片。比如這邊設置“0.25,0.5,0.75”,效果等同于將上面的 alpha 分別設置成三個值進行圖片生成。
beta。同 alpha。
alpha and beta。顧名思義是同時更改 alpha 和 beta,所以逗號分隔開的值需要提供兩個數(shù)字,分別代表 alpha 和 beta,不過兩個數(shù)字間不能用逗號了,需要使用空格。如果只有一個數(shù)字的話代表 alpha 和 beta 同時使用這個值。比如“0.5 0.1, 0.3 0.4, 0.5”,代表3組值,alpha=0.5&beta=0.1,alpha=0.3&beta=0.4,alpha=0.5&alpha=0.5。
seed。生成時的種子數(shù),可以用-1代表隨機生成。
這里單獨提一下右側的那個 number of -1 。

插件開發(fā)者做了這個應該是用來方便快速輸入指定個數(shù)的-1的,用在 seed 值這里倒是很方便。
mbw alpha, mbw beta, mbw alpha and beta。這三個放一起介紹,因為和之前的三個差不多,只是改成了 mbw 的形式,也就是說需要輸入完整的分層權重值,比如"0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1",然后這邊的分隔符也改成了換行符,也就是每一組占一行(如果是mbw alpha and beta ,會自動把兩行當成一組)。
同樣這邊也是支持 Weights Presets 中的變量名替換的。
model_A, model_B, model_C。替換融合模型的名字,會忽視掉之前設置的模型名。
pinpoint blocks??梢缘膯为毴タ刂颇硯讉€層的權重,比如我在 X 軸選了這個選項,然后在參數(shù)框里輸入"IN01,IN02,IN03",然后 y 軸必須選擇 alpha 和 beta (不帶 mbw 的那兩個),這樣就會單獨更改這三項的 alpha 值。
elemental 相關的不了解。
calcmode。Calcutation Mode 的縮寫,對應著上面的這個選項。

prompt。圖片生成默認會使用 txt2img 中的 Prompt,但是也可以在這里進行多組的設置,然后也需要改成使用換行符做分隔符。
然后是控制區(qū)。XYZ 的圖片生成不能使用上面的 Merge、Gen 按鈕。

介紹完列表項后,還有 XY plot settings ,都比較直接,也不介紹了。
下方的三個按鈕,可以用來控制圖片的生成。第一個就是開始生成 XY 圖片,第二個是停止,第三個是”預訂“,就是當前如果有正在執(zhí)行的任務,你可以繼續(xù)設置參數(shù),設置完成后通過這個按鈕”排隊“一個任務,這個任務會在前一個任務完成后繼續(xù)。(很適合睡前使用)
可以在最下方的 Reservation 里查看預約的列表,也可以用來刪除已預約的任務。

然后還有個區(qū)域,也不知道該叫什么。

它嚴格來說也是 XYZ 的一部分,會列出所有的 Block ID 和識別到的 checkpoint,這樣需要輸入的時候不需要再單獨一個個名稱輸入了,可以直接勾選然后會出現(xiàn)在上面的選框里,點擊 Add to Sequence X/Y 就可以發(fā)送到上面的 X 或 Y 的參數(shù)框里了。
LoRA 標簽
主要的 Merge 標簽講完,后續(xù)的標簽就快多了。
這個標簽就比較簡單,所以我換一種方式講解,即使用任務導向。

任務一 將 LoRA 融合進大模型
LoRA 本身是需要搭配大模型使用的,但這個插件也提供了將 LoRA 融合進大模型的功能,更加方便后續(xù)調用。
需要融合模型的話,需要先在 Checkpoint A 處選擇大模型,然后再在下面的 "LoRAname1:ratio1:Blocks1,LoRAname2:ratio2:Blocks2,...(":blocks" is option, not necessary)" 這一長串下方的輸入框中輸入要融合的 LoRA 名稱,可以選擇多個,但是需要 LoRA 的維度都保持一樣,也就是在訓練 LoRA 選擇的 Network Rank(Dimension)。

如果不知道 LoRA 的維度的話,可以通過左下方的按鈕 calculate dimension of LoRAs,計算出所有 LoRA 模型的維度。
同時,LoRA 名稱也是支持分層權重的,比如可以填寫 my_lora:0.5:ALL0.5 來將 LoRA 模型以制定好的整體權重(0.5)和分層權重(ALL0.5) 融合進大模型中。
這里的確有一個地方我還沒搞明白,我如果直接使用一系列數(shù)字當成分層權重輸入,比如 my_lora:0.5:0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5。會提示我數(shù)組超長,融合出錯,只有我將權重信息替換成了字母變量,才融合成功。
倒是不影響使用,不過目前沒有找到直接輸入分層權重來進行模型融合的方法。
選擇好了大模型,并輸入要融合的 LoRA 后,就可以進行模型的融合了,還可以通過在 filename(option) 中添加自定義的文件名,如果不寫的話插件會自動把大模型的名稱和 LoRA 的名稱合并作為新模型的名稱。完成所有操作后點擊 Merge to Checkpoint 按鈕,就會開始融合,融合后的模型存放在平常存放大模型的目錄下。
任務二 將 LoRA 從大模型中拆分
是任務一的逆向操作,如果想要將融合后的模型重新還原 Lora 出來,就可以使用這個功能。比如我在 Checkpoint A 中選擇任務一融合后的模型,再在 Checkpoint B 中選擇之前融合用的底模。然后點擊 Make LoRA,就得到了最開始的那個 LoRA 模型。
也可以自由的改變兩個模型的權重,比如我將 Checkpoint A 的模型權重 alpha 從默認的 1 調高一點,那么生成的 LoRA 就會更多帶有一點 Checkpoint A 的特征,可以理解成“沒減干凈“。
任務三 融合 LoRA 模型
顧名思義是將多個 LoRA 模型融合成一個 LoRA 模型,但是不融合進大模型中。步驟和任務一類似,不過不需要再選擇 Checkpoint A。點擊 Merge LoRAs 后,同樣會生成新的一個 LoRAs 模型,也是默認放在原 LoRA 的文件夾目錄下。
其他元素
其他是一些無關緊要的選項

same to Strength
這個選項目前的確是看不懂,我先直接將英文原文搬過來。
If the same to Strength option is not used, the result is the same as the merge in the script created by kohya-ss. In this case, the result is different from the case where LoRA is applied on Web-ui as shown in the figure below. The reason for this is related to the mathematical formula used to adopt LoRA into U-net. kohya-ss's script multiplies the ratio as it is, but the formula used to apply LoRA squares the ratio, so if the ratio is set to a number other than 1, or to a negative value, the result will differ from Strength (strength when applied). Using the SAME TO STRENGTH option, the square root of the ratio is driven at merge time, so that Strength and the ratio are calculated to have the same meaning at apply time. It is also calculated so that a negative value will have the same effect. If you are not doing additional learning, for example, you may be fine using the SAME TO STRENGTH option, but if you are doing additional learning on the merged LoRA, you may not want to use anyone else's option. The following figures show the generated images for each case of normal image generation/same to Strength option/normal merge, using merged LoRAs of figmization and ukiyoE. You can see that in the case of normal merge, even in the negative direction, the image is squared and positive.

我大致的理解是,如果勾選了 same to Strength(第二行),效果將會和在 Prompt 中同時使用兩個 LoRA 效果差不多(第一行),不勾選的時候,則是結合兩個 Lora 學習到的內容。不過從圖片來看似乎也只有在最終 LoRA 強度為負數(shù)時才有明顯差別。這個后續(xù)有機會再搞懂吧。
overwrite
是否覆蓋。不勾選的話在保存文件目錄下如果有同名文件,會保存失敗。
save precision
模型的保存精度。要講清楚比較復雜,建議保持默認。
remake dimension
如果出現(xiàn)模型維度不一樣,那么需要在這里選擇重新打包后的模型精度,選擇 auto 的話會自動選擇維度較大的那一個值。不過在 LoRA 更改維度的過程中,難免會存在一些效果的更改,所以盡量要選擇維度一樣的模型。
History 標簽
在 Merge 標簽中提到過,這里記錄了所有合成的歷史。
Elements 標簽
猜測是和之前 Merge 標簽,甚至 LoRA-Blocks-Weight 中的 Elemental Merge 有關聯(lián)的功能。在上傳一個模型之后,Elements 中給出了這個模型中每個 Blocks 中更細致的分層。因此猜測是相比分層權重更加精細的權重控制。這個單獨開一篇文章進行學習吧。
Metadeta 標簽
也是在 Merge 標簽中提到過,有一個選項是 save metadata ,就是將這次融合的信息保存到模型文件中,那么通過這個 Metadeta 標簽就可以進行讀取。
順便一提作者應該是拼錯了名字,把 Metadata 拼成了 Metadeta ,我還是保留下來。
待了解
Elemental Merge
same to Strength
參考資料
GitHub - hako-mikan/sd-webui-supermerger: model merge extention for stable diffusion web ui: https://github.com/hako-mikan/sd-webui-supermerger
【AI繪畫進階教程】SuperMerger插件詳解 提取Lora模型? 合并Lora模型? Lora模型降維?Lora模型融入大模型?_嗶哩嗶哩_bilibili