全世界 LoRA 訓練指令碼,聯合起來!

發表於2024-02-11

來自社群的 SD-XL Dreambooth LoRA 微調最佳實踐指南

太長不看版

我們把 Replicate 在 SDXL Cog 訓練器中使用的樞軸微調 (Pivotal Tuning) 技術與 Kohya 訓練器中使用的 Prodigy 最佳化器相結合,再加上一堆其他最佳化,一起對 SDXL 進行 Dreambooth LoRA 微調,取得了非常好的效果。你可以在 diffusers 上找到 我們使用的訓練指令碼🧨,或是直接 在 Colab 上 試著執行一下。

如果你想跳過技術講解直接上手,可以使用這個 Hugging Face Space,透過簡單的 UI 介面用我們精選的超參直接開始訓練。當然,你也可以嘗試干預這些超參的設定。

概述

使用 Dreambooth LoRA 微調後的 Stable Diffusion XL(SDXL) 模型僅需藉助少量影像即可捕獲新概念,同時保留了 SDXL 出圖美觀高質的優勢。更難得的是,雖然微調結果令人驚豔,其所需的計算和資源消耗卻相當低。你可在 此處 找到很多精彩的 SDXL LoRA 模型。

本文我們將回顧一些流行的、可以讓你的 LoRA 微調更出色的實踐和技術,並展示如何使用 diffusers 來執行或訓練你自己的 LoRA 模型!

拾遺: LoRA (Low Rank Adaptation,低階適配) 是一種可用於微調 Stable Diffusion 模型的技術,其可用於對關鍵的影像/提示交叉注意力層進行微調。其效果與全模型微調相當,但速度更快且所需計算量更小。要了解有關 LoRA 工作原理的更多資訊,請參閱我們之前的文章 - 使用 LoRA 進行 Stable Diffusion 的高效引數微調

目錄

  1. 技術/技巧

    1. 樞軸微調
    2. 自適應最佳化器
    3. 推薦做法 - 文字編碼器學習率,自定義描述文字,資料集重複,最小訊雜比 Gamma,訓練集建立
  2. 實驗與結果
  3. 推理

    1. Diffusers 推理
    2. Automatic1111/ComfyUI 推理

致謝 ❤️:

本文展示的各種技術 (包括演算法、訓練指令碼、實驗以及各種探索) 是站在很多前人工作的基礎上的,包括: Nataniel RuizDreamboothRinon Gal文字逆化 (textual inversion) Ron Mokady樞軸微調Simo Ryucog-sdxlKohyasd-scripts 以及 The Last Benfast-stable-diffusion。在此,我們向他們和社群表示最誠摯的謝意!🙌

樞軸微調

樞軸微調 技術巧妙地將 文字逆化 與常規的擴散模型微調相結合。以 Dreambooth 為例,進行常規 Dreambooth 微調時,你需要選擇一個稀有詞元作為觸發詞,例如“一隻 sks 狗” 中的 sks 。但是,因為這些詞元原本就來自於詞表,所以它們通常有自己的原義,這就有可能會影響你的結果。舉個例子,社群之前經常使用 sks 作為觸發詞,但實際上其原義是一個武器品牌。

為了解決這個問題,我們插入一個新詞元到模型的文字編碼器中,而非重用詞表中現有的詞元。然後,我們最佳化新插入詞元的嵌入向量來表示新概念,這種想法就是文字逆化,即我們對嵌入空間中的新詞元進行學習來達到學習新概念的目的。一旦我們獲得了新詞元及其對應的嵌入向量,我們就可以用這些詞元嵌入向量來訓練我們的 Dreambooth LoRA,以獲得兩全其美的效果。

訓練

使用 diffusers 的新訓練指令碼,你可以透過設定以下引數來進行文字逆化訓練。

