Diffusers documentation

DiffusionPipeline

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 pipelinetugas
QwenImagePipelineteks-ke-gambar
QwenImageImg2ImgPipelineimage-to-image
QwenImageInpaintPipelineinpaint

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

parameterdeskripsi
string akseleratorMenempatkan 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 GB

Set 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 GB

Pipelines 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.
Update on GitHub