Diffusers documentation
DiffusionPipeline
DiffusionPipeline
Các mô hình khuếch tán bao gồm nhiều thành phần như UNet hoặc diffusion transformer (DiT), text encoder, variational autoencoder (VAE) và scheduler. DiffusionPipeline đóng gói tất cả các thành phần này thành một API dễ sử dụng mà vẫn giữ được sự linh hoạt để chỉnh sửa các thành phần của nó.
Hướng dẫn này sẽ cho bạn biết cách tải một DiffusionPipeline.
Tải một pipeline
DiffusionPipeline là lớp pipeline cơ bản, tự động chọn và trả về một instance của lớp con pipeline của model, chẳng hạn như QwenImagePipeline, bằng cách quét file model_index.json để tìm tên lớp.
Truyền model id vào from_pretrained() để tải một pipeline.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Mỗi model có một lớp con pipeline cụ thể kế thừa từ DiffusionPipeline. Một lớp con thường có phạm vi hẹp và đặc thù cho từng tác vụ. Xem bảng bên dưới để có một ví dụ.
| lớp con của pipeline | task |
|---|---|
| QwenImagePipeline | text-to-image |
| QwenImageImg2ImgPipeline | image-to-image |
| QwenImageInpaintPipeline | inpaint |
Bạn có thể sử dụng lớp con trực tiếp bằng cách truyền một model id vào from_pretrained().
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Tham khảo tài liệu Định dạng tệp đơn để tìm hiểu cách tải các mô hình tệp đơn.
Các pipeline cục bộ
Pipelines cũng có thể được chạy cục bộ. Sử dụng snapshot_download để tải xuống một kho lưu trữ mô hình.
from huggingface_hub import snapshot_download
local_dir = snapshot_download(repo_id="Qwen/Qwen-Image")Truyền đường dẫn đó vào from_pretrained() để tải nó.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
local_dir, dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Phương thức from_pretrained() sẽ không tải tệp từ Hub khi phát hiện đường dẫn cục bộ. Nhưng điều này cũng có nghĩa là nó sẽ không tải và lưu vào bộ nhớ đệm bất kỳ bản cập nhật nào đã được thực hiện cho mô hình.
Các kiểu dữ liệu của Pipeline
Sử dụng đối số dtype trong from_pretrained() để tải mô hình với kiểu dữ liệu cụ thể. Điều này cho phép bạn tải các mô hình khác nhau ở các độ chính xác khác nhau. Ví dụ, việc tải một mô hình transformer lớn ở độ chính xác nửa (half-precision) sẽ làm giảm bộ nhớ cần thiết.
Truyền kiểu dữ liệu cho từng mô hình dưới dạng từ điển vào dtype. Sử dụng khóa default để đặt kiểu dữ liệu mặc định. Nếu một mô hình không có trong từ điển và default không được cung cấp, nó sẽ được nạp ở độ chính xác đầy đủ (torch.float32).
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image",
dtype={"transformer": torch.bfloat16, "default": torch.float16},
)
print(pipeline.transformer.dtype, pipeline.vae.dtype)Bạn không cần sử dụng từ điển nếu bạn đang tải tất cả các mô hình cùng một kiểu dữ liệu.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
print(pipeline.transformer.dtype, pipeline.vae.dtype)Đặt thiết bị
Tham số device_map đặt pipeline lên các thiết bị. Khi chạy, Diffusers chấp nhận "balanced", "cpu" và chuỗi accelerator cho máy bạn đang dùng (thường là "cuda", "mps" hoặc "xpu").
| parameter | mô tả |
|---|---|
| chuỗi accelerator | Đặt pipeline trên thiết bị đó. Truyền vào accelerator mà máy của bạn hỗ trợ, chẳng hạn như "cuda", "mps", hoặc "xpu". |
"balanced" | Phân bổ các thành phần pipeline trên các GPU hiển thị. Sử dụng cùng với max_memory khi bạn cần giới hạn bộ nhớ trên từng thiết bị. |
"cpu" | Đặt pipeline trên CPU. |
Sử dụng đối số max_memory trong from_pretrained() để phân bổ lượng bộ nhớ tối đa được sử dụng trên mỗi thiết bị. Mặc định, Diffusers sử dụng toàn bộ lượng bộ nhớ khả dụng.
import torch
from diffusers import DiffusionPipeline
max_memory = {0: "16GB", 1: "16GB"}
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image",
dtype=torch.bfloat16,
device_map="balanced",
max_memory=max_memory,
)Thuộc tính hf_device_map cho phép bạn truy cập và xem device_map.
print(pipeline.hf_device_map)
# {'transformer': 1, 'vae': 1, 'text_encoder': 0}Đặt lại device_map của một pipeline bằng phương thức reset_device_map(). Điều này là cần thiết nếu bạn muốn sử dụng các phương thức như .to(), enable_sequential_cpu_offload() và enable_model_cpu_offload().
pipeline.reset_device_map()
Tải song song
Các mô hình lớn thường được chia nhỏ thành các tệp nhỏ hơn để dễ nạp hơn. Diffusers hỗ trợ nạp các phần chia song song để tăng tốc quá trình nạp.
Đặt HF_ENABLE_PARALLEL_LOADING thành "YES" để bật tải song song các shard.
Tham số device_map nên được đặt thành "cuda" để phân bổ trước một khối bộ nhớ lớn dựa trên kích thước mô hình. Điều này giảm đáng kể thời gian tải mô hình vì việc khởi động bộ phân bổ bộ nhớ lúc này sẽ tránh được nhiều lần gọi bộ phân bổ nhỏ hơn sau đó.
import os
import torch
from diffusers import DiffusionPipeline
os.environ["HF_ENABLE_PARALLEL_LOADING"] = "YES"
pipeline = DiffusionPipeline.from_pretrained(
"Wan-AI/Wan2.2-I2V-A14B-Diffusers", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Thay thế các mô hình trong một pipeline
DiffusionPipeline linh hoạt và hỗ trợ nạp các model hoặc scheduler khác. Bạn có thể thử nghiệm với các scheduler khác nhau để tối ưu hóa tốc độ hoặc chất lượng sinh, và có thể thay thế model bằng những model hiệu suất cao hơn.
Ví dụ bên dưới sử dụng phiên bản VAE ổn định hơn.
import torch
from diffusers import DiffusionPipeline, AutoModel
vae = AutoModel.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix", dtype=torch.float16
)
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
vae=vae,
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)Tái sử dụng các mô hình trong nhiều pipeline
Khi làm việc với nhiều pipeline sử dụng cùng một model, phương thức from_pipe() cho phép tái sử dụng model thay vì tải lại nó mỗi lần. Điều này cho phép bạn sử dụng nhiều pipeline mà không làm tăng mức sử dụng bộ nhớ.
Việc sử dụng bộ nhớ được xác định bởi pipeline có yêu cầu bộ nhớ cao nhất, bất kể số lượng pipeline.
Ví dụ dưới đây tải một pipeline, sau đó tải một pipeline thứ hai bằng from_pipe() để sử dụng perturbed-attention guidance (PAG) nhằm cải thiện chất lượng sinh.
Sử dụng AutoPipelineForText2Image vì DiffusionPipeline không hỗ trợ PAG. Tham khảo tài liệu AutoPipeline để biết thêm.
import torch
from diffusers import AutoPipelineForText2Image
pipeline_sdxl = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, device_map="cuda" # or "mps", "xpu", "cpu"
)
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
image = pipeline_sdxl(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")
# Max memory reserved: 10.47 GBĐặt enable_pag=True trong pipeline thứ hai để bật PAG. Pipeline thứ hai sử dụng cùng một lượng bộ nhớ vì nó chia sẻ trọng số mô hình với pipeline thứ nhất.
pipeline = AutoPipelineForText2Image.from_pipe(
pipeline_sdxl, enable_pag=True
)
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
image = pipeline(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")
# Max memory reserved: 10.47 GBCác pipeline được tạo bởi from_pipe() chia sẻ cùng các model và state. Việc thay đổi state của một model trong một pipeline sẽ ảnh hưởng đến tất cả các pipeline khác cùng chia sẻ model đó.
Một số phương thức có thể không hoạt động chính xác trên các pipeline được tạo bằng from_pipe(). Ví dụ, enable_model_cpu_offload() dựa vào thứ tự thực thi mô hình duy nhất, thứ tự này có thể khác trong pipeline mới. Để đảm bảo chức năng hoạt động đúng, hãy áp dụng lại các phương thức này trên pipeline mới.
Các bước tiếp theo
Sau khi pipeline được nạp, bạn thường tinh chỉnh lịch trình khử nhiễu, đổi định dạng trọng số hoặc gắn các adapter.
- Schedulers bao gồm việc thay thế và cấu hình thuật toán khử nhiễu.
- Định dạng mô hình bao gồm GGUF, checkpoint dạng tệp đơn và các bố cục trọng số khác.
- Giảm mức sử dụng bộ nhớ bao gồm việc offload và các công cụ bộ nhớ khác.
- LoRA bao gồm việc nạp các adapter vào một pipeline.
- Legacy checkpoints bao gồm trình kiểm tra an toàn cho các checkpoint Stable Diffusion cũ hơn.