Diffusers 文件

T2I-Adapter

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

T2I-Adapter

T2I-Adapter 是一種輕量級介面卡模型,它提供額外的條件輸入影像(線條畫、邊緣檢測、草圖、深度、姿態)以更好地控制影像生成。它類似於 ControlNet,但它要小得多(約 77M 引數和約 300MB 檔案大小),因為它只將權重插入到 UNet 中,而不是複製和訓練它。

T2I-Adapter 僅可用於使用 Stable Diffusion XL (SDXL) 模型進行訓練。

本指南將探索 train_t2i_adapter_sdxl.py 訓練指令碼,幫助您熟悉它,以及如何根據自己的用例進行調整。

在執行指令碼之前,請確保從原始碼安裝庫

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

然後導航到包含訓練指令碼的示例資料夾並安裝您正在使用的指令碼所需的依賴項

cd examples/t2i_adapter
pip install -r requirements.txt

🤗 Accelerate 是一個幫助您在多個 GPU/TPU 上或使用混合精度進行訓練的庫。它將根據您的硬體和環境自動配置您的訓練設定。請檢視 🤗 Accelerate 快速入門 以瞭解更多資訊。

初始化 🤗 Accelerate 環境

accelerate config

要設定預設的 🤗 Accelerate 環境而不選擇任何配置

accelerate config default

或者如果您的環境不支援互動式 shell(例如筆記本),您可以使用

from accelerate.utils import write_basic_config

write_basic_config()

最後,如果您想在自己的資料集上訓練模型,請檢視 建立訓練資料集 指南,瞭解如何建立與訓練指令碼相容的資料集。

以下部分重點介紹了訓練指令碼中對於理解如何修改它很重要的部分,但它沒有詳細介紹指令碼的每個方面。如果您有興趣瞭解更多資訊,請隨時閱讀 指令碼,如果您有任何問題或疑慮,請告訴我們。

指令碼引數

訓練指令碼提供了許多引數,可幫助您自定義訓練執行。所有引數及其描述都可以在 parse_args() 函式中找到。它為每個引數提供了預設值,例如訓練批次大小和學習率,但您也可以根據需要,在訓練命令中設定自己的值。

例如,要啟用梯度累積,請將 --gradient_accumulation_steps 引數新增到訓練命令中。

accelerate launch train_t2i_adapter_sdxl.py \
  ----gradient_accumulation_steps=4

許多基本和重要的引數在文字到影像訓練指南中都有描述,因此本指南只關注相關的 T2I-Adapter 引數。

  • --pretrained_vae_model_name_or_path:預訓練 VAE 的路徑;SDXL VAE 已知存在數值不穩定性,因此此引數允許您指定一個更好的 VAE
  • --crops_coords_top_left_h--crops_coords_top_left_w:包含在 SDXL 裁剪座標嵌入中的高度和寬度座標。
  • --conditioning_image_column:資料集中條件影像的列。
  • --proportion_empty_prompts:將替換為空字串的影像提示的比例。

訓練指令碼

與指令碼引數一樣,文字到影像訓練指南中提供了訓練指令碼的詳細說明。本指南將重點介紹指令碼中與 T2I-Adapter 相關的部分。

訓練指令碼首先準備資料集。這包括對提示進行標記化以及對影像和條件影像應用變換

conditioning_image_transforms = transforms.Compose(
    [
        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
        transforms.CenterCrop(args.resolution),
        transforms.ToTensor(),
    ]
)

main() 函式中,T2I-Adapter 要麼從預訓練的介面卡載入,要麼隨機初始化。

if args.adapter_model_name_or_path:
    logger.info("Loading existing adapter weights.")
    t2iadapter = T2IAdapter.from_pretrained(args.adapter_model_name_or_path)
else:
    logger.info("Initializing t2iadapter weights.")
    t2iadapter = T2IAdapter(
        in_channels=3,
        channels=(320, 640, 1280, 1280),
        num_res_blocks=2,
        downscale_factor=16,
        adapter_type="full_adapter_xl",
    )

最佳化器 為 T2I-Adapter 引數初始化。

params_to_optimize = t2iadapter.parameters()
optimizer = optimizer_class(
    params_to_optimize,
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

最後,在訓練迴圈中,介面卡條件影像和文字嵌入被傳遞給 UNet 以預測噪聲殘差。

t2iadapter_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype)
down_block_additional_residuals = t2iadapter(t2iadapter_image)
down_block_additional_residuals = [
    sample.to(dtype=weight_dtype) for sample in down_block_additional_residuals
]

model_pred = unet(
    inp_noisy_latents,
    timesteps,
    encoder_hidden_states=batch["prompt_ids"],
    added_cond_kwargs=batch["unet_added_conditions"],
    down_block_additional_residuals=down_block_additional_residuals,
).sample

如果您想了解更多關於訓練迴圈如何工作的資訊,請檢視 理解管道、模型和排程器 教程,它分解了去噪過程的基本模式。

啟動指令碼

現在您已準備好啟動訓練指令碼!🚀

在此示例訓練中,您將使用 fusing/fill50k 資料集。如果您願意,也可以建立並使用自己的資料集(請參閱建立訓練資料集指南)。

將環境變數 MODEL_DIR 設定為 Hub 上的模型 ID 或本地模型的路徑,並將 OUTPUT_DIR 設定為您要儲存模型的目錄。

下載以下影像以進行條件訓練

wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png

要使用 Weights & Biases 監控訓練進度,請將 --report_to=wandb 引數新增到訓練命令中。您還需要將 --validation_image--validation_prompt--validation_steps 新增到訓練命令中以跟蹤結果。這對於除錯模型和檢視中間結果非常有用。

export MODEL_DIR="stabilityai/stable-diffusion-xl-base-1.0"
export OUTPUT_DIR="path to save model"

accelerate launch train_t2i_adapter_sdxl.py \
 --pretrained_model_name_or_path=$MODEL_DIR \
 --output_dir=$OUTPUT_DIR \
 --dataset_name=fusing/fill50k \
 --mixed_precision="fp16" \
 --resolution=1024 \
 --learning_rate=1e-5 \
 --max_train_steps=15000 \
 --validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
 --validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
 --validation_steps=100 \
 --train_batch_size=1 \
 --gradient_accumulation_steps=4 \
 --report_to="wandb" \
 --seed=42 \
 --push_to_hub

訓練完成後,您可以將 T2I-Adapter 用於推理

from diffusers import StableDiffusionXLAdapterPipeline, T2IAdapter, EulerAncestralDiscreteSchedulerTest
from diffusers.utils import load_image
import torch

adapter = T2IAdapter.from_pretrained("path/to/adapter", torch_dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", adapter=adapter, torch_dtype=torch.float16
)

pipeline.scheduler = EulerAncestralDiscreteSchedulerTest.from_config(pipe.scheduler.config)
pipeline.enable_xformers_memory_efficient_attention()
pipeline.enable_model_cpu_offload()

control_image = load_image("./conditioning_image_1.png")
prompt = "pale golden rod circle with old lace background"

generator = torch.manual_seed(0)
image = pipeline(
    prompt, image=control_image, generator=generator
).images[0]
image.save("./output.png")

下一步

恭喜您成功訓練了一個 T2I-Adapter 模型!🎉 欲瞭解更多資訊:

< > 在 GitHub 上更新

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