--train_text_encoder_ti
--train_text_encoder_ti_frac=0.5
--token_abstraction="TOK"
--num_new_tokens_per_abstraction=2
--adam_weight_decay_text_encoder
  • train_text_encoder_ti 開啟文字逆化訓練,用於訓練新概念的嵌入向量。
  • train_text_encoder_ti_frac 指定何時停止文字逆化 (即停止文字嵌入向量的更新,僅繼續更新 UNet)。中途定軸 (即僅在訓練前半部分執行文字逆化) 是 cog sdxl 使用的預設設定,我們目前的實驗也驗證了其有效性。我們鼓勵大家對此引數進行更多實驗。
  • token_abstraction 即概念識別符號,我們在提示文字中用該詞描述我們希望訓練的概念。該識別符號詞元會用在例項提示、驗證提示或影像描述文字中。這裡我們選擇 TOK 作為概念識別符號,如 “TOK 的照片”即為一個含有概念識別符號的例項提示。注意,--token_abstraction 只是一個佔位符,因此,在訓練之前我們需要用一個新詞元來代替 TOK 並對其進行訓練 (舉個例子,訓練時“一張 TOK 的照片”會變成“一張 <s0><s1> 的照片”,其中 <s0><s1> 就是新詞元)。同樣地,需要確保這裡的 token_abstraction 與例項提示、驗證提示和自定義提示 (如有) 中的識別符號相一致。
  • num_new_tokens_per_abstraction 表示每個 token_abstraction 對應多少個新詞元 - 即需要向模型的文字編碼器插入多少個新詞元並對其進行訓練。預設設定為 2,我們鼓勵大家對不同取值進行實驗並分享你們的發現!
  • adam_weight_decay_text_encoder 用於為文字編碼器設定與 UNet 不同的權重衰減。

自適應最佳化器

在訓練或微調擴散模型 (或與此相關的任何機器學習模型) 時,我們使用最佳化器來引導模型依循最佳的收斂路徑 - 收斂意味著我們選擇的損失函式達到了最小值,我們認為損失函式達到最小值即說明模型已習得我們想要教給它的內容。當前,深度學習任務的標準 (也是最先進的) 最佳化器當屬 Adam 和 AdamW 最佳化器。

然而,這兩個最佳化器要求使用者設定大量的超參 (如學習率、權重衰減等),以此為收斂鋪平道路。這可能會導致我們需要不斷試驗各種超參,最後常常因為耗時過長而不得不採用次優超參,從而導致次優結果。即使你最後試到了理想的學習率,但如果學習率在訓練期間保持為常數,仍然可能導致收斂問題。一些超參可能需要頻繁的更新以加速收斂,而另一些超參的調整又不能太大以防止振盪。真正是“摁了葫蘆起了瓢”。為了應對這一挑戰,我們引入了有自適應學習率的演算法,例如 AdafactorProdigy。這些方法根據每個引數過去的梯度來動態調整學習率,藉此來最佳化演算法對搜尋空間的遍歷軌跡。

我們的關注點更多在 Prodigy,因為我們相信它對 Dreambooth LoRA 訓練特別有用!

訓練

--optimizer="prodigy"

使用 Prodigy 時,預設學習率可以設定如下:

--learning_rate=1.0

對擴散模型特別是其 LoRA 訓練有用的設定還有:

--prodigy_safeguard_warmup=True
--prodigy_use_bias_correction=True
--adam_beta1=0.9
# 注意,以下超參的取值與預設值不同:
--adam_beta2=0.99
--adam_weight_decay=0.01

在使用 Prodigy 進行訓練時,你還可以對其他超參進行調整 (如: --prodigy_beta3prodigy_de Coupleprodigy_safeguard_warmup ),本文不會對這些引數進行深入研究,你可以移步 此處 以瞭解更多資訊。

其他好做法

除了樞軸微調以及自適應最佳化器之外,還有一些可以影響 LoRA 模型質量的其他技巧,所有這些技巧都已在最新的 diffusers 訓練指令碼中了。

獨立設定文字編碼器和 UNet 的學習率

