Diffusers documentation
Paralellik
Paralellik
Paralellik stratejileri, hesaplamaları birden fazla cihaz arasında dağıtarak difüzyon dönüştürücülerini hızlandırmaya yardımcı olur ve bu sayede daha hızlı çıkarım/eğitim süreleri sağlar. Daha fazla bilgi için Distributed inferece kılavuzuna bakın.
ParallelConfig
sınıf diffusers.ParallelConfig
< source >( context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = Nonetensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None )
Farklı paralelliklerin uygulanması için yapılandırma.
ContextParallelConfig
sınıf diffusers.ContextParallelConfig
< source >( ring_degree: int | None = Noneulysses_degree: int | None = Noneconvert_to_fp32: bool = Truerotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather'mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = Noneulysses_anything: bool = Falsering_anything: bool = False_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_flattened_mesh: DeviceMesh = None_ring_mesh: DeviceMesh = None_ulysses_mesh: DeviceMesh = None_ring_local_rank: int = None_ulysses_local_rank: int = None )
Parametreler
- ring_degree (
int, isteğe bağlı, varsayılan1) — Ring Attention için kullanılacak cihaz sayısı. Dizi, cihazlar arasında bölünür. Her cihaz, halka etrafında sırayla iletilen yerel Q ve KV parçacıkları arasındaki dikkati hesaplar. Daha düşük bellek kullanımı (aynı anda yalnızca KV'nin 1/N'ini tutar), hesaplamayı iletişimle örtüşür, ancak tüm jetonları görmek için N yineleme gerektirir. Sınırlı bellek/bant genişliğine sahip uzun diziler için en iyisidir. Bağlam paralel bölgesi içinde ring attention için kullanılacak cihaz sayısı. Bağlam paralel ızgarasındaki toplam cihaz sayısının bir böleni olmalıdır. - ulysses_degree (
int, isteğe bağlı, varsayılan1) — Ulysses Attention için kullanılacak cihaz sayısı. Sıralama, cihazlar arasında bölünür. Her cihaz yerel QKV'yi hesaplar, ardından tüm KV parçalarını all-gather ile toplayarak tam dikkati tek geçişte hesaplar. Daha yüksek bellek kullanımı (tüm KV'yi saklar), yüksek bant genişliğine sahip all-to-all iletişim gerektirir ancak gecikme daha düşüktür. İyi bir bağlantı bant genişliğine sahip orta uzunluktaki sıralamalar için en iyisidir. - convert_to_fp32 (
bool, isteğe bağlı, varsayılanTrue) — Çıktı ve LSE'nin, ring attention sayısal kararlılığı için float32'ye dönüştürülüp dönüştürülmeyeceği. - rotate_method (
str, isteğe bağlı, varsayılan"allgather") — Ring attention'de cihazlar arasında anahtar/değer durumlarını döndürmek için kullanılacak yöntem. Şu anda yalnızca"allgather"desteklenmektedir. - ulysses_anything (
bool, isteğe bağlı, varsayılanFalse) — “Ulysses Anything” modunun etkinleştirilip etkinleştirilmeyeceğini belirtir. Bu mod,ulysses_degreeile tam bölünemeyen keyfi dizi uzunluklarını ve baş sayılarını destekler. Etkinleştirildiğinde,ulysses_degree1'den büyük vering_degree1 olmalıdır. - ring_anything (
bool, isteğe bağlı, varsayılanFalse) — “Ring Anything” modunun etkinleştirilip etkinleştirilmeyeceğini belirtir. Bu mod, keyfi dizi uzunluklarını destekler. Etkinleştirildiğinde,ring_degree1'den büyük veulysses_degree1 olmalıdır. - mesh (
torch.distributed.device_mesh.DeviceMesh, opsiyonel) — Bağlam paralelliği için kullanılacak özel bir cihaz mesh'i. Sağlanırsa, yeni bir mesh oluşturmak yerine bu mesh kullanılır. Bu, bağlam paralelliğinin aynı cihaz mesh'ini paylaşan diğer paralellik stratejileriyle (ör. FSDP, tensor paralelliği) birleştirildiğinde faydalıdır. Mesh'in hem “ring” hem de “ulysses” boyutlarına sahip olması gerekir. Kullanılmayan boyutlar için 1 boyutu kullanın (ör. yalnızca FSDP ile ring attention içinmesh_shape=(2, 1, 4)vemesh_dim_names=("ring", "ulysses", "fsdp")).
Bağlam paralelliği için yapılandırma.
diffusers.hooks.apply_context_parallel
< source >( module: Moduleparallel_config: ContextParallelConfigplan: dict )
Bir modele bağlam paralelliği uygulayın.
TensorParallelConfig
sınıf diffusers.TensorParallelConfig
< source >( tp_degree: int = 1mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None_tp_degree: int = None )
Parametreler
- tp_degree (
int, varsayılan1) — Paylaştırılacak cihaz sayısı. Paralelleştirilen modelin dikkat başlarının (ve FFN gizli boyutlarının) sayısına bölünür olmalıdır. - mesh (
torch.distributed.device_mesh.DeviceMesh, isteğe bağlı) — Kullanılacak özel bir cihaz mesh'i. Sağlanırsa,tp_degreedeğerimesh.size()üzerinden çıkarılır ve bu argüman yoksayılır. Aynı mesh'i paylaşan TP ile diğer paralelleştirme stratejilerini (ör. CP) birleştirirken faydalıdır.
Tensor paralelliği için yapılandırma.
Tensor paralelliği, ağırlık matrislerini cihazlar arasında (sütun bazlı ve satır bazlı) parçalara ayırır. Her cihaz kısmi bir sonuç hesaplar; katman sınırlarındaki AllReduce/AllGather tam çıktıyı yeniden oluşturur. torch.distributed.tensor.parallelize_module kullanılır ve ColwiseParallel / RowwiseParallel parçalama stilleri uygulanır. Desteklenen cihaz türleri "cuda", "neuron" ve "tpu"'dur.
diffusers.hooks.apply_tensor_parallel
< source >( model: Moduleconfig: TensorParallelConfigtp_plan: dictweights_already_sharded: bool = False )
Parametreler
- model (
torch.nn.Module) — Yerinde bölünmesi gereken model. - config (
TensorParallelConfig) — Tensor-parallel yapılandırması. Cihaz ağı (device mesh) zatenconfig.setup(...)ile kurulmuş olmalıdır. - tp_plan (
dict) — Modül ad kümelemelerinden"colwise"/"rowwise"stiline (veya paketli bir varyanta) düz bir eşleme, genellikle modelin_tp_planalanıdır. - weights_already_sharded (
bool, varsayılanFalse) — Planlanan parametrelerin, akışkanfrom_pretrainedyükleme sonrasında olduğu gibi zatenDTensorparçaları olup olmadığı.Trueise yalnızca ileri yönlü kancalar (forward hooks) kaydedilir. Bu, algılanmak yerine açıkça geçirilir; çünkü checkpoint'te eksik olan bir planlanmış parametre yine de bir meta tensör olurdu ve aslında yarı-parçalı (half-sharded) olan bir model için algılama “parçalı değil” sonucunu verebilirdi.
Düz _tp_plan'ından bir modele tensör paralelliği uygulayın.