Buckets:

mishig's picture
|
download
raw
4.68 kB

Ikhtisar

Inferensi difusi sangat mahal secara komputasi, dan Anda sering kali menjalankan DiffusionPipeline lebih dari sekali sebelum menyukai hasilnya. Halaman ini memberikan gambaran umum tentang teknik optimasi Diffusers utama, apa yang dilakukan, dan kapan harus menggunakannya.

Jalur pemula

Ketika model muat di satu GPU, mulai dengan beban dasar ini. Atur dtype dan letakkan pipeline di akselerator. Gunakan model CPU offload hanya ketika memori terbatas. Anda juga bisa mempercepat inferensi dengan langkah yang lebih sedikit atau scheduler yang lebih cepat.

Saat Anda mengabaikan dtype, Diffusers memuat komponen dalam float32. Sampaikan dtype=torch.bfloat16 (atau torch.float16 jika bfloat16 tidak didukung), lalu letakkan pipeline pada akselerator dengan pipeline.to("cuda").

import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.bfloat16,
)
pipeline.to("cuda")  # or "mps", "xpu"

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
"""
pipeline(prompt).images[0]

Jika pipeline tidak muat, atau memori terbatas, panggil enable_model_cpu_offload() alih-alih menyimpan semuanya di GPU. Fungsi ini menempatkan model aktif di GPU dan menyimpan komponen lainnya di CPU.

Lewati langkah ini jika model muat. Offloading lebih lambat jika tidak diperlukan.

Untuk lebih banyak opsi offloading, lihat Kurangi penggunaan memori.

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.bfloat16,
)
pipeline.enable_model_cpu_offload()

Latensi lebih rendah dengan num_inference_steps yang lebih sedikit atau scheduler yang lebih cepat seperti DPMSolverMultistepScheduler. Hal itu biasanya mempercepat proses generasi, tetapi dapat mengurangi kualitas gambar dibandingkan scheduler yang lebih lambat namun berkualitas lebih tinggi. Lihat teknik optimasi di bawah untuk teknik kecepatan lainnya.

import time
from diffusers import DPMSolverMultistepScheduler

pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)

start_time = time.perf_counter()
image = pipeline(prompt, num_inference_steps=25).images[0]
end_time = time.perf_counter()

print(f"Image generation took {end_time - start_time:.3f} seconds")

Teknik optimasi

Ketika jalur awal tidak cukup, gunakan teknik-teknik ini. Jika inferensi terlalu lambat, mulai dengan torch.compile, caching, atau backend attention. Jika Anda kehabisan memori, mulai dengan offloading atau kuantisasi.

Inferensi yang lebih cepat:

  • torch.compile — Mengompilasi UNet, transformer, atau VAE menjadi kernel yang dioptimalkan.
  • Kompilasi regional — Kompilasi blok yang berulang untuk memangkas latensi cold-start torch.compile dan menggunakan kembali artefak yang dikompilasi.
  • Caching — Memanfaatkan kembali nilai perantara di antara langkah-langkah denoising ketika Anda menginginkan kecepatan lebih tinggi dan dapat mengalokasikan memori lebih banyak.
  • Backend perhatian — Ganti implementasi perhatian Diffusers melalui API terpadu ketika perhatian menjadi hambatan utama.
  • Kernels — Muat kernel komputasi Hub yang dioptimalkan (attention dan operasi CUDA khusus seperti RMSNorm atau RoPE) ketika Anda membutuhkan percepatan spesifik perangkat keras di luar PyTorch standar.

Memori lebih sedikit:

  • Offloading — Pindahkan model atau lapisan yang tidak aktif ke CPU dengan offloading CPU, model, atau grup.
  • Kuantisasi — Muat bobot yang lebih kecil untuk memangkas memori (beberapa backend juga mempercepat inferensi). GGUF adalah titik awal yang umum.
  • VAE slicing dan VAE tiling — Dekode batch besar atau gambar resolusi tinggi secara bertahap untuk menurunkan memori puncak.

Keduanya:

Xet Storage Details

Size:
4.68 kB
·
Xet hash:
9fc16839380fe1b90a5c407974d9a19bc467cb70dd869d392bafee16aad2efed

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.