社群發現,在最佳化文字編碼器時,為其設定專有的學習率 (與 UNet 學習率獨立) 所得模型的生成質量會更好 - 特別地,文字編碼器需要 較低 的學習率,因為它一般過擬合 更快

  • 在使用樞軸微調時,為 UNet 和文字編碼器設定不同的學習率是已被證明了的 - 此時,為文字編碼器設定更高的學習率更好。
  • 但請注意,當使用 Prodigy (或一般的自適應最佳化器) 時,我們一開始可以讓所有訓練引數的初始學習率相同,讓最佳化器自行調節。很神吧✨!

訓練

--train_text_encoder
--learning_rate=1e-4 #unet
--text_encoder_lr=5e-5

--train_text_encoder 啟用文字編碼器全模型訓練 (即文字編碼器的權重都參與更新,而不是僅僅最佳化文字逆化新詞元的嵌入 ( --train_text_encoder_ti ))。如果你希望文字編碼器的學習率始終與 --learning_rate 一致,可設 --text_encoder_lr=None

自定義描述文字

雖然透過對一組配有相同例項提示的影像進行訓練也可以獲得良好的結果,如“一張 <token> 的人像照片”或 “<token> 的風格”等。但對多幅影像使用相同的描述文字有可能會導致次優結果。具體效果取決於很多因素,包括待學習概念的複雜性、模型原本對該概念的“熟悉程度”,以及訓練集捕獲新概念的效果如何。

訓練

想要使用自定義描述文字,首先需要安裝 datasets 庫,如下:

!pip install datasets

要載入自定義影像描述文字,我們需要訓練集的目錄結構遵循 datasets 庫的 ImageFolder 結構,其包含影像及每張影像對應的描述文字。

  • _方式 1_:

從 hub 中選擇一個已包含影像及其對應提示的資料集 - 如 LinoyTsaban/3d_icon。現在要做的就是在訓練引數中指定資料集的名稱及文字列的名稱 (在本例中列名為 "prompt"):

--dataset_name=LinoyTsaban/3d_icon
--caption_column=prompt
  • _方式 2_:

你還可以使用自己的影像併為其新增描述文字。此時,你可以藉助 這個 Colab Notebook 來用 BLIP 自動為影像生成描述文字,或者你可以在後設資料檔案中手動建立描述文字。後面的事情就和方式 1 一樣了,將 --dataset_name 設為資料夾路徑, --caption_column 設為描述文字所對應的列名。

最小訊雜比 Gamma 加權

訓練擴散模型通常會遇到收斂緩慢的問題,部分是由於各時間步之間的最佳化方向相互衝突。Hang 等人 透過引入簡單的最小訊雜比 Gamma 法來緩解此問題。該方法根據鉗位訊雜比調整每個時間步的損失權重,以有效平衡各時間步之間的衝突。

  • 做小訊雜比加權策略在小資料集上效果可能並不明顯; 其對較大的資料集效果會更明顯。
  • 不同 $\gamma$ 值的效果比較: 你可在 這個 wandb 專案頁面 上比較不同的 snr_gamma 值 (5.0、1.0 及 None) 下的訓練損失曲線。

訓練

如欲使用最小訊雜比 Gamma 法,推薦設定如下:

--snr_gamma=5.0

預設情況下 --snr_gamma=None ,即不啟用。啟用 --snr_gamma 時,建議取值為 5.0。

影像樣本重複次數

此引數指的是資料集中的影像在訓練集中重複的次數。其與 epoch 的不同之處在於,影像首先被重複,然後才被打亂。

訓練

要啟用重複,只需將其設為一個大於 1 的整數:

--repeats

預設情況下, --repeats=1 ,即不重複。

訓練集建立

  • 俗話說得好 - “垃圾進,垃圾出”,雖然僅需少量影像即可輕鬆訓練一個好的 Dreambooth LoRA,但訓練影像的質量對微調模型影響很大。
  • 一般來說,在對特定物件或主題進行微調時,我們希望確保訓練集中包含儘可能多樣的關於該物件或主題的影像,且這些影像應儘量與後續應用場景相關。
  • 例如,如果想讓模型學到有關下面這個紅色揹包的知識: (該圖來自 google/dreambooth 資料集)

  • 我覺得後面使用者有可能給一個某人揹著包的提示,因此訓練集中最好有下面這樣的樣本:

