Context Parallelism
Bağlam paralelliğinin, bellek kullanımını azaltmak, transformer eğitimini ölçeklendirmek ve uzun belge ile video AI iş yüklerini desteklemek için uzun dizileri GPU'lar arasında nasıl dağıttığını öğren.
Bağlam paralelliği, uzun bir girdi dizisini birden fazla hızlandırıcı arasında bölen dağıtık bir hesaplama tekniğidir. Her bir GPU, dikkat (attention) sırasında diğerleriyle iş birliği yaparken dizinin yalnızca bir kısmını işler. Bu, cihaz başına aktivasyon belleğini azaltarak bir transformer modelinin, çok uzun belgeler, genişletilmiş videolar veya büyük görüntü yama koleksiyonları gibi tek bir GPU'nun belleğini aşabilecek girdiler üzerinde eğitilmesini sağlar.
Bir modelin bağlam penceresini basitçe genişletmenin aksine, bağlam paralelliği mimarinin teorik olarak ne kadar bilgiyi kabul edebileceğini değiştirmez. Bunun yerine, dizi boyutunu dağıtarak bu bağlamın işlenmesini hesaplama açısından pratik hale getirir.
Bağlam Paralelliği Nasıl Çalışır?#
Bir dizinin 32.000 token içerdiğini ve bağlam paralelliğinin dört GPU kullandığını varsayalım. Her cihaz başlangıçta yaklaşık 8.000 token alır ve ilgili ara aktivasyonları depolar.
Normalizasyon ve ileri beslemeli katmanlar gibi çoğu işlem, bu yerel dizi yığınlarını bağımsız olarak işleyebilir. Buradaki zorluk dikkat mekanizmasıdır: yerel bir sorgunun (query), diğer her cihazın elinde bulunan anahtarlara (keys) ve değerlere (values) dikkat etmesi gerekebilir.
Bu nedenle uygulamalar, GPU'lar arasında anahtar-değer (KV) bloklarını takas eder. Halka dikkat (ring attention) mekanizmasında, her cihaz yerel verilerini kullanarak kısmi dikkat hesaplar, bir sonraki cihaza bir KV bloğu iletir ve tüm diziyi işleyene kadar bunu tekrarlar. PyTorch bağlam paraleli eğitimi dağıtık ölçeklendirilmiş nokta çarpımı dikkati aracılığıyla bu davranışı gösterirken, NVIDIA bağlam paraleli paketi all-gather, reduce-scatter ve halka tabanlı iletişim seçeneklerini açıklar.
Nihai sonuç, normal sayısal farklılıklara tabi olmak üzere tam dizili dikkat ile matematiksel olarak eşdeğerdir, ancak hiçbir tekil GPU her dizi aktivasyonunu tutmak zorunda değildir.
Bağlam Paralelliği Neden Önemlidir?#
Uzun diziler iki büyük ölçeklendirme sorunu yaratır. İlk olarak, dizi uzunluğu arttıkça kaydedilen aktivasyonlar daha fazla bellek tüketir. İkinci olarak, standart öz-dikkat (self-attention) dizideki token'ları karşılaştırarak önemli ölçüde hesaplama ve geçici veriler üretir.
Bağlam paralelliği, aktivasyonları cihazlar arasında bölerek bellek sorununu çözer. İletişim yeni bir maliyet getirse de dikkat çalışmalarını da bölebilir. Verimli sistemler, NCCL toplu işlemler kılavuzunda belgelenenler gibi işlemler kullanarak KV aktarımlarını hesaplama ile çakıştırır.
Bu teknik, model ağırlıkları veya grup boyutu yerine dizi uzunluğu bellek aşımı (out-of-memory) hatasına neden olduğunda en değerli halini alır. Dağıtık eğitimin daha geniş alanına aittir ve birden fazla boyutu aynı anda ölçeklendirmek için genellikle diğer stratejilerle birleştirilir.
Bağlam Paralelliği ve İlgili Teknikler#
- Tensör paralelliği, bireysel katmanlar içindeki işlemleri veya ağırlık matrislerini böler. Bağlam paralelliği ise bunun yerine token'ları dizi boyutu boyunca böler.
- Boru hattı paralelliği, model katmanlarının farklı gruplarını farklı cihazlara atar. Dizi uzunluğundan ziyade model derinliğini bölümlere ayırır.
- Veri paralelliği, modeli kopyalar ve her kopyaya farklı eğitim örnekleri verir. PyTorch dağıtık genel bakışı, modelin tamamı ve her örnek tek bir GPU'ya sığdığında bunu önerir.
- Dizi paralelliği, genellikle tensör paralelliğiyle ilişkili seçilmiş işlemler için aktivasyonları parçalar. Bağlam paralelliği ise dizi bölütlemeyi ağ girdileri ve aktivasyonları boyunca daha geniş bir şekilde uygular.
Bu yaklaşımlar birbirini tamamlayıcı niteliktedir. NVIDIA paralellik stratejileri kılavuzu, bağlam, tensör, boru hattı ve veri paralelliğinin çok boyutlu bir cihaz düzenini nasıl oluşturabileceğini gösterir.
Gerçek Dünya Uygulamaları#
-
Uzun belge yapay zekası: Hukuki veya tıbbi bir dil modelinin tüm dava dosyasını, hasta geçmişini veya teknik kılavuzu işlemesi gerekebilir. Bağlam paralelliği, binlerce belge token'ını hızlandırıcılar arasında dağıtarak uzak bölümler arasındaki dikkati korurken aktivasyon belleği baskısını azaltır.
-
Uzun video ve çok modlu anlama: Video transformer'ları ve büyük görme modelleri kareleri, görüntü yamalarını, ses segmentlerini ve metni tek bir uzun token dizisi olarak temsil edebilir. Bu diziyi dağıtmak, modellerin kare sayısını veya uzamsal detayı agresif bir şekilde azaltmadan uzun kayıtları analiz etmesine yardımcı olur. AWS Neuron bağlam paralelliği genel bakışı, hızlandırıcı gruplarının bu uzun bağlamlı iş yükleri için KV parçalarını nasıl takas edebileceğini gösterir.
Ultralytics YOLO26 gibi kompakt bilgisayarlı görü mimarileri için bağlam paralelliği genellikle gereksizdir. Ultralytics model eğitimi iş akışı aracılığıyla sağlanan standart çoklu GPU veri paralelliği genellikle eğitimi hızlandırmanın daha uygun yoludur.
Pratik Kullanım ve Ödünleşimler#
Aşağıdaki minimum örnek, PyTorch'un deneysel bağlam paraleli API'sini ve ölçeklendirilmiş nokta çarpımı dikkati kontrollerini kullanır. Bunu cp_example.py olarak kaydedin ve torchrun --standalone --nproc-per-node=2 cp_example.py ile iki GPU üzerinde başlatın.
import os
import torch
import torch.distributed as dist
import torch.nn.functional as F
from torch.distributed.device_mesh import init_device_mesh
from torch.distributed.tensor.experimental import context_parallel
from torch.nn.attention import SDPBackend, sdpa_kernel
rank = int(os.environ["RANK"])
world_size = int(os.environ["WORLD_SIZE"])
torch.cuda.set_device(rank)
torch.cuda.manual_seed(0)
dist.init_process_group("nccl")
mesh = init_device_mesh("cuda", (world_size,))
qkv = [torch.randn(1, 4, 4096, 64, device="cuda", dtype=torch.bfloat16, requires_grad=True) for _ in range(3)]
with sdpa_kernel(SDPBackend.FLASH_ATTENTION), context_parallel(mesh, buffers=tuple(qkv), buffer_seq_dims=(2, 2, 2)):
output = F.scaled_dot_product_attention(*qkv, is_causal=True)
output.float().square().mean().backward()
dist.destroy_process_group()Burada 2. boyut dizi boyutudur, bu nedenle her süreç bir dizi parçası alırken dikkat, cihaz örgüsü (mesh) genelinde koordine olur.
Uygulamada mühendisler, azalan bellek maliyetinin iletişim yükünden fazla olduğundan emin olmalı, hızlı veri yolları (interconnects) kullanmalı ve temsilci dizi uzunluklarını kıyaslamalıdır (benchmark). Standart görü projeleri için Ultralytics Platform, manuel bağlam paraleli yapılandırmasına ihtiyaç duymadan veri seti etiketleme, eğitim, dağıtım ve izleme için daha basit bulut ve yerel iş akışları sağlar.






