# DiffusionPipeline

Model difusi terdiri dari beberapa komponen seperti UNet atau transformator difusi (DiT), pengkode teks, autoencoder variational (VAE), dan penjadwal. [DiffusionPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.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](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline).

## Memuat pipeline

[DiffusionPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline) adalah kelas pipeline dasar yang secara otomatis memilih dan mengembalikan instance dari subclass pipeline model, seperti [QwenImagePipeline](/docs/diffusers/v0.43.0/id/api/pipelines/qwenimage#diffusers.QwenImagePipeline), dengan memindai file `model_index.json` untuk nama kelas.

Lewati model id ke [from_pretrained()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) untuk memuat pipeline.

```py
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](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline). Subclass biasanya memiliki fokus yang sempit dan spesifik untuk tugas tertentu. Lihat tabel di bawah ini untuk contoh.

| subkelas pipeline | tugas |
|---|---|
| [QwenImagePipeline](/docs/diffusers/v0.43.0/id/api/pipelines/qwenimage#diffusers.QwenImagePipeline) | teks-ke-gambar |
| [QwenImageImg2ImgPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/qwenimage#diffusers.QwenImageImg2ImgPipeline) | image-to-image |
| [QwenImageInpaintPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/qwenimage#diffusers.QwenImageInpaintPipeline) | inpaint |

Anda dapat menggunakan subclass secara langsung dengan meneruskan model id ke [from_pretrained()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained).

```py
import torch
from diffusers import QwenImagePipeline

pipeline = QwenImagePipeline.from_pretrained(
  "Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

> [!TIP]
> Lihat dokumentasi [Format file tunggal](./other-formats#single-file-format) untuk mempelajari cara memuat model file tunggal.

### Pipeline lokal

Pipelines juga dapat dijalankan secara lokal. Gunakan [snapshot_download](https://huggingface.co/docs/huggingface_hub/v2.4.0/en/package_reference/file_download#huggingface_hub.snapshot_download) untuk mengunduh repositori model.

```py
from huggingface_hub import snapshot_download

local_dir = snapshot_download(repo_id="Qwen/Qwen-Image")
```

Lewati path tersebut ke [from_pretrained()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) untuk memuatnya.

```py
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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.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`).

```py
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.

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

| parameter | deskripsi |
|---|---|
| string akselerator | Menempatkan 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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) untuk mengalokasikan jumlah memori maksimum yang akan digunakan pada setiap perangkat. Secara default, Diffusers menggunakan jumlah maksimum yang tersedia.

```py
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`.

```py
print(pipeline.hf_device_map)
# {'transformer': 1, 'vae': 1, 'text_encoder': 0}
```

Atur ulang `device_map` sebuah pipeline dengan metode [reset_device_map()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.reset_device_map). Hal ini diperlukan jika Anda ingin menggunakan metode seperti `.to()`, [enable_sequential_cpu_offload()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.enable_sequential_cpu_offload), dan [enable_model_cpu_offload()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.enable_model_cpu_offload).

```py
pipeline.reset_device_map()
```

## Memuat paralel

Model besar sering kali [dipecah](../optimization/memory#sharded-checkpoints) 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.

```py
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](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.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.

```py
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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe) untuk menggunakan [perturbed-attention guidance (PAG)](../api/pipelines/pag) guna meningkatkan kualitas generasi.

> [!WARNING]
> Gunakan [AutoPipelineForText2Image](/docs/diffusers/v0.43.0/id/api/pipelines/auto_pipeline#diffusers.AutoPipelineForText2Image) karena [DiffusionPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline) tidak mendukung PAG. Lihat dokumentasi [AutoPipeline](../tutorials/autopipeline) untuk mempelajari lebih lanjut.

```py
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.

```py
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
```

> [!WARNING]
> Pipelines yang dibuat oleh [from_pipe()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.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()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe). Sebagai contoh, [enable_model_cpu_offload()](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline.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](./schedulers) membahas penggantian dan konfigurasi algoritma denoising.
- [Format model](./other-formats) mencakup GGUF, checkpoint file tunggal, dan tata letak bobot lainnya.
- [Mengurangi penggunaan memori](../optimization/memory) membahas offloading dan alat memori lainnya.
- [LoRA](../tutorials/using_peft_for_inference) membahas pemuatan adapter pada pipeline.
- [Checkpoint lama](./legacy_checkpoints#safety-checker) membahas pemeriksa keamanan untuk checkpoint Stable Diffusion yang lebih lama.