這樣就能在訓練時匹配推理時的應用場景,因此模型推理時就更容易外推至該類場景或者設定。

再舉個例子 , 在 人臉 資料上進行訓練時,在準備資料集時需要特別注意以下幾點:

  1. 應儘可能選擇 高解析度、高畫質 的影像。模糊或低解析度的影像不利於微調結果。
  2. 在訓練特定人物的人臉時,建議訓練集中不要出現其他人的臉,因為我們不想對目標人臉產生模糊的概念。
  3. 特寫照片 對於最終產生真實感的效果很重要,但是同時也應該包含好的全身照片,以提高對不同姿勢/構圖的泛化能力。
  4. 我們建議 避免納入離拍攝主體較遠的照片,因為此類影像中的大多數畫素與我們希望最佳化的概念無關,模型可以從中學習的東西不多。
  5. 避免重複的背景/服裝/姿勢 —— 在燈光、姿勢、背景和麵部表情方面力求 多樣性。多樣性越大,LoRA 就越靈活、越通用。
  6. 先驗保留損失
    先驗保留損失是一種使用模型自己生成的樣本來幫助其學習如何生成更多樣化的影像的方法。由於這些影像樣本與你提供的影像屬於同一類,因此它們可以幫助模型保留已習得的有關該類的資訊,並習得如何使用已知的該類的資訊來形成新的組合。

    用於正則化的真實影像 VS 模型生成的影像
    選擇類影像時,你可以在合成影像 (即由擴散模型生成) 和真實影像之間進行選擇。支援使用真實影像的理由是它們提高了微調模型的真實感。另一方面,有些人也會認為使用模型生成的影像可以更好地保留模型習得的 知識 及審美。

  7. 名人相 - 這主要與用於訓練的描述文字或例項提示有關。當使用“令牌識別符號 + 基礎模型所知道的與待訓練任務相似的公眾人物”進行提示時,我們發現一些案例的微調效果得到了改善。

使用先驗保留損失進行 訓練:

--with_prior_preservation
--class_data_dir
--num_class_images
--class_prompt

--with_prior_preservation - 啟用先驗保留訓練
--class_data_dir - 包含類影像的資料夾的路徑
--num_class_images - 先驗保留損失所需的最小類影像數。如果 --class_data_dir 中沒有足夠的影像,則用 --class_prompt 取樣出更多的影像。

實驗與結果

講了這麼多,該挽起袖子試試了。我們在不同的任務 (風格化、人臉及特定物件) 上嘗試了上述技術的不同組合。

為了減小超參搜尋空間,我們使用一些流行配置作為起點,並基於此進行調整以達成效果。

Huggy Dreambooth LoRA

首先,我們想為 Huggy 微調一個 LoRA 模型,這意味著既要教會模型相應的藝術風格,同時還要教會它特定的角色。在這個例子中,我們製作了一個高質量的 Huggy 吉祥物資料集 (我們使用的是 Chunte-Lee 的藝術作品),該資料集包含 31 張影像及其對應的描述文字。

配置:

--train_batch_size = 1, 2,3, 4
-repeats = 1,2
-learning_rate = 1.0 (Prodigy), 1e-4 (AdamW)
-text_encoder_lr = 1.0 (Prodigy), 3e-4, 5e-5 (AdamW)
-snr_gamma = None, 5.0
-max_train_steps = 1000, 1500, 1800
-text_encoder_training = regular finetuning, pivotal tuning (textual inversion)
  • 文字編碼器全模型微調 VS 樞軸微調 - 我們注意到樞軸微調取得了比文字編碼器全模型微調更好的結果,且無需微調文字編碼器的權重。
  • 最小訊雜比 Gamma 加權

    • 我們比較了關閉 snr_gamma 訓得的 版本 1 以及使用 snr_gamma = 5.0 訓得的 版本 2

    這兩個版本都使用了以下引數 (但版本 2 多了一個 snr_gamma )

    --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
    --pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix" \
    --dataset_name="./huggy_clean" \
    --instance_prompt="a TOK emoji"\
    --validation_prompt="a TOK emoji dressed as Yoda"\
    --caption_column="prompt" \
    --mixed_precision="bf16" \
    --resolution=1024 \
    --train_batch_size=4 \
    --repeats=1\
    --report_to="wandb"\
    --gradient_accumulation_steps=1 \
    --gradient_checkpointing \
    --learning_rate=1e-4 \
    --text_encoder_lr=3e-4 \
    --optimizer="adamw"\
    --train_text_encoder_ti\
    --lr_scheduler="constant" \
    --lr_warmup_steps=0 \
    --rank=32 \
    --max_train_steps=1000 \
    --checkpointing_steps=2000 \
    --seed="0" \

  • AdamW 及 Prodigy 最佳化器

    • 我們比較了使用 optimizer=prodigy 訓練的 版本 1 及使用 optimizer=adamW 訓練的 版本 2。兩個版本都使用樞軸微調進行訓練。
    • 使用 optimizer=prodigy 進行訓練時,我們將初始學習率設定為 1。而對 adamW,我們使用了 cog-sdxl 中用於樞軸微調的預設學習率 ( learning_rate1e-4text_encoder_lr3e-4 ),因為我們能夠使用它們重現出較好的效果。

  • 所有其他訓練引數和設定均相同。具體如下:

    --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
    --pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix" \
    --dataset_name="./huggy_clean" \
    --instance_prompt="a TOK emoji"\
    --validation_prompt="a TOK emoji dressed as Yoda"\
    --output_dir="huggy_v11" \
    --caption_column="prompt" \
    --mixed_precision="bf16" \
    --resolution=1024 \
    --train_batch_size=4 \
    --repeats=1\
    --report_to="wandb"\
    --gradient_accumulation_steps=1 \
    --gradient_checkpointing \
    --train_text_encoder_ti\
    --lr_scheduler="constant" \
    --snr_gamma=5.0 \
    --lr_warmup_steps=0 \
    --rank=32 \
    --max_train_steps=1000 \
    --checkpointing_steps=2000 \
    --seed="0" \

Y2K 網頁設計 LoRA

我們再探討另一個例子,這次用另一個資料集,該資料集是我們從網際網路上抓取的 27 個 20 世紀 90 年代和 21 世紀初的網頁截圖 (相當復古🥲):

配置:

–rank = 4,16,32
-optimizer = prodigy, adamW
-repeats = 1,2,3
-learning_rate = 1.0 (Prodigy), 1e-4 (AdamW)
-text_encoder_lr = 1.0 (Prodigy), 3e-4, 5e-5 (AdamW)
-snr_gamma = None, 5.0
-train_batch_size = 1, 2, 3, 4
-max_train_steps = 500, 1000, 1500
-text_encoder_training = regular finetuning, pivotal tuning

與前例略有不同,雖然我們使用的訓練影像大致相同 (~30 張),但我們注意到,對於這種風格的 LoRA,在 Huggy LoRA 效果很好的設定對於網頁風格來說表現出了過擬合。如下:

對於 v1,我們選擇了訓練 Huggy LoRA 時的最佳配置作為起點 - 顯然過擬合了。因此我們嘗試在下一個版本中透過調整 --max_train_steps--repeats--train_batch_size 以及 --snr_gamma 來解決這個問題。更具體地說,我們基於這四個配置迭代了 8 個版本,如下 (所有其餘配置保持不變):

配置v1v2v3v4v5v6v7v8
max_train_steps15001500150010001000100010001000
repeats11221121
train_batch_size44442111
instance_data_dirweb_y2k14 images randomly samples from web_y2kweb_y2kweb_y2kweb_y2kweb_y2kweb_y2kweb_y2k
snr_gamma5.05.05.05.0--5.05.0

我們發現 v4、v5 及 v6 可以達到最佳的折衷效果:

