Stable Diffusion: Tutorial Komprehensif
Daftar Isi
Pendahuluan
Stable Diffusion adalah model difusi laten yang menghasilkan gambar berkualitas tinggi dari deskripsi teks. Berbeda dengan model difusi sebelumnya yang beroperasi langsung di ruang piksel, Stable Diffusion bekerja di ruang laten yang terkompresi, sehingga jauh lebih cepat dan hemat memori. Tutorial ini membahas segala hal mulai dari generasi teks-ke-gambar dasar hingga teknik lanjutan seperti ControlNet dan fine-tuning DreamBooth.
Library Diffusers dari Hugging Face menyediakan antarmuka yang paling mudah untuk bekerja dengan model Stable Diffusion, dan tutorial ini menggunakannya secara ekstensif.
Prasyarat
# Instal paket yang diperlukan
pip install diffusers transformers accelerate torch torchvision
pip install safetensors xformers
pip install Pillow numpy
pip install peft # Untuk fine-tuning dengan LoRA/DreamBooth
Persyaratan sistem:
- Python 3.9 atau lebih tinggi
- GPU NVIDIA dengan minimal 8 GB VRAM (16 GB direkomendasikan untuk fine-tuning)
- CUDA 11.8 atau lebih tinggi
- Minimal 16 GB RAM sistem
Verifikasi setup Anda:
import torch
import diffusers
print(f"Versi PyTorch: {torch.version}")
print(f"CUDA tersedia: {torch.cuda.isavailable()}")
print(f"GPU: {torch.cuda.getdevicename(0) if torch.cuda.isavailable() else 'Tidak ada'}")
print(f"Versi Diffusers: {diffusers.version}")
Memahami Arsitektur Stable Diffusion
Stable Diffusion terdiri dari tiga komponen utama:
Proses generasi bekerja sebagai berikut: dimulai dengan noise acak di ruang laten, kemudian secara iteratif menghilangkan noise menggunakan U-Net, dipandu oleh conditioning teks dari CLIP.
Generasi Gambar dari Teks
Generasi Dasar
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import torch
def buatpipeline(modelid="stabilityai/stable-diffusion-2-1"):
"""Inisialisasi pipeline Stable Diffusion."""
pipe = StableDiffusionPipeline.frompretrained(
modelid,
torchdtype=torch.float16,
safetychecker=None,
)
pipe.scheduler = DPMSolverMultistepScheduler.fromconfig(pipe.scheduler.config)
pipe = pipe.to("cuda")
# Aktifkan optimasi memori
pipe.enableattentionslicing()
return pipe
pipe = buatpipeline()
Hasilkan gambar
prompt = "Pemandangan gunung yang tenang saat matahari terbenam, fotorealistis, resolusi 8k"
negativeprompt = "buram, kualitas rendah, terdistorsi, cacat"
gambar = pipe(
prompt=prompt,
negativeprompt=negativeprompt,
numinferencesteps=30,
guidancescale=7.5,
width=768,
height=768,
).images[0]
gambar.save("gunungsunset.png")