Diffusers documentation

T2I-Adapter

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

T2I-Adapter

T2I-Adapter là một mô hình adapter nhẹ, cung cấp ảnh điều kiện đầu vào bổ sung (line art, canny, sketch, depth, pose) để kiểm soát quá trình tạo ảnh tốt hơn. Nó tương tự như ControlNet, nhưng nhỏ hơn rất nhiều (~77M tham số và kích thước tệp ~300MB) vì nó chỉ chèn trọng số vào UNet thay vì sao chép và huấn luyện lại.

T2I-Adapter chỉ có sẵn để huấn luyện với mô hình Stable Diffusion XL (SDXL).

Hướng dẫn này sẽ khám phá script huấn luyện train_t2i_adapter_sdxl.py để giúp bạn làm quen với nó, cũng như cách bạn có thể điều chỉnh nó cho trường hợp sử dụng của riêng mình.

Trước khi chạy script, hãy đảm bảo bạn cài đặt thư viện từ mã nguồn:

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

Sau đó, điều hướng đến thư mục ví dụ chứa script huấn luyện và cài đặt các phụ thuộc cần thiết cho script bạn đang sử dụng:

cd examples/t2i_adapter
pip install -r requirements.txt

🤗 Accelerate là một thư viện giúp bạn huấn luyện trên nhiều GPU/TPU hoặc với độ chính xác hỗn hợp. Nó sẽ tự động cấu hình thiết lập huấn luyện của bạn dựa trên phần cứng và môi trường của bạn. Hãy xem 🤗 Accelerate Quick tour để tìm hiểu thêm.

Khởi tạo một môi trường 🤗 Accelerate:

accelerate config

Để thiết lập môi trường 🤗 Accelerate mặc định mà không cần chọn bất kỳ cấu hình nào:

accelerate config default

Hoặc nếu môi trường của bạn không hỗ trợ shell tương tác, chẳng hạn như notebook, bạn có thể sử dụng:

from accelerate.utils import write_basic_config

write_basic_config()

Cuối cùng, nếu bạn muốn huấn luyện một mô hình trên bộ dữ liệu của riêng mình, hãy xem hướng dẫn Tạo bộ dữ liệu để huấn luyện để tìm hiểu cách tạo một bộ dữ liệu tương thích với script huấn luyện.

Các phần tiếp theo làm nổi bật những phần quan trọng trong script huấn luyện để hiểu cách chỉnh sửa nó, nhưng không đi sâu vào mọi khía cạnh của script. Nếu bạn muốn tìm hiểu thêm, hãy tự do đọc qua script và cho chúng tôi biết nếu bạn có bất kỳ câu hỏi hoặc lo ngại nào.

Tham số của script

Tệp kịch bản huấn luyện cung cấp nhiều tham số để giúp bạn tùy chỉnh phiên huấn luyện của mình. Tất cả các tham số và mô tả của chúng được tìm thấy trong hàm parse_args(). Hàm này cung cấp các giá trị mặc định cho từng tham số, chẳng hạn như kích thước lô huấn luyện và tốc độ học, nhưng bạn cũng có thể tự đặt giá trị của riêng mình trong lệnh huấn luyện nếu muốn.

Ví dụ, để kích hoạt tích lũy gradient, hãy thêm tham số --gradient_accumulation_steps vào lệnh huấn luyện:

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

Nhiều tham số cơ bản và quan trọng được mô tả trong hướng dẫn huấn luyện Text-to-image, vì vậy hướng dẫn này chỉ tập trung vào các tham số T2I-Adapter liên quan:

  • --pretrained_vae_model_name_or_path: đường dẫn đến một VAE được huấn luyện trước; VAE của SDXL được biết là gặp phải sự bất ổn định về mặt số học, vì vậy tham số này cho phép bạn chỉ định một VAE tốt hơn
  • --crops_coords_top_left_h và --crops_coords_top_left_w: tọa độ chiều cao và chiều rộng để đưa vào các embedding tọa độ crop của SDXL
  • --conditioning_image_column: cột chứa các ảnh điều kiện trong bộ dữ liệu
  • --proportion_empty_prompts: tỷ lệ các prompt hình ảnh sẽ được thay thế bằng chuỗi rỗng

Script huấn luyện

Tương tự như các tham số của script, một hướng dẫn chi tiết về script huấn luyện được cung cấp trong hướng dẫn huấn luyện Text-to-image. Thay vào đó, hướng dẫn này sẽ xem xét các phần liên quan đến T2I-Adapter trong script.

Tệp kịch bản huấn luyện bắt đầu bằng việc chuẩn bị bộ dữ liệu. Điều này bao gồm tokenize prompt và áp dụng các phép biến đổi cho các hình ảnh và hình ảnh điều kiện.

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

Trong hàm main(), T2I-Adapter được tải từ một adapter đã được huấn luyện trước hoặc được khởi tạo ngẫu nhiên:

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",
    )

optimizer được khởi tạo cho các tham số của 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,
)

Cuối cùng, trong vòng lặp huấn luyện, ảnh điều kiện của adapter và các vector nhúng văn bản được truyền vào UNet để dự đoán phần dư nhiễu:

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

Nếu bạn muốn tìm hiểu thêm về cách hoạt động của vòng lặp huấn luyện, hãy xem hướng dẫn Hiểu về pipeline, mô hình và trình lập lịch, nơi phân tích chi tiết mẫu cơ bản của quá trình khử nhiễu.

Chạy script

Bây giờ bạn đã sẵn sàng để chạy script huấn luyện! 🚀

Đối với ví dụ huấn luyện này, bạn sẽ sử dụng bộ dữ liệu fusing/fill50k. Bạn cũng có thể tự tạo và sử dụng bộ dữ liệu của riêng mình nếu muốn (xem hướng dẫn Tạo bộ dữ liệu để huấn luyện).

Đặt biến môi trường MODEL_DIR thành một model id trên Hub hoặc một đường dẫn đến model cục bộ và OUTPUT_DIR thành nơi bạn muốn lưu model.

Tải xuống các hình ảnh sau để điều kiện cho quá trình huấn luyện của bạn:

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

Để theo dõi tiến độ huấn luyện với Weights & Biases, hãy thêm tham số --report_to=wandb vào lệnh huấn luyện. Bạn cũng cần thêm --validation_image, --validation_prompt và --validation_steps vào lệnh huấn luyện để theo dõi kết quả. Điều này rất hữu ích để gỡ lỗi mô hình và xem các kết quả trung gian.

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

Khi quá trình huấn luyện hoàn tất, bạn có thể sử dụng T2I-Adapter của mình để suy luận:

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

adapter = T2IAdapter.from_pretrained("path/to/adapter", dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", adapter=adapter, 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")

Các bước tiếp theo

Chúc mừng bạn đã huấn luyện thành công một mô hình T2I-Adapter! 🎉 Để tìm hiểu thêm:

Update on GitHub