Buckets:

mishig's picture
|
download
raw
7.47 kB

Google TPU

Tensor Processing Units (TPU'lar), Google'ın makine öğrenmesi hızlandırıcılarıdır ve Cloud TPU (v6e, v7x) olarak kullanılabilir. Diffusers, TPU'lar için PyTorch arka ucu olan TorchTPU aracılığıyla bunlarda çalışır ve bu, minimal kod değişikliği gerektirir.

Üç çalışma modu mevcuttur:

Mod Sabit Nasıl etkinleştirilir Notlar
Katı aceleci (varsayılan) EagerMode.DEFER_NEVER pipe.to("tpu") Birer birer dağıtılan işlemler, asenkron
Optimize edilmiş acele EagerMode.DEFER_AND_FUSE TORCH_TPU_DEFER_AND_FUSE=1 Operasyonlar ertelenir ve daha büyük grafiklere birleştirilir; katı eager'dan daha hızlıdır, derleme süresi daha uzundur
Derle — torch.compile(module, backend="tpu") TpuBackend ile AOT derleme

TorchTPU kurulum kılavuzunu izleyin. Kurulum tamamlandıktan sonra import torch otomatik olarak yüklenir ve "tpu" cihazını kaydeder; bu nedenle tek gereken değişiklik pipe.to("tpu") komutunu eklemektir. TORCH_DEVICE_BACKEND_AUTOLOAD=0 ile arka uç otomatik yüklemeyi devre dışı bıraktıysanız, yalnızca import torch_tpu satırını ekleyin.

Eager mod

FLUX.1-schnell tek bir v6e çipine bir arada sığmadığı için, her modelin yalnızca çalıştığı sırada TPU'ya taşınması için enable_model_cpu_offload() kullanın. "tpu" cihazını otomatik olarak algılar.

import torch

from diffusers import FluxPipeline

pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", dtype=torch.bfloat16)
pipe.enable_model_cpu_offload()

image = pipe(
    prompt="a golden retriever surfing a wave, photorealistic",
    height=1024,
    width=1024,
    num_inference_steps=4,
    guidance_scale=0.0,
).images[0]

image.save("output.png")

Bir model tek bir çip için çok büyükse veya birden fazla çipiniz varsa ve daha düşük gecikme süresi istiyorsanız, modelleri çipler arasında bölün (shard) olarak dağıtın. Tensor parallelism bölümüne bakın.

Derlenmiş mod

TorchTPU, "tpu" adını torch.compile arka uç adı olarak kaydeder (altta TpuBackend kullanılır), bu nedenle bileşenler herhangi bir torch.compile hedefi gibi derlenir. İlk çağrı (ısınma) derleme nedeniyle yavaştır; aynı şekillerle yapılan sonraki çağrılar derlenmiş grafiği yeniden kullanır.

TorchTPU statik şekiller gerektirir, bu nedenle dynamic=False parametresini iletin. Yeni bir height veya width değeri, o şekil için bir kez yeniden derlenir; daha önce görülmüş şekiller yeniden kullanılır. num_inference_steps değerini değiştirmek yeniden derlemeye neden olmaz.

Tüm pipeline tek bir çipe sığıyorsa, onu TPU'ya taşıyın ve tam dönüştürücüyü derleyin. Stable Diffusion 3.5 Medium (bf16'da ~15GB) tek bir v6e çipine sığar.

import torch

from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained("stabilityai/stable-diffusion-3.5-medium", dtype=torch.bfloat16)
pipe.to("tpu")
pipe.transformer.compile(backend="tpu", fullgraph=True, dynamic=False)

# Warmup — triggers static graph compilation.
pipe(prompt="warmup", height=1024, width=1024, num_inference_steps=40, guidance_scale=4.5)

# Later calls with the same shapes reuse the compiled graph.
image = pipe(
    prompt="a golden retriever surfing a wave, photorealistic",
    height=1024,
    width=1024,
    num_inference_steps=40,
    guidance_scale=4.5,
).images[0]

image.save("output.png")

Eğer pipeline tek bir çipe sığmıyorsa:

  • Birden fazla çip kullanıldığında, bunun yerine tensor parallelism ile bölün. Her şey TPU üzerinde kalır ve pipe.transformer.compile(...), bölünmüş transformer üzerinde aynı şekilde çalışır.
  • enable_model_cpu_offload() ile offload kancaları torch.compile tarafından izlenemez. Bunun yerine yalnızca transformer'ın tekrarlanan bloklarını derleyin: pipe.transformer.compile_repeated_blocks(backend="tpu", fullgraph=True, dynamic=False).

Tensor paralelliği

Tek bir çipe sığmayacak kadar büyük modelleri birden fazla çipe dağıtın. FLUX.2-dev'in metin kodlayıcısı (48GB) ve dönüştürücüsü (64GB) tek bir çipi aştığı için aşağıdaki örnek her ikisini de parçalara ayırır:

  • TensorParallelConfig ile transformer, from_pretrained() fonksiyonunun parallel_config argümanına geçirilir. Her rank, shard edilmiş her ağırlığın yalnızca kendi dilimini okuduğu için tam model asla maddi olarak oluşturulmaz. Genel TP ayrıntıları için (_tp_plan, colwise/rowwise) Tensor parallelism kılavuzuna bakın.
  • Transformers'ın kendi tensor parallelism'i ile metin kodlayıcıyı, bir DistributedConfig ve aynı mesh'i geçirerek.

TPU'da, süreç grubunu backend="tpu_dist" ile başlatın ve mesh'i DeviceMesh("tpu", ...) ile oluşturun.

import torch
import torch.distributed as dist
from torch.distributed.device_mesh import DeviceMesh
from transformers import DistributedConfig, Mistral3ForConditionalGeneration

from diffusers import Flux2Pipeline, Flux2Transformer2DModel, TensorParallelConfig

dist.init_process_group(backend="tpu_dist")
mesh = DeviceMesh("tpu", list(range(dist.get_world_size())))

repo_id = "black-forest-labs/FLUX.2-dev"
text_encoder = Mistral3ForConditionalGeneration.from_pretrained(
    repo_id,
    subfolder="text_encoder",
    dtype=torch.bfloat16,
    distributed_config=DistributedConfig(tp_plan="auto"),
    device_mesh=mesh,
)
transformer = Flux2Transformer2DModel.from_pretrained(
    repo_id, subfolder="transformer", dtype=torch.bfloat16, parallel_config=TensorParallelConfig(mesh=mesh)
)
pipe = Flux2Pipeline.from_pretrained(
    repo_id, text_encoder=text_encoder, transformer=transformer, dtype=torch.bfloat16
)
pipe.vae.to("tpu")

image = pipe(
    prompt="a golden retriever surfing a wave, photorealistic",
    num_inference_steps=28,
    generator=torch.Generator("cpu").manual_seed(0),
).images[0]
if dist.get_rank() == 0:
    image.save("output.png")

Her çip için bir süreç başlatın. --nproc_per_node parametresini, hostunuzdaki tüm TPU çiplerini kullanmak üzere ayarlayın.

eval $(python -m torch_tpu._internal.distributed.launchers.singlehost_wrapper | sed 's/^/export /')
torchrun --nproc_per_node=8 flux2_tp.py

Yukarıdaki başlatma komutu, TorchTPU iç modülü olan torch_tpu._internal'ı kullanır; bu bir kararlı API değildir ve gelecekteki bir TorchTPU sürümünde değişmesi beklenmektedir. Çok çipli işleri başlatmanın güncel yöntemi için TorchTPU deposunu kontrol edin.

Xet Storage Details

Size:
7.47 kB
·
Xet hash:
0db632af0ca5b15413feedfd8aa84e7aec361bd9a82f759bb50a411c8fb5dbab

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