人臉 LoRA

在人臉影像上進行訓練時,我們的目標是讓 LoRA 生成儘可能真實且與目標人物相似的影像,同時又能夠很好地泛化至訓練集中未見過的背景和構圖。本例中,我們聚合了多個 Linoy 臉部資料集 (每個資料集含 6-10 張影像),其中包括一組同時拍攝的特寫照片、不同場合的照片集 (不同的背景、燈光和服裝) 以及全身照。

我們深知,如果由於照明/解析度/聚焦上的問題導致影像的質量偏低,此時較少的高質影像比較多的低質影像的微調效果更好 - 少即是多,務必選擇最好的照片來訓練模型!

配置:

rank = 4,16,32, 64
optimizer = prodigy, adamW
repeats = 1,2,3,4
learning_rate = 1.0 , 1e-4
text_encoder_lr = 1.0, 3e-4
snr_gamma = None, 5.0
num_class_images = 100, 150
max_train_steps = 75 * num_images, 100 * num_images, 120 * num_images
text_encoder_training = regular finetuning, pivotal tuning
  • 先驗保留損失

    • 與通常的做法相反,我們發現使用生成的類影像會降低與目標人臉的相似性及生成影像的真實性。
    • 我們利用從 unsplash 下載的開源影像建立了真實肖像的 資料集。現在,你也可以在我們建立的新 訓練空間 中用上它!
    • 當使用真實影像資料集時,我們注意到語言漂移更少 (即模型不會將“女人/男人”一詞僅與經過訓練的面孔相關聯,而是可以生成不同的人) ; 同時在輸入含經訓練的人臉相關詞元的提示詞情況下,其生成又能保證真實感及整體質量。
    • 我們比較了秩設為 4、16、32 和 64 等不同值時的 LoRA。在這些實驗中,我們發現秩為 64 的 LoRA 生成的影像磨皮效果更強,並且皮膚紋理看上去不太真實。
    • 因此,在後面的實驗以及 LoRA ease 空間 上,我們都把秩預設設為 32。
  • 訓練步數

    • 儘管僅需很少高質影像 (在我們的例子中為 6) 就能達到好的訓練效果,但我們仍需要確定模型訓練的理想步數。
    • 基於訓練影像數,我們嘗試了幾種不同的乘數: 6 x75 = 450 步 / 6 x100 = 600 步 / 6 x120 = 720 步。
    • 如下圖所示,初步結果表明,使用 120 倍乘數效果較好 (如果資料集足夠多樣而不會過擬合,訓練集中最好不要有相似的照片)

上圖顯示了使用 3 個訓得的 LoRA (除了 --max_train_steps 之外的所有引數都保持相同) 生成的影像,具體配置如下:

rank = 32
optimizer = prodigy
repeats = 1
learning_rate = 1.0
text_encoder_lr = 1.0
max_train_steps = 75 * num_images, 100 * num_images, 120 * num_images
train_text_encoder_ti
with_prior_preservation_loss
num_class_images = 150

推理

使用上述技術訓練的模型的推理應該與任何其他訓練器訓得的模型的推理方式相同,不同之處在於,當我們進行樞軸微調時,除了 LoRA 的 *.safetensors 權重之外,還有經過訓練的新詞元及其文字嵌入模型的 *.safetensors 。為了對這些進行推理,我們在載入 LoRA 模型的方式上加了 2 個步驟:

  1. 從 Hub 下載經過訓練的嵌入模型 (預設檔名為 {model_name}_emb.safetensors )

    import torch
    from huggingface_hub import hf_hub_download
    from diffusers import DiffusionPipeline
    from safetensors.torch import load_file
    pipe = DiffusionPipeline.from_pretrained(
         "stabilityai/stable-diffusion-xl-base-1.0",
         torch_dtype=torch.float16,
         variant="fp16",
    ).to("cuda")
    
    # download embeddings
    embedding_path = hf_hub_download(repo_id="LinoyTsaban/web_y2k_lora", filename="web_y2k_emb.safetensors", repo_type="model")
    
  2. 將嵌入模型載入到文字編碼器中

    # load embeddings to the text encoders
    state_dict = load_file(embedding_path)
    
    # notice we load the tokens <s0><s1>, as "TOK" as only a place-holder and training was performed using the new initialized   tokens - <s0><s1>
    # load embeddings of text_encoder 1 (CLIP ViT-L/14)
    pipe.load_textual_inversion(state_dict["clip_l"], token=["<s0>", "<s1>"], text_encoder=pipe.text_encoder, tokenizer=pipe.  tokenizer)
    # load embeddings of text_encoder 2 (CLIP ViT-G/14)
    pipe.load_textual_inversion(state_dict["clip_g"], token=["<s0>", "<s1>"], text_encoder=pipe.text_encoder_2, tokenizer=pipe.  tokenizer_2)
  3. 載入你的 LoRA 並輸入提示!

    # normal LoRA loading
    pipe.load_lora_weights("LinoyTsaban/web_y2k_lora", weight_name="pytorch_lora_weights.safetensors")
    prompt="a <s0><s1> webpage about an astronaut riding a horse"
    images = pipe(
     prompt,
     cross_attention_kwargs={"scale": 0.8},
    ).images
    # your output image
    images[0]

Comfy UI / AUTOMATIC1111 推理

最新的指令碼完全支援 Comfy UI 和 AUTOMATIC1111 格式的文字逆化模型載入!

AUTOMATIC1111 / SD.Next

在 AUTOMATIC1111/SD.Next 中,我們同時載入 LoRA 和文字嵌入模型。

  • LoRA : 除了 diffusers 格式之外,該指令碼還將同時生成 WebUI 格式的 LoRA,其檔名為 {your_lora_name}.safetensors 。隨後,你可以將其放入 models/Lora 目錄中。
  • 嵌入 : diffusers 和 WebUI 的嵌入檔案格式相同。你可以直接下載已訓練模型的 {lora_name}_emb.safetensors 檔案,並將其放入 embeddings 目錄中。

然後,你可以輸入提示 a y2k_emb webpage about the movie Mean Girls <lora:y2k:0.9> 來執行推理。你可以直接使用 y2k_emb 詞元,也可以透過使用 (y2k_emb:1.2) 來增加其權重。

ComfyUI

在 ComfyUI 中,我們會同時載入 LoRA 和文字嵌入。

  • LoRA : 除了 diffusers 格式之外,該指令碼還將訓練 ComfyUI 相容的 LoRA,其檔名為 {your_lora_name}.safetensors 。然後,你可以將其放入 models/Lora 目錄中。然後,你需要載入 LoRALoader 節點並將其與你的模型和 CLIP 連線起來,詳見 LoRA 載入官方指南
  • 嵌入 : diffusers 和 WebUI 的嵌入格式相同。你可以直接下載已訓練的模型的 {lora_name}_emb.safetensors 檔案,並將其放入 models/embeddings 目錄中,並在你的提示中以 embedding:y2k_emb 的方式使用它,詳見 載入嵌入模型的官方指南

下一步

🚀 更多功能,即將推出!
我們正在努力為我們的訓練指令碼新增更多高階功能,以允許使用者施加更多的控制力,並支援更靈活的使用。如果你覺得哪些功能對你有幫助,請告訴我們!

🤹 多概念 LoRA
Shah 等人在最近的一項 工作 引入了 ZipLoRAs - 一種將多個獨立訓練的不同風格或主題 LoRA 模型合併起來的方法,以支援以使用者指定的任意風格生成使用者指定的任意主題影像。mkshing 實現了此方法的一個開源復現,見 此處,其使用了我們新改進的 指令碼


英文原文: https://hf.co/blog/sdxl_lora_advanced_script

原文作者: Linoy Tsaban,Apolinário

譯者: Matrix Yao (姚偉峰),英特爾深度學習工程師,工作方向為 transformer-family 模型在各模態資料上的應用及大規模模型的訓練推理。