Buckets:

mishig's picture
|
download
raw
4.88 kB

AWS Trainium

TorchNeuron, Trainium2 ve Trainium3 için yerel PyTorch arka ucudur. Diffusers, torch_neuronx paketi üzerinden bu örneklerde çalışır; bu paket "neuron" cihazını kaydeder ve bu sayede pipeline'lar, diğer herhangi bir cihazda olduğuyla aynı kodla çalışır.

İki çalışma modu mevcuttur:

Mod Nasıl etkinleştirilir Notlar
Eager pipe.to("neuron") Birer birer dağıtılan işlemler, asenkron
Derle torch.compile(module, backend="neuron") Tüm grafik derlemesi, statik şekiller

Neuron SDK'yi yapılandırmak ve torch_neuronx'i yüklemek için AWS Neuron belgelerini izleyin. Yüklendikten sonra import torch bunu otomatik olarak yükler ve "neuron" cihazını kaydeder, bu nedenle tek gereken değişiklik pipe.to("neuron")'tür. TORCH_DEVICE_BACKEND_AUTOLOAD=0 ile arka uç otomatik yüklemeyi devre dışı bıraktıysanız yalnızca import torch_neuronx ekleyin.

Eager modunda, her işlem ilk çalıştığında derlenir. Derlenmiş modda, ilk çağrı grafı derler. Her iki mod da derlenmiş Neuron yürütülebilir biçimini (NEFF) varsayılan olarak tmp/neff_cache altında önbelleğe alır ve bu dizin yeniden başlatmada temizlenir. Önbelleği korumak için TORCH_NEURONX_NEFF_CACHE_DIR değerini kalıcı bir dizine ayarlayın.

Eager mod

FLUX.2-klein-4B tek bir NeuronCore üzerinde çalışır, bu nedenle tüm pipeline'ı "neuron" cihazına taşıyın.

import torch

from diffusers import Flux2KleinPipeline

pipe = Flux2KleinPipeline.from_pretrained("black-forest-labs/FLUX.2-klein-4B", dtype=torch.bfloat16)
pipe.to("neuron")

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

image.save("output.png")

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

Derlenmiş mod

TorchNeuron, "neuron" adını bir torch.compile arka uç adı olarak kaydeder; bu sayede 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.

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

import torch

from diffusers import Flux2KleinPipeline

pipe = Flux2KleinPipeline.from_pretrained("black-forest-labs/FLUX.2-klein-4B", dtype=torch.bfloat16)
pipe.to("neuron")
pipe.transformer.compile(backend="neuron", fullgraph=True, dynamic=False)

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

# 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=4,
).images[0]

image.save("output.png")

Tekrarlayan bloklara sahip transformer'lar için, bu blokları ayrı ayrı derlemek üzere compile_repeated_blocks(...) kullanın. Bu blok yeniden kullanılır ve derleme süresini önemli ölçüde azaltır.

Tensor paralelliği

Model yükleme, bölme planları ve kısıtlamalar için Tensor parallelism kılavuzunu izleyin. Neuron için örneğini uyarlamak üzere CUDA işlem grubu ve cihaz kurulumunu aşağıdakiyle değiştirin.

Neuron üzerinde, süreç grubunu backend="neuron" ile başlatın ve mesh'i DeviceMesh("neuron", ...) ile oluşturun.

import torch
import torch.distributed as dist
from torch.distributed.device_mesh import DeviceMesh

from diffusers import TensorParallelConfig

dist.init_process_group(backend="neuron")
mesh = DeviceMesh("neuron", list(range(dist.get_world_size())))
device = torch.neuron.current_device()
parallel_config = TensorParallelConfig(mesh=mesh)

Bu parallel_config değerini transformer'ın from_pretrained() metoduna iletin ve kalan pipeline bileşenleri için device parametresini kullanın.

Her NeuronCore için bir süreç başlatın. --nproc_per_node değerini, paylaştırmak istediğiniz NeuronCore sayısına ayarlayın.

torchrun --nproc_per_node=8 tensor_parallel_neuron.py

Xet Storage Details

Size:
4.88 kB
·
Xet hash:
7b080ee8a355d11ec4f69df627dcd1fd077314c0af0833c27655ce2b1d60d9f1

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