Diffusers documentation
Performa dasar
Performa dasar
Diffusion adalah proses acak yang membutuhkan daya komputasi tinggi. Anda mungkin perlu menjalankan DiffusionPipeline beberapa kali sebelum mendapatkan output yang diinginkan. Itulah mengapa penting untuk menyeimbangkan kecepatan generasi dan penggunaan memori secara cermat agar iterasi dapat dilakukan lebih cepat,
Panduan ini merekomendasikan beberapa tips kinerja dasar untuk menggunakan DiffusionPipeline. Lihat dokumen bagian Optimasi Inferensi seperti Akselerasi inferensi atau Kurangi penggunaan memori untuk panduan kinerja yang lebih detail.
Penggunaan memori
Mengurangi jumlah memori yang digunakan secara tidak langsung mempercepat proses generasi dan dapat membantu model muat di perangkat.
Metode enable_model_cpu_offload() memindahkan model ke CPU saat tidak digunakan untuk menghemat memori GPU.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.enable_model_cpu_offload()
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]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")Kecepatan inferensi
Denoising adalah proses yang paling menuntut komputasi selama difusi. Metode yang mengoptimalkan proses ini mempercepat kecepatan inferensi. Coba metode berikut untuk percepatan.
- Tambahkan
device_map="cuda"untuk menempatkan pipeline pada GPU. Menempatkan model pada akselerator, seperti GPU, meningkatkan kecepatan karena komputasi dilakukan secara paralel. - Set
dtype=torch.bfloat16untuk menjalankan pipeline dalam presisi setengah. Mengurangi presisi tipe data meningkatkan kecepatan karena waktu yang dibutuhkan untuk melakukan komputasi pada presisi yang lebih rendah lebih singkat.
import torch
import time
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda
)- Gunakan scheduler yang lebih cepat, seperti DPMSolverMultistepScheduler, yang hanya membutuhkan sekitar 20-25 langkah.
- Set
num_inference_stepske nilai yang lebih rendah. Mengurangi jumlah langkah inferensi akan mengurangi total jumlah komputasi. Namun, hal ini dapat menghasilkan kualitas generasi yang lebih rendah.
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)
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
"""
start_time = time.perf_counter()
image = pipeline(prompt).images[0]
end_time = time.perf_counter()
print(f"Image generation took {end_time - start_time:.3f} seconds")Kualitas generasi
Banyak model difusi modern menghasilkan gambar berkualitas tinggi secara bawaan. Namun, Anda masih dapat meningkatkan kualitas generasi dengan mencoba hal-hal berikut.
Coba gunakan prompt yang lebih detail dan deskriptif. Sertakan detail seperti medium gambar, subjek, gaya, dan estetika. Prompt negatif juga dapat membantu dengan mengarahkan model menjauh dari fitur yang tidak diinginkan dengan menggunakan kata-kata seperti low quality atau blurry.
import torch from diffusers import DiffusionPipeline pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, 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 """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]Untuk detail lebih lanjut tentang cara membuat prompt yang lebih baik, lihat dokumen teknik prompt.
Coba scheduler yang berbeda, seperti HeunDiscreteScheduler atau LMSDiscreteScheduler, yang mengorbankan kecepatan generasi demi kualitas.
import torch from diffusers import DiffusionPipeline, HeunDiscreteScheduler pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu" ) pipeline.scheduler = HeunDiscreteScheduler.from_config(pipeline.scheduler.config) 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 """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]
Langkah selanjutnya
Diffusers menawarkan optimasi yang lebih canggih dan kuat seperti group-offloading dan regional compilation. Untuk mempelajari lebih lanjut tentang cara memaksimalkan kinerja, lihat bagian Inference Optimization.
Update on GitHub