Diffusers documentation

Performa dasar

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.bfloat16 untuk 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_steps ke 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