在ChatGPT 出圈不久,ControlNet 的橫空出世很快在英文和中文互聯網收穫了眾多開發者和普通用戶,甚至有用戶宣傳ControlNet 的出現將AI 創作帶入了直立行走的時代。不誇張地說,包括ControlNet 在內,同期的T2I-Adapter、Composer, 以及LoRA 訓練技巧,可控生成作為AI 創作最後一道高牆,極有可能在可預見的時間內有進一步突破,從而極大降低用戶的創作成本,提高創作的可玩性。距離 ControlNet 開源僅過去兩週,其官方 Star 就已經超過 1 萬,這種熱度無疑是空前的。
同時,開源社群也大幅降低了使用者的使用門檻,如Hugging Face 平台提供了基礎模型權重以及通用的模型訓練框架diffusers,stable-diffusion-webui開發了完善的一套Demo 平台,Civitai 貢獻了海量風格化LoRA 權重。
#儘管webui 作為目前最受歡迎的視覺化工具,已經快速地支援了近期推出的各種生成模型,並且支援眾多選項供用戶設定。由於其重點考慮了前端介面的易用性,背後程式碼結構其實十分複雜,對於開發者而言不夠友善。例如 webui 儘管支援了多種類型的載入和推理,但卻無法支援不同框架下的轉換,也無法支援模型的靈活訓練。我們在社群討論中發現了許多現有開源程式碼暫未解決的痛點。
首先,程式碼框架不相容,目前熱門的模型,如ControlNet、T2I-Adapter,與主流的Stable Diffusion 訓練庫diffusers 不相容,ControlNet 預先訓練的模型無法直接在diffusers 框架中被使用。
其次,模型載入受限,目前模型保存格式多樣,如.bin、.ckpt、.pth、.satetensors 等,除了webui 外,目前diffusers 框架對於這些模型格式的支援還有限,考慮到LoRA 大部分模型以safetensors 保存為主,用戶很難直接將LoRA 的模型加載到已有的基於diffusers 框架訓練的模型中。
第三,基礎模型受限,目前ControlNet、T2I-Adapter 皆基於Stable-Diffusion-1.5 進行訓練,且僅開源了SD1.5 下的模型權重,考慮到特定場景,已經存在諸如anything-v4、ChilloutMix 等優質動漫模型,即使引入了可控信息,最終生成結果仍然受限於SD1.5 中UNet 的能力。
最後,模型訓練受限,目前LoRA 已經被廣泛驗證是風格遷移、保持特定形象IP 最有效的方法之一,但diffusers 框架目前僅支援UNet 的LoRA 嵌入,無法支援text encoder 的嵌入,會限制LoRA 的訓練。
我們和開源社群討論後,了解到diffusers 框架作為通用程式碼庫,正計劃同時適配近期不斷推出的生成模型;由於涉及較多底層介面重寫,仍然需要一段時間更新。為此,我們從以上實際存在的問題出發,率先提出了每個問題的自研解決方案,快速幫助開發者更容易開發。
LoRA for diffusers
#本方案是為了在diffusers 框架,即基於diffusers 訓練保存的模型中,靈活嵌入各種格式的LoRA 權重。由於 LoRA 的訓練通常會凍結 base model,因此可以輕鬆地作為可插拔模組嵌入已有模型,作為風格或 IP 條件約束。 LoRA 本身是一種通用的訓練技巧,它的基本原理是,透過低秩分解,可以大幅減少模組的參數量,目前在影像生成中,一般用於訓練獨立於base model 以外的可插拔模組,實際使用是以殘差形式與base model 的輸出合併。
首先是 LoRA 權重的嵌入,目前 Civitai 平台上提供的權重主要以 ckpt 或 safetensors 格式存儲,分以下兩種情況。
(1)Full model(base model LoRA 模組)
如果full model 是safetensors 格式,可以透過以下diffusers 腳本轉換
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.safetensors--dump_path save_dir --from_safetensors
如果full model 是ckpt 格式,可以透過以下diffusers 腳本轉換
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.ckpt--dump_path save_dir
轉換完成後,可直接利用diffusers 的API 進行模型加載
from diffusers import StableDiffusionPipeline pipeline = StableDiffusionPipeline.from_pretrained (save_dir,torch_dtype=torch.float32)
(2)LoRA only (僅包含LoRA 模組)
目前diffusers 官方無法支援僅載入LoRA 權重,而開源平台上的LoRA 權重基本上以這種形式存儲。本質上是完成 LoRA 權重中 key-value 的重新映射,使其適配到 diffusers 模型中。為此,我們自行支援這個功能,提供了轉換腳本。
pipeline = StableDiffusionPipeline.from_pretrained (model_id,torch_dtype=torch.float32) model_path = "onePieceWanoSagaStyle_v2Offset.safetensors" state_dict = load_file (model_path)
只需要指定 diffusers 格式的模型,以及儲存為 safetensors 格式的 LoRA 權重。我們提供了一個轉換範例。
# the default mergering ratio is 0.75, you can manually set it python convert_lora_safetensor_to_diffusers.py
此外,LoRA 本身由於其輕量化,可以在小數據情況下快速完成訓練,並能夠嵌入到其他網路中。為了不限於已有LoRA 權重,我們在diffusers 框架中支援了LoRA 的多模組(UNet text encoder)訓練,並已經在官方程式碼庫提交PR(https://github.com/huggingface/diffusers/pull/ 2479),並支持了ColossalAI 中訓練LoRA。
程式碼開源在:https://github.com/haofanwang/Lora-for-Diffusers
ControlNet for diffusers
#本方案是為了支援在diffusers 框架中,使用ControlNet。基於開源社群的部分嘗試,我們提供了完整的 ControlNet Anything-V3 使用用例,支援將 base model 從原本 SD1.5 的替換到 anything-v3 模型,使 ControlNet 具備較好動漫生成的能力。
此外,我們也支援ControlNet Inpainting,並提供了適配diffusers 的pipeline,
以及多條件控制的Multi-ControlNet。
程式碼開源在:https://github.com/haofanwang/ControlNet-for-Diffusers
T2I-Adapter for diffusers
與ControlNet 相似,我們也同時支援了同期開源的T2I-Adapter 到diffusers 的適配。
程式碼開源在:https://github.com/haofanwang/T2I-Adapter-for-Diffusers
目前以上三種適配方案都已經向社群開源,並在 ControlNet、T2I-Adapter 中被官方分別致謝,也收到了來自 stable-diffusion-webui-colab 作者的感謝。我們正在與 diffusers 官方保持討論,並會在近期完成以上方案向官方程式碼庫的整合工作。也歡迎大家提前嘗試我們的工作,有任何問題可以直接提 issue,我們會盡快回覆。
以上是適配Diffusers框架的全套教學來了!從T2I-Adapter到大熱ControlNet的詳細內容。更多資訊請關注PHP中文網其他相關文章!