Diffusers documentation
DiffusionPipeline
DiffusionPipeline
Model difusi terdiri dari beberapa komponen seperti UNet atau transformator difusi (DiT), pengkode teks, autoencoder variational (VAE), dan penjadwal. DiffusionPipeline membungkus semua komponen ini ke dalam satu API yang mudah digunakan tanpa mengorbankan fleksibilitas untuk memodifikasi komponennya.
Panduan ini akan menunjukkan cara memuat DiffusionPipeline.
Memuat pipeline
DiffusionPipeline adalah kelas pipeline dasar yang secara otomatis memilih dan mengembalikan instance dari subclass pipeline model, seperti QwenImagePipeline, dengan memindai file model_index.json untuk nama kelasnya.
Lewati model id ke from_pretrained() untuk memuat pipeline.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Setiap model memiliki subclass pipeline spesifik yang mewarisi dari DiffusionPipeline. Subclass biasanya memiliki fokus yang sempit dan spesifik untuk tugas tertentu. Lihat tabel di bawah ini untuk contoh.
| subkelas pipeline | tugas |
|---|---|
| QwenImagePipeline | teks-ke-gambar |
| QwenImageImg2ImgPipeline | image-to-image |
| QwenImageInpaintPipeline | inpaint |
Anda dapat menggunakan subclass secara langsung dengan meneruskan model id ke 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"
)Lihat dokumentasi Format file tunggal untuk mempelajari cara memuat model file tunggal.
Pipeline lokal
Pipelines juga dapat dijalankan secara lokal. Gunakan snapshot_download untuk mengunduh repositori model.
from huggingface_hub import snapshot_download
local_dir = snapshot_download(repo_id="Qwen/Qwen-Image")Lewati path tersebut ke from_pretrained() untuk memuatnya.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
local_dir, dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)Metode from_pretrained() tidak akan mengunduh file dari Hub ketika mendeteksi jalur lokal. Namun, ini juga berarti metode tersebut tidak akan mengunduh dan meng-cache pembaruan apa pun yang telah dilakukan pada model.
Tipe data Pipeline
Gunakan argumen dtype di from_pretrained() untuk memuat model dengan tipe data tertentu. Hal ini memungkinkan Anda memuat berbagai model dalam presisi yang berbeda. Misalnya, memuat model transformer besar dalam presisi setengah mengurangi memori yang dibutuhkan.
Lewatkan tipe data untuk setiap model sebagai kamus ke dtype. Gunakan kunci default untuk mengatur tipe data default. Jika model tidak ada dalam kamus dan default tidak disediakan, model dimuat dalam presisi penuh (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)Anda tidak perlu menggunakan kamus jika Anda memuat semua model dalam tipe data yang sama.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
print(pipeline.transformer.dtype, pipeline.vae.dtype)Penempatan perangkat
Argumen device_map menempatkan pipeline pada perangkat. Saat runtime, Diffusers menerima "balanced", "cpu", dan string akselerator untuk mesin yang Anda gunakan (biasanya "cuda", "mps", atau "xpu").
| parameter | deskripsi |
|---|---|
| string akselerator | Menempatkan pipeline pada perangkat tersebut. Sampaikan akselerator yang didukung oleh mesin Anda, seperti "cuda", "mps", atau "xpu". |
"balanced" | Spreads pipeline components across visible GPUs. Gunakan dengan max_memory ketika Anda memerlukan batas per-perangkat. |
"cpu" | Menempatkan pipeline di CPU. |
Gunakan argumen max_memory di from_pretrained() untuk mengalokasikan jumlah memori maksimum yang akan digunakan pada setiap perangkat. Secara default, Diffusers menggunakan jumlah maksimum yang tersedia.
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,
)Atribut hf_device_map memungkinkan Anda untuk mengakses dan melihat device_map.
print(pipeline.hf_device_map)
# {'transformer': 1, 'vae': 1, 'text_encoder': 0}Atur ulang device_map sebuah pipeline dengan metode reset_device_map(). Hal ini diperlukan jika Anda ingin menggunakan metode seperti .to(), enable_sequential_cpu_offload(), dan enable_model_cpu_offload().
pipeline.reset_device_map()
Memuat paralel
Model besar sering kali dipecah menjadi file-file yang lebih kecil agar lebih mudah dimuat. Diffusers mendukung pemuatan shard secara paralel untuk mempercepat proses pemuatan.
Setel HF_ENABLE_PARALLEL_LOADING ke "YES" untuk mengaktifkan pemuatan shard secara paralel.
Argumen device_map harus diatur ke "cuda" untuk mengalokasikan awal blok memori besar berdasarkan ukuran model. Hal ini secara signifikan mengurangi waktu pemuatan model karena pemanasan alokator memori kini menghindari banyak panggilan kecil ke alokator di kemudian hari.
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"
)Mengganti model dalam pipeline
DiffusionPipeline bersifat fleksibel dan mendukung pemuatan model atau scheduler lain. Anda dapat bereksperimen dengan scheduler yang berbeda untuk mengoptimalkan kecepatan atau kualitas generasi, serta mengganti model dengan yang lebih performan.
Contoh di bawah ini menggunakan versi VAE yang lebih stabil.
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"
)Memanfaatkan ulang model dalam beberapa pipeline
Saat bekerja dengan beberapa pipeline yang menggunakan model yang sama, metode from_pipe() memungkinkan penggunaan ulang model alih-alih memuat ulang setiap kali. Hal ini memungkinkan Anda menggunakan beberapa pipeline tanpa meningkatkan penggunaan memori.
Penggunaan memori ditentukan oleh pipeline dengan kebutuhan memori tertinggi, terlepas dari jumlah pipeline.
Contoh di bawah ini memuat sebuah pipeline, kemudian memuat pipeline kedua dengan from_pipe() untuk menggunakan perturbed-attention guidance (PAG) guna meningkatkan kualitas generasi.
Gunakan AutoPipelineForText2Image karena DiffusionPipeline tidak mendukung PAG. Lihat dokumentasi AutoPipeline untuk mempelajari lebih lanjut.
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 GBSet enable_pag=True pada pipeline kedua untuk mengaktifkan PAG. Pipeline kedua menggunakan jumlah memori yang sama karena berbagi bobot model dengan yang pertama.
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 GBPipelines yang dibuat oleh from_pipe() berbagi model dan state yang sama. Memodifikasi state model di satu pipeline memengaruhi semua pipeline lain yang berbagi model yang sama.
Beberapa metode mungkin tidak berfungsi dengan benar pada pipeline yang dibuat dengan from_pipe(). Sebagai contoh, enable_model_cpu_offload() bergantung pada urutan eksekusi model yang unik, yang mungkin berbeda pada pipeline baru. Untuk memastikan fungsionalitas yang tepat, terapkan ulang metode-metode ini pada pipeline baru.
Langkah selanjutnya
Setelah pipeline dimuat, Anda biasanya menyesuaikan jadwal denoising, mengganti format bobot, atau menempelkan adapter.
- Schedulers membahas penggantian dan konfigurasi algoritma denoising.
- Format model mencakup GGUF, checkpoint file tunggal, dan tata letak bobot lainnya.
- Mengurangi penggunaan memori membahas offloading dan alat memori lainnya.
- LoRA membahas pemuatan adapter pada pipeline.
- Checkpoint lama membahas pemeriksa keamanan untuk checkpoint Stable Diffusion yang lebih lama.