Buckets:
| # Bagikan komponen model di beberapa GPU dengan device_map | |
| Argumen `device_map` menempatkan komponen model pada GPU yang terpisah. Gunakan ini ketika model tidak muat di satu GPU dan GPU Anda tidak memiliki interkoneksi yang cepat. Lihat [Inferensi terdistribusi](../training/distributed_inference) untuk membandingkannya dengan strategi lain, dan [Penempatan perangkat](./memory#device-placement) untuk opsi `device_map` lainnya. | |
| Contoh di bawah ini memuat setiap komponen hanya untuk tahap yang membutuhkannya, dan menggunakan `device_map` untuk mendistribusikan komponen besar ke dua GPU. | |
| ## Enkode prompt | |
| Setel `device_map="balanced"` untuk menempatkan text encoder di GPU yang terpisah. Gunakan `max_memory` untuk membatasi jumlah memori yang digunakan oleh masing-masing GPU. Setel `transformer` dan `vae` ke `None` agar hanya text encoder yang dimuat. | |
| ```py | |
| from diffusers import FluxPipeline | |
| import torch | |
| 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 = FluxPipeline.from_pretrained( | |
| "black-forest-labs/FLUX.1-dev", | |
| transformer=None, | |
| vae=None, | |
| device_map="balanced", | |
| max_memory={0: "16GB", 1: "16GB"}, | |
| dtype=torch.bfloat16 | |
| ) | |
| with torch.no_grad(): | |
| print("Encoding prompts.") | |
| prompt_embeds, pooled_prompt_embeds, text_ids = pipeline.encode_prompt( | |
| prompt=prompt, prompt_2=None, max_sequence_length=512 | |
| ) | |
| ``` | |
| Setelah Anda memiliki teks embeddings, hapus text encoders dari GPU untuk memberi ruang bagi transformer. | |
| ```py | |
| import gc | |
| def flush(): | |
| gc.collect() | |
| torch.cuda.empty_cache() | |
| torch.cuda.reset_max_memory_allocated() | |
| torch.cuda.reset_peak_memory_stats() | |
| del pipeline.text_encoder | |
| del pipeline.text_encoder_2 | |
| del pipeline.tokenizer | |
| del pipeline.tokenizer_2 | |
| del pipeline | |
| flush() | |
| ``` | |
| ## Denoise dengan transformer yang dipecah | |
| Set `device_map="auto"` agar Accelerate menempatkan transformer. Proses ini mengisi GPU pertama sebelum berpindah ke GPU berikutnya, dan hanya menggunakan CPU atau disk ketika memori GPU habis. Pada dua GPU berukuran lebih kecil, transformer akan terbagi di kedua GPU tersebut. Bobot yang berada di CPU atau disk akan memperlambat inferensi. | |
| ```py | |
| from diffusers import AutoModel | |
| import torch | |
| transformer = AutoModel.from_pretrained( | |
| "black-forest-labs/FLUX.1-dev", | |
| subfolder="transformer", | |
| device_map="auto", | |
| dtype=torch.bfloat16 | |
| ) | |
| ``` | |
| > [!TIP] | |
| > Periksa `transformer.hf_device_map` untuk melihat bagaimana transformer didistribusikan di antara perangkat. Pipeline yang dimuat dengan `device_map` juga memiliki atribut `hf_device_map` yang menunjukkan di mana setiap komponen ditempatkan. | |
| Muat pipeline hanya dengan transformer, dan setel `output_type="latent"` agar mengembalikan latents alih-alih gambar. | |
| ```py | |
| pipeline = FluxPipeline.from_pretrained( | |
| "black-forest-labs/FLUX.1-dev", | |
| text_encoder=None, | |
| text_encoder_2=None, | |
| tokenizer=None, | |
| tokenizer_2=None, | |
| vae=None, | |
| transformer=transformer, | |
| dtype=torch.bfloat16 | |
| ) | |
| print("Running denoising.") | |
| height, width = 768, 1360 | |
| latents = pipeline( | |
| prompt_embeds=prompt_embeds, | |
| pooled_prompt_embeds=pooled_prompt_embeds, | |
| num_inference_steps=50, | |
| guidance_scale=3.5, | |
| height=height, | |
| width=width, | |
| output_type="latent", | |
| ).images | |
| ``` | |
| ## Decode latents | |
| Hapus pipeline dan transformer dari memori, lalu muat VAE untuk mendekode latents. VAE cukup kecil untuk muat di satu GPU. | |
| ```py | |
| import torch | |
| from diffusers import AutoencoderKL | |
| from diffusers.image_processor import VaeImageProcessor | |
| del pipeline.transformer | |
| del pipeline | |
| del transformer | |
| flush() | |
| vae = AutoencoderKL.from_pretrained( | |
| "black-forest-labs/FLUX.1-dev", subfolder="vae", dtype=torch.bfloat16 | |
| ).to("cuda") # or "mps", "xpu", "cpu" | |
| vae_scale_factor = 2 ** (len(vae.config.block_out_channels) - 1) | |
| image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor) | |
| with torch.no_grad(): | |
| print("Running decoding.") | |
| latents = FluxPipeline._unpack_latents(latents, height, width, vae_scale_factor) | |
| latents = (latents / vae.config.scaling_factor) + vae.config.shift_factor | |
| image = vae.decode(latents, return_dict=False)[0] | |
| image = image_processor.postprocess(image, output_type="pil") | |
| image[0].save("split_transformer.png") | |
| ``` | |
| Dengan memuat dan melepas model yang Anda butuhkan pada tahap tertentu secara selektif serta membagi model terbesar ke beberapa GPU, Anda dapat menjalankan inferensi dengan model besar pada GPU konsumen. | |
Xet Storage Details
- Size:
- 4.62 kB
- Xet hash:
- ca22fc6861b9d219217b7c9436c5fca3ec3f87921397abcafbb02ffb1dec9c91
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.