使用 Latent Consistency LoRA 讓 SDXL 實現 4 步出圖

釋出於 2023 年 11 月 9 日
在 GitHub 上更新

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 倍,聽起來怎麼樣?請繼續閱讀以瞭解詳情!

目錄

方法概述

那麼,訣竅是什麼呢?對於潛在一致性蒸餾,每個模型都需要單獨蒸餾。而 LCM LoRA 的核心思想是隻訓練少量被稱為 LoRA 層 的介面卡,而不是整個模型。然後,生成的 LoRA 就可以應用於模型的任何微調版本,而無需對它們進行單獨的蒸餾。如果你迫不及待想看看實際效果,請直接跳到 下一節 去體驗推理程式碼。如果你想訓練自己的 LoRA,你可以按照以下流程操作:

  1. 從 Hub 中選擇一個可用的教師模型。例如,你可以使用 SDXL (base),或任何你喜歡的微調或 Dreambooth 版本。
  2. 在該模型上訓練一個 LCM LoRA。LoRA 是一種效能高效的微調(PEFT)方法,其成本遠低於完整的模型微調。有關 PEFT 的更多詳情,請檢視 這篇部落格文章diffusers 的 LoRA 文件
  3. 將 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,這是潛在一致性模型中使用的排程器。
  • 就是這樣!

這將生成以下全解析度影像:

SDXL in 4 steps with LCM LoRA
使用 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 張影像:

LCM LoRA generations with 1 to 8 steps
使用 1 到 8 步生成的 LCM LoRA 影像。

正如預期的那樣,僅使用 1 步會產生一個大致的形狀,沒有可辨別的特徵且缺乏紋理。然而,結果很快得到改善,通常在 4 到 6 步內就非常令人滿意。就我個人而言,我覺得上一個測試中 8 步的影像對我來說有點太飽和和“卡通化”了,所以我可能會在這個例子中選擇 5 到 6 步的影像。生成速度非常快,你只需 4 步就能建立一堆不同的變體,然後選擇你喜歡的,再用幾步和更精細的提示詞進行迭代。

引導係數和負向提示詞

請注意,在前面的例子中,我們使用的 guidance_scale1,這實際上停用了它。這對於大多數提示詞效果很好,而且速度最快,但會忽略負向提示詞。你也可以嘗試使用負向提示詞,透過提供一個介於 12 之間的引導係數——我們發現更大的值效果不佳。

與基礎版 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 results for various inference steps
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 technique with a Dreambooth Stable Diffusion v1.5 model, allowing 4-step inference.
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 和模型

額外內容:將 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

Combining LoRAs for fast inference
標準 LoRA 和 LCM LoRA 結合,實現快速(4 步)推理。

需要一些探索 LoRA 的想法嗎?快來試試我們實驗性的 LoRA the Explorer (LCM 版) Space,測試社群的驚人創作並獲取靈感吧!

如何訓練 LCM 模型和 LoRA

作為今天 diffusers 釋出的一部分,我們提供了與 LCM 團隊作者合作開發的訓練和微調指令碼。它們允許使用者:

  • 在像 Laion 這樣的大型資料集上對 Stable Diffusion 或 SDXL 模型進行全模型蒸餾。
  • 訓練 LCM LoRA,這是一個容易得多的過程。正如我們在這篇文章中展示的,它也使得在 Stable Diffusion 上實現快速推理成為可能,而無需經過蒸餾訓練。

更多詳情,請檢視倉庫中針對 SDXLStable Diffusion 的說明。

我們希望這些指令碼能激勵社群嘗試他們自己的微調。如果您在專案中使用它們,請務必告訴我們!

資源

致謝

Latent Consistency Models 的驚人工作由 LCM 團隊 完成,請務必檢視他們的程式碼、報告和論文。這個專案是 diffusers 團隊、LCM 團隊和社群貢獻者 Daniel Gu 之間的合作成果。我們相信,這是開源 AI 賦能的證明,它是讓研究人員、從業者和愛好者探索新思想和協作的基石。我們還要感謝 @madebyollin 對社群的持續貢獻,包括我們在訓練指令碼中使用的 float16 自動編碼器。

社群

註冊登入 以發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.