Buckets:
| # 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/v1.15.0/en/package_reference/state#accelerate.PartialState) di file bernama `run_distributed.py` untuk menyiapkan lingkungan terdistribusi. Pindahkan [DiffusionPipeline](/docs/diffusers/v0.43.0/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/v1.15.0/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.16 kB
- Xet hash:
- 9b669fb6e048e87d49d4c11eafe26a5768c75b85b083a97ff56e4b88738a5d36
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.