Expert Parallelism
Uzman paralelliği, karışık uzmanlı katmanların uzmanlarını GPU'lara dağıtır ve her belirteci tümden tüme iletişimle ilgili uzmana yönlendirir.
Uzman paralelliği (EP), karışım-uzman (MoE) modelleri için dağıtık eğitim ve çıkarım stratejisidir. Farklı uzmanları farklı GPU'lara yerleştirir ve her token'ı, o token için seçilen uzmanları barındıran aygıtlara gönderir. Bir MoE katmanı, dönüştürücünün büyük ileri beslemeli bloğu yerine, çok sayıda küçük uzman ağı ve token başına yalnızca birkaç uzmanı etkinleştiren bir yönlendirici kullanır; böylece toplam parametre sayısı, her token için gereken hesaplama miktarından çok daha hızlı artabilir. Uzman paralelliği, bu parametrelerin belleğe sığmasını sağlar: Her GPU tüm uzmanları saklamak yerine bunların bir bölümünü saklar. Noam Shazeer ve Google'daki çalışma arkadaşları, 2017 tarihli seyrek kapılı MoE katmanlarında uzmanları aygıtlara yayarak her uzmanın ortak bir kopyasını kullanmıştı. GShard bu yaklaşımı Haziran 2020'de ölçeklendirerek 600 milyardan fazla parametreli bir çeviri modelinin uzmanlarını 2.048 TPU v3 hızlandırıcıya dağıttı. Uzman paralelliği, büyük MoE dil modellerinin ve görüntü-dil modellerinin eğitimi ve sunumu için artık standarttır.
Belirteçler GPU'lar Arasında Nasıl Taşınır#
Her MoE katmanı dört adımda çalışır:
- Yönlendirme: Yönlendirici her belirteci her uzmana göre puanlar ve genellikle bir, iki veya sekiz olan en yüksek puanlı k uzmanı seçer.
- Gönderim: Tümden tüme bir kolektif işlem, her token'ın gizli durumunu seçilen uzmanların sahibi olan GPU'lara gönderir.
- Hesaplama: Her GPU, aldığı belirteçler üzerinde kendi yerel uzmanlarını çalıştırır.
- Birleştirme: İkinci bir tümü-tümü işlemi, çıktıları her belirtecin ilk GPU'suna geri gönderir; bu GPU'da çıktılar yönlendirici puanlarına göre ağırlıklandırılıp toplanır.
Aşağıdaki kod parçası, dört GPU'ya dağıtılmış sekiz uzman ve GPU başına iki uzman içeren tek bir katmandaki yönlendirme ve dağıtım adımlarını simüle eder:
import torch
torch.manual_seed(0)
num_experts, num_gpus, top_k = 8, 4, 2
tokens = torch.randn(4096, 512) # 4.096 belirtecin gizil durumları
router = torch.nn.Linear(512, num_experts)
# Yönlendirme: her belirteç, yönlendirici puanına göre en yüksek puanlı 2 uzmanı seçer
with torch.no_grad():
_, experts = router(tokens).topk(top_k, dim=-1)
# Uzman paralelliği: 0-1 numaralı uzmanlar GPU 0'da, 2-3 numaralı uzmanlar GPU 1'de bulunur ve böyle devam eder
gpu = experts // (num_experts // num_gpus)
# Dağıtım: her uzmanın ve GPU'nun aldığı belirteç-uzman atamalarını say
print(torch.bincount(experts.flatten(), minlength=num_experts).tolist())
print(torch.bincount(gpu.flatten(), minlength=num_gpus).tolist())Çıktının ilk satırı, her uzmanın 948 ile 1.087 arasında atama aldığını gösterir; eşit dağılım 1.024 olur. İkinci satırsa dört GPU'nun 8.192 atamanın 1.968 ile 2.139 arasındaki sayılarını aldığını gösterir. Rastgele başlatılmış bir yönlendirici bile işi eşit olmayan biçimde dağıtır; eğitim görmüş yönlendiricilerdeyse popüler uzmanlar gelişerek yükü çok daha fazla dengesizleştirir.
Yük Dengeleme ve Kapasite#
Bir katman ancak en yoğun GPU işini bitirdiğinde tamamlanır; bu nedenle yönlendirmedeki dengesizlik doğrudan donanımın boşta kalmasına yol açar. MoE eğitimi bu soruna üç şekilde karşı koyar:
- Yardımcı dengeleme kaybı: Kayıp işlevine eklenen bir terim, token'ları uzmanlara eşit biçimde dağıttığı için yönlendiriciyi ödüllendirir.
- Kapasite çarpanı: Her uzman bir yığın başına en fazla sabit sayıda token kabul eder; örneğin eşit payın 1,25 katını. Kapasiteyi aşan token'lar o uzmanı atlar.
- Önyargı tabanlı dengeleme: DeepSeek-V3, yönlendirici puanlarına yalnızca hangi uzmanların seçileceğini etkileyen uzman başına bir önyargı ekler. Her adımdan sonra aşırı yüklenen uzmanların önyargısını düşürüp boşta kalanlarınkini artırarak ana amaçla rekabet eden yardımcı bir kayıp olmadan yükü dengeler.
Kapasite sınırı olduğunda her token'ın izleyeceği yol, uzmanlarının ne kadar meşgul olduğuna bağlıdır:
Atlanan bir token, katmanın artık bağlantısından değişmeden geçer; bu nedenle yoğun token eleme kaliteyi düşürür. DeepSeek-V3 eğitim sırasında hiçbir token'ı elemez, bunun yerine önyargı tabanlı dengelemeye dayanır.
Diğer maliyet iletişimdir. Her MoE katmanında iki tümden tüme aktarım gerçekleşir; bu nedenle uzman paralelliği en iyi, GPU'ların hızlı NVLink bağlantılarını paylaştığı düğüm içinde çalışır ve düğümler arasındaki daha yavaş bağlantılarda pahalı hâle gelir. DeepSeek-V3, her katmandaki 256 yönlendirilen uzmanı 8 düğüme yayılan 64 yönlü uzman paralelliğiyle dağıtır; her token'ı en fazla 4 düğümdeki uzmanlara gönderir ve aktarımları hesaplamayla örtüştürür.
Paralellik Stratejilerini Birleştirme#
Uzman paralelliği, eğitimi aygıtlara bölmenin çeşitli yollarından biridir:
- Veri paralelliği: Her GPU'da modelin tamamını çoğaltır ve her yığını böler; her adımdan sonra gradyanları eşzamanlar.
- Tensör paralelliği: Tek tek ağırlık matrislerini GPU'lara böler; böylece her GPU her katmanda yer alır.
- Boru hattı paralelliği: Ardışık katmanları farklı GPU'lara atar ve mikro yığınları bu katmanlardan geçirir.
- Bağlam paralelliği: Tek bir uzun girdi dizisini GPU'lara böler.
Tek bir GPU'ya sığan yoğun modeller için veri paralelliğinin ötesinde bir yönteme gerek yoktur; Ultralytics YOLO26 device=[0, 1] gibi bir cihaz listesi eğitim modunda verildiğinde birden fazla GPU'da bu şekilde eğitilir. Büyük MoE modelleri birden fazla paralellik türünü bir arada kullanır: DeepSeek-V3, token başına 37 milyarı etkin olmak üzere toplam 671 milyar parametresini 16 yönlü ardışık düzen paralelliği, 64 yönlü uzman paralelliği ve parçalı veri paralelliğiyle, tensör paralelliği kullanmadan eğitti. Çıkarım motorları, örneğin vLLM, model sunarken aynı bölme yöntemini uygular; böylece uzmanları tek bir GPU'nun belleğine sığmayacak bir MoE modeli birden fazla GPU'da çalışır ve her GPU uzmanların yalnızca kendisine ayrılan kısmını barındırır.










