使用 Latent Consistency LoRA 讓 SDXL 實現 4 步出圖
Latent Consistency Models (LCM) 是一種透過將原始模型 蒸餾 成另一個版本來減少 Stable Diffusion(或 SDXL)生成影像所需步數的方法,新版本需要更少的步數(4到8步,而非原始的25到50步)。蒸餾是一種訓練過程,試圖用一個新模型來複制源模型的輸出。蒸餾後的模型可以被設計得更小(比如 DistilBERT 或最近釋出的 Distil-Whisper),或者像本例一樣,需要更少的執行步數。這通常是一個漫長且昂貴的過程,需要大量的資料、耐心和幾塊 GPU。
嗯,這是今天之前的現狀!
我們很高興地宣佈一種新方法,它基本上可以使 Stable Diffusion 和 SDXL 變得更快,就像它們經過了 LCM 過程的蒸餾一樣!在 3090 顯示卡上執行 任何 SDXL 模型,時間從 7 秒縮短到約 1 秒,或者在 Mac 上快 10 倍,聽起來怎麼樣?請繼續閱讀以瞭解詳情!
目錄
- 方法概述
- 這為什麼重要
- 使用 SDXL LCM LoRA 進行快速推理
- 基準測試
- 今日釋出的 LCM LoRA 和模型
- 額外內容:將 LCM LoRA 與常規 SDXL LoRA 結合
- 如何訓練 LCM LoRA
- 資源
- 鳴謝
方法概述
那麼,訣竅是什麼呢?對於潛在一致性蒸餾,每個模型都需要單獨蒸餾。而 LCM LoRA 的核心思想是隻訓練少量被稱為 LoRA 層 的介面卡,而不是整個模型。然後,生成的 LoRA 就可以應用於模型的任何微調版本,而無需對它們進行單獨的蒸餾。如果你迫不及待想看看實際效果,請直接跳到 下一節 去體驗推理程式碼。如果你想訓練自己的 LoRA,你可以按照以下流程操作:
- 從 Hub 中選擇一個可用的教師模型。例如,你可以使用 SDXL (base),或任何你喜歡的微調或 Dreambooth 版本。
- 在該模型上訓練一個 LCM LoRA。LoRA 是一種效能高效的微調(PEFT)方法,其成本遠低於完整的模型微調。有關 PEFT 的更多詳情,請檢視 這篇部落格文章 或 diffusers 的 LoRA 文件。
- 將 LoRA 與任何 SDXL 擴散模型和 LCM 排程器一起使用;搞定!你只需幾個步驟就能獲得高質量的推理結果。
有關該過程的更多詳情,請下載我們的論文。
這為什麼重要?
Stable Diffusion 和 SDXL 的快速推理催生了新的應用場景和工作流程。僅舉幾例:
- 可及性:生成式工具可以被更多人有效使用,即使他們沒有最新的硬體。
- 更快的迭代:在極短的時間內獲得更多影像和多種變體!這對藝術家和研究人員來說非常棒,無論是個人還是商業用途。
- 生產工作負載可能可以在不同的加速器上執行,包括 CPU。
- 更便宜的影像生成服務。
為了衡量我們所說的速度差異,在 M1 Mac 上使用 SDXL(基礎版)生成一張 1024x1024 的影像大約需要一分鐘。而使用 LCM LoRA,我們只需約 6 秒(4 步)就能得到出色的結果。這是一個數量級的提速,無需等待結果改變了一切。使用 4090 顯示卡,我們幾乎可以得到即時響應(不到 1 秒)。這解鎖了 SDXL 在需要即時響應的應用中的使用。
使用 SDXL LCM LoRA 進行快速推理
今天釋出的 diffusers
版本使得使用 LCM LoRA 變得非常簡單:
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
lcm_lora_id = "latent-consistency/lcm-lora-sdxl"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.load_lora_weights(lcm_lora_id)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.to(device="cuda", dtype=torch.float16)
prompt = "close-up photography of old man standing in the rain at night, in a street lit by lamps, leica 35mm summilux"
images = pipe(
prompt=prompt,
num_inference_steps=4,
guidance_scale=1,
).images[0]
請注意程式碼是如何:
- 使用 SDXL 1.0 基礎模型例項化一個標準的擴散管線。
- 應用 LCM LoRA。
- 將排程器更改為 LCMScheduler,這是潛在一致性模型中使用的排程器。
- 就是這樣!
這將生成以下全解析度影像:
使用 LCM LoRA,透過 4 步用 SDXL 生成的影像。
質量比較
讓我們看看步數如何影響生成質量。以下程式碼將生成總推理步數為 1 到 8 的影像:
images = []
for steps in range(8):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps+1,
guidance_scale=1,
generator=generator,
).images[0]
images.append(image)
這是以網格形式顯示的 8 張影像:
使用 1 到 8 步生成的 LCM LoRA 影像。
正如預期的那樣,僅使用 1 步會產生一個大致的形狀,沒有可辨別的特徵且缺乏紋理。然而,結果很快得到改善,通常在 4 到 6 步內就非常令人滿意。就我個人而言,我覺得上一個測試中 8 步的影像對我來說有點太飽和和“卡通化”了,所以我可能會在這個例子中選擇 5 到 6 步的影像。生成速度非常快,你只需 4 步就能建立一堆不同的變體,然後選擇你喜歡的,再用幾步和更精細的提示詞進行迭代。
引導係數和負向提示詞
請注意,在前面的例子中,我們使用的 guidance_scale
是 1
,這實際上停用了它。這對於大多數提示詞效果很好,而且速度最快,但會忽略負向提示詞。你也可以嘗試使用負向提示詞,透過提供一個介於 1
和 2
之間的引導係數——我們發現更大的值效果不佳。
與基礎版 SDXL 的質量對比
在質量方面,這與標準的 SDXL 管線相比如何?讓我們看一個例子!
我們可以透過解除安裝 LoRA 權重並切換到預設排程器來快速將我們的管線恢復為標準的 SDXL 管線:
from diffusers import EulerDiscreteScheduler
pipe.unload_lora_weights()
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
然後我們可以像往常一樣執行 SDXL 的推理。我們將收集不同步數下的結果:
images = []
for steps in (1, 4, 8, 15, 20, 25, 30, 50):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps,
generator=generator,
).images[0]
images.append(image)
SDXL 管線結果(相同的提示詞和隨機種子),使用 1、4、8、15、20、25、30 和 50 步。
正如你所見,在這個例子中,影像在約 20 步(第二行)之前幾乎是無用的,並且質量隨著步數的增加仍然有顯著提升。最終影像的細節令人驚歎,但它需要 50 步才能達到。
LCM LoRA 與其他模型的結合
這項技術也適用於任何其他微調的 SDXL 或 Stable Diffusion 模型。為了演示,讓我們看看如何在 collage-diffusion
上執行推理,這是一個使用 Dreambooth 從 Stable Diffusion v1.5 微調的模型。
程式碼與我們前面例子中看到的類似。我們載入微調後的模型,然後載入適用於 Stable Diffusion v1.5 的 LCM LoRA。
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "wavymulder/collage-diffusion"
lcm_lora_id = "latent-consistency/lcm-lora-sdv1-5"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.load_lora_weights(lcm_lora_id)
pipe.to(device="cuda", dtype=torch.float16)
prompt = "collage style kid sits looking at the night sky, full of stars"
generator = torch.Generator(device=pipe.device).manual_seed(1337)
images = pipe(
prompt=prompt,
generator=generator,
negative_prompt=negative_prompt,
num_inference_steps=4,
guidance_scale=1,
).images[0]
images
LCM LoRA 技術與 Dreambooth Stable Diffusion v1.5 模型結合,實現 4 步推理。
完整的 Diffusers 整合
LCM 在 diffusers
中的整合使得利用 diffusers 工具箱中的許多功能和工作流程成為可能。例如:
- 開箱即用的對搭載 Apple Silicon 晶片 Mac 的
mps
支援。 - 記憶體和效能最佳化,如 flash attention 或
torch.compile()
。 - 針對低記憶體環境的額外記憶體節省策略,包括模型解除安裝。
- 像 ControlNet 或圖生圖這樣的工作流程。
- 訓練和微調指令碼。
基準測試
本節並非旨在詳盡無遺,而是為了說明我們在各種計算機上實現的生成速度。讓我們再次強調,如此輕鬆地探索影像生成是多麼令人解放。
硬體 | SDXL LoRA LCM (4 步) | 標準 SDXL (25 步) |
---|---|---|
Mac, M1 Max | 6.5 秒 | 64 秒 |
2080 Ti | 4.7 秒 | 10.2 秒 |
3090 | 1.4 秒 | 7 秒 |
4090 | 0.7 秒 | 3.4 秒 |
T4 (Google Colab 免費版) | 8.4 秒 | 26.5 秒 |
A100 (80 GB) | 1.2 秒 | 3.8 秒 |
Intel i9-10980XE CPU (使用 1/36 核) | 29 秒 | 219 秒 |
這些測試在所有情況下都使用批大小為 1 執行,指令碼由 Sayak Paul 編寫,連結在這裡。
對於像 A100 這樣大容量的顯示卡,當一次生成多張影像時,效能會顯著提高,這通常是生產工作負載的情況。
今日釋出的 LCM LoRA 和模型
Latent Consistency Models LoRA 系列
latent-consistency/lcm-lora-sdxl
。用於 SDXL 1.0 基礎版 的 LCM LoRA,如上例所示。latent-consistency/lcm-lora-sdv1-5
。用於 Stable Diffusion 1.5 的 LCM LoRA。latent-consistency/lcm-lora-ssd-1b
。用於segmind/SSD-1B
的 LCM LoRA,這是一個蒸餾過的 SDXL 模型,比原始 SDXL 小 50%,快 60%。
latent-consistency/lcm-sdxl
。從 SDXL 1.0 基礎版 衍生的完整微調一致性模型。latent-consistency/lcm-ssd-1b
。從segmind/SSD-1B
衍生的完整微調一致性模型。
額外內容:將 LCM LoRA 與常規 SDXL LoRA 結合
使用 diffusers + PEFT 整合,你可以將 LCM LoRA 與常規 SDXL LoRA 結合,賦予它們僅需 4 步即可進行 LCM 推理的超能力。
這裡我們將結合 CiroN2022/toy_face
LoRA 和 LCM LoRA:
from diffusers import DiffusionPipeline, LCMScheduler
import torch
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
lcm_lora_id = "latent-consistency/lcm-lora-sdxl"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.load_lora_weights(lcm_lora_id)
pipe.load_lora_weights("CiroN2022/toy-face", weight_name="toy_face_sdxl.safetensors", adapter_name="toy")
pipe.set_adapters(["lora", "toy"], adapter_weights=[1.0, 0.8])
pipe.to(device="cuda", dtype=torch.float16)
prompt = "a toy_face man"
negative_prompt = "blurry, low quality, render, 3D, oversaturated"
images = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=4,
guidance_scale=0.5,
).images[0]
images
標準 LoRA 和 LCM LoRA 結合,實現快速(4 步)推理。
需要一些探索 LoRA 的想法嗎?快來試試我們實驗性的 LoRA the Explorer (LCM 版) Space,測試社群的驚人創作並獲取靈感吧!
如何訓練 LCM 模型和 LoRA
作為今天 diffusers
釋出的一部分,我們提供了與 LCM 團隊作者合作開發的訓練和微調指令碼。它們允許使用者:
- 在像 Laion 這樣的大型資料集上對 Stable Diffusion 或 SDXL 模型進行全模型蒸餾。
- 訓練 LCM LoRA,這是一個容易得多的過程。正如我們在這篇文章中展示的,它也使得在 Stable Diffusion 上實現快速推理成為可能,而無需經過蒸餾訓練。
更多詳情,請檢視倉庫中針對 SDXL 或 Stable Diffusion 的說明。
我們希望這些指令碼能激勵社群嘗試他們自己的微調。如果您在專案中使用它們,請務必告訴我們!
資源
演示
訓練指令碼
致謝
Latent Consistency Models 的驚人工作由 LCM 團隊 完成,請務必檢視他們的程式碼、報告和論文。這個專案是 diffusers 團隊、LCM 團隊和社群貢獻者 Daniel Gu 之間的合作成果。我們相信,這是開源 AI 賦能的證明,它是讓研究人員、從業者和愛好者探索新思想和協作的基石。我們還要感謝 @madebyollin
對社群的持續貢獻,包括我們在訓練指令碼中使用的 float16
自動編碼器。