Buckets:

hf-doc-build/doc / diffusers /main /id /optimization /data_parallelism.md
mishig's picture
|
download
raw
4.15 kB
# Paralelisme data
[Data parallelism](https://huggingface.co/spaces/nanotron/ultrascale-playbook?section=data_parallelism) mereplikasi model yang sama di setiap GPU dan memberikan prompt yang berbeda ke setiap GPU. Hal ini meningkatkan throughput ketika model sudah muat di satu GPU, dan tidak mengubah latensi untuk satu prompt. Jika belum, coba [Batch inference](../using-diffusers/batched_inference) di satu GPU terlebih dahulu. Lihat [Distributed inference](../training/distributed_inference) untuk membandingkannya dengan strategi lainnya.
Anda dapat mengatur paralelisme data dengan [Accelerate](https://huggingface.co/docs/accelerate/index) atau langsung dengan [PyTorch Distributed](https://pytorch.org/tutorials/beginner/dist_overview.html).
## Accelerate
Accelerate menyiapkan proses dan mengalokasikan satu GPU untuk masing-masing proses.
Install Accelerate dengan perintah berikut.
```bash
uv pip install accelerate
```
Buat [PartialState](https://huggingface.co/docs/accelerate/main/en/package_reference/state#accelerate.PartialState) di file bernama `run_distributed.py` untuk menyiapkan lingkungan terdistribusi. Pindahkan [DiffusionPipeline](/docs/diffusers/main/id/api/pipelines/overview#diffusers.DiffusionPipeline) ke `PartialState.device` untuk mengalokasikan GPU ke setiap proses.
```py
import torch
from accelerate import PartialState
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
distributed_state = PartialState()
pipeline.to(distributed_state.device)
```
Pada file yang sama, gunakan [split_between_processes](https://huggingface.co/docs/accelerate/main/en/package_reference/state#accelerate.PartialState.split_between_processes) sebagai context manager untuk membagi prompt di antara proses.
```py
with distributed_state.split_between_processes(["a dog", "a cat"]) as prompt:
result = pipeline(prompt).images[0]
result.save(f"result_{distributed_state.process_index}.png")
```
Jalankan skrip dengan `accelerate launch`, dan atur `--num_processes` ke jumlah GPU.
```bash
accelerate launch --num_processes=2 run_distributed.py
```
> [!TIP]
> Untuk contoh lengkap, lihat [skrip inferensi multi-GPU minimal](https://gist.github.com/sayakpaul/cfaebd221820d7b43fae638b4dfa01ba) ini. Untuk mempelajari lebih lanjut, lihat panduan [Inferensi terdistribusi dengan Accelerate](https://huggingface.co/docs/accelerate/en/usage_guides/distributed_inference#distributed-inference-with-accelerate).
## PyTorch Distributed
Anda juga dapat mengatur paralelisme data langsung dengan `torch.distributed`, tanpa Accelerate.
Panggil [init_process_group](https://pytorch.org/docs/stable/distributed.html#torch.distributed.init_process_group) untuk membuat lingkungan terdistribusi. `torchrun` mengatur rank dari setiap proses dan jumlah total proses (world size) melalui variabel lingkungan, sehingga Anda tidak perlu melewatkan parameter tersebut secara manual.
Setiap proses membutuhkan GPU dan prompt-nya sendiri. `torchrun` mengatur variabel lingkungan `LOCAL_RANK` ke indeks GPU proses tersebut pada node-nya, jadi gunakan itu untuk memilih GPU. Gunakan `get_rank`, yang menghitung proses di semua node, untuk memilih prompt.
```py
import os
import torch
import torch.distributed as dist
from diffusers import DiffusionPipeline
def main():
dist.init_process_group("nccl")
rank = dist.get_rank()
local_rank = int(os.environ["LOCAL_RANK"])
device = torch.device(f"cuda:{local_rank}")
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16,
).to(device)
prompts = ["a dog", "a cat"]
prompt = prompts[rank]
image = pipeline(prompt).images[0]
image.save(f"{prompt.replace(' ', '_')}.png")
dist.destroy_process_group()
if __name__ == "__main__":
main()
```
Simpan skrip sebagai `run_distributed.py` dan jalankan dengan `torchrun`. Atur `--nproc-per-node` ke jumlah GPU. Daftar `prompts` memiliki satu prompt per proses, jadi tambahkan prompt untuk setiap GPU yang Anda gunakan.
```bash
torchrun --nproc-per-node 2 run_distributed.py
```

Xet Storage Details

Size:
4.15 kB
·
Xet hash:
822d71d21708b778ef2886b6e3feda9515309f10aa10af1e806c1bccbf6f0feb

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