Verimli ve taşınabilir uzman karışımı iletişimi
Büyük ölçekli yapay zeka modellerinde GPU paralelliğini optimize etmeye ve gecikmeyi azaltmaya odaklanan, taşınabilir Uzman Karışımı (MoE) iletişime genel bakış
Standart All-to-All iletişim ilkel öğelerine kıyasla 10 kat daha hızlı performans elde eden, Uzman Karışımı (MoE) iletişimi için yüksek performanslı, taşınabilir, açık kaynaklı bir kütüphane sunuyoruz.
Uygulamamız, üstün MoE iletişim verimliliği sağlayan birkaç önemli teknik yenilik içermektedir:
GPU tarafından başlatılan iletişim (IBGDA): Doğrudan GPU'dan NIC'ye iletişimi destekler ve CPU katılımını ortadan kaldırarak gecikmeyi önemli ölçüde azaltır
İletişim ve hesaplama örtüşmesi: Ayrı gönderme ve alma aşamalarına sahip bölünmüş çekirdek mimarisi, hesaplamanın ağ aktarımlarıyla eş zamanlı olarak gerçekleşmesini sağlar
En hızlı tek düğüm performansı: Tek düğümlü konfigürasyonlarda daha önce en hızlı olan uygulamaya kıyasla 2,5 kat daha düşük gecikme
Verimli ve taşınabilir çoklu düğüm performansı: Uygulamamız standart all-to-all iletişiminden 10 kata kadar daha hızlı hızlara ulaşır. Son derece özelleştirilmiş uygulamalara göre yaklaşık 2 kat daha yavaş olmasına rağmen yaklaşımımız, NVSHMEM sürümleri ve ağ ortamları (NVLink, CX-7 ve EFA) arasında daha iyi taşınabilirlik sunar
Kütüphane tamamen açık kaynaklıdır ve https://github.com/ppl-ai/pplx-kernels adresinde mevcuttur.
Bu makalede, büyük ölçekli MoE modellerindeki uzman paralelliği zorluklarını inceliyor ve dağıtık GPU ortamlarında verimli token dağıtımı ve birleştirilmesine yönelik yaklaşımımızı açıklıyoruz.
Giriş
DeepSeek R1 ve Mixtral 8x7B gibi Uzman Karışımı (MoE) modelleri, her token için etkinleştirilen ağırlık sayısını sınırlayarak yoğun modelleri geliştirir. Her kod çözücü (decoder) katmanının Çok Katmanlı Algılayıcısındaki (MLP) katman sayısını artırarak veya doğrusal katmanların boyutunu büyüterek yüksek parametre sayılarına ulaşmak yerine MoE modelleri geleneksel MLP'yi birden fazla uzman ve bir yönlendirici (router) ile değiştirir. Örneğin, DeepSeek R1'in 671B parametresinden yalnızca 37B'si çıkarım sırasında belirli bir token ile çarpılır. Bu, bir token'ın kodunu çözmek için gereken hesaplama miktarını büyük ölçüde azaltır ve yoğun bir modele kıyasla gecikmeyi iyileştirir.
MoE modelleri, yoğun modellere kıyasla çıkarım için bazı ek zorluklar sunar. Uzmanların kendileri küçük MLP katmanları olsa da her kod çözücü katmanı, bir token'ın hangi uzmanlara gönderileceğine karar veren ve her token'ın birden fazla uzmana gönderildiği bir yönlendirici içerir. Yönlendirici genellikle olasılık dağılımı üreten küçük bir doğrusal katmandır. Genellikle en yüksek K puana sahip uzmanlar seçilir ve son aktivasyon, yönlendiricinin olasılık dağılımından türetilen bir ağırlıkla çarpılan uzman çıktıları toplanarak ağırlıklı ortalama olarak hesaplanır.
Dağıtık MoE sistemlerinde gecikmeyi en aza indirmek için paralellik birden fazla cihaz arasında kullanılabilir, ancak bu durum iletişim zorluklarını beraberinde getirir. Mixtral 8x7B veya Llama-70B gibi modeller tek bir düğümdeki 8 cihaza sığar ve hızlı ile düşük gecikmeli NVLink bağlantılarından (900Gbps'ye kadar) yararlanır. Bununla birlikte, daha büyük modeller, InfiniBand (en fazla 400Gbps) kullanarak uzmanların birden fazla düğüme parçalanmasını (sharding) gerektirir ve bu da ek gecikme zorlukları ortaya çıkarır.
Bu makalede, uzman paralelizmi sorununu ele alıyor; atanmış uzmanları barındıran cihazlara tokenları verimli bir şekilde gönderen ve uzman çıktılarının ağırlıklı toplamını hesaplayarak bunları geri toplayan GPU çekirdeği uygulamamızı açıklıyoruz. Belirli ağ donanımını hedefleyen yoğun biçimde optimize edilmiş uygulamalar mevcut olsa da, yalnızca minimal bir NVSHMEM ilkel kümesine dayanan, buna rağmen standart tümden-tüme iletişimden 10 kat daha hızlı performans sunan son derece taşınabilir bir uygulama sunuyoruz. Uygulamamız, çeşitli ağ ortamlarında mükemmel taşınabilirliği korurken tek düğüm yapılandırmalarında en ileri düzey performans elde eder.
Parçalama (Sharding) ve Paralellik
Verimli bir çıkarım için, bir modelin ağırlıkları cihaz belleğinde tutulmalı ve aynı zamanda modelin ileri geçişi (forward pass) için gereken aktivasyonlar, KV önbellekleri ve diğer arabellekler (buffers) için yeterli alan bırakılmalıdır. En yetenekli modeller en güçlü GPU'ların bile kapasitesini aşar; bu nedenle çıkarım, modelin ağırlıklarını toplu olarak depolayabilen birden fazla cihaza yayılmalıdır. Ağırlıkların parçalama şemalarına bağlı olarak, hesaplamayı yükten kurtarmak ve cihazları senkronize etmek için farklı iletişim ve hesaplama şemaları kullanılmalıdır.
İlk görselde gösterilen Uzman Paralelliği (EP), yalnızca uzman hesaplamasını paralelleştirir. Farklı uzmanlar, ağırlıklarını barındıran farklı cihazlara atanır. Yönlendirmeden sonra token'lar ilgili cihaza gönderilir, sonuçlar daha sonra toplanır ve biriktirilir. Yönlendirmenin karmaşıklığı, modelin diğer bölümlerindeki paralellik derecesine bağlıdır: diğer katmanların çoğaltılması yönlendirme ihtiyacını tamamen ortadan kaldırabilir, çünkü her sıra (rank) yerel olarak çoğaltılmış bir yönlendirme tablosundan token'ları seçebilir. Bununla birlikte, sıralardan yalnızca biri yönlendirme çalıştırırsa, token'ları, indisleri ve ağırlıkları ilgili uzmanlarına göndermek için bir yayın (broadcast) gereklidir. Son olarak, bir all-gather veya all-to-all yayını, çıktı token'larını modelin yürütülmesine devam eden herhangi bir sıra ile senkronize eder. torch gerekli ilkel öğeleri zaten sunduğundan böyle bir uygulama nispeten basittir, ancak birikimi uzmanlardan token'ları toplayan toplama işlemiyle birleştirerek bazı avantajlar elde edilebilir.
Model dikkat (attention), norm ve örnekleme gibi uzman dışı katmanları çalıştırırken bir kümedeki düğümler boşta kalabileceğinden, yalnızca uzmana yönelik paralellik ideal düzeyde ölçeklenmez. Bununla birlikte, öncelikle dikkatin hesaplanması olan bu katmanların hesaplanması da Tensör Paralelliğinden (TP) yararlanabilir. Çoğu model çok kafalı dikkate (multi-head attention) dayanır; bu, dikkat kafalarının ve bunlara karşılık gelen Q, K ve V projeksiyonlarının da cihazlar arasında parçalanabileceği, dilimlerin çeşitli katmanlar arasında çoğaltılabileceği veya toplanabileceği anlamına gelir. Dikkat tüm cihazlara yayılırsa, bir all-gather aktivasyonları senkronize edebilir, böylece yönlendirmenin çoğaltılmasına izin verilir ve verimli bir uygulama için uzman paralelliği durumuna benzer senkronizasyon ilkel öğeleri gerekebilir. Bununla birlikte, dikkat kafalarının sayısının belirli bir eşiğin altına düşürülmesi azalan verim sağlayacağından, bu düzeydeki paralelliğin sınırları vardır.
Tüm cihazları en iyi şekilde kullanmak ve 128 veya 256 GPU'ya kadar çok yüksek bir uzman paralelliği derecesini desteklemek için Veri Paralelliği (DP) gereklidir. Bu şema altında, bir modelin bölündüğü cihazlar, istekleri eş zamanlı olarak işlemek için gruplandırılır; yerel grupları arasında parçalanmış dikkat hesaplaması yapılır ve KV önbellekleri korunur. Bu paralel grupların birden fazla örneği uzman değerlendirmesinde iş birliği yapar ve her biri uzman ağırlıklarının farklı bir alt kümesini barındırır. Düğüm içi iletişim daha hızlı olduğundan, dikkat kafalarının sayısına bağlı olarak bir grup tipik olarak tüm bir düğümün boyutuna kadar uznebilir. Örneğin, yukarıdaki görselde, bir DP sırası iki isteği (A ve B) bağımsız olarak hizmet eder, istekler için dikkati, normu ve diğer muhasebe işlemlerini yönetir. Diğer DP sırası farklı bir C isteğini işler. Bununla birlikte, ilk düğüm uzmanların yarısını, diğer düğüm ise diğer yarısını barındırır, bu nedenle A ve B'den gelen token'lar yönlendirildikten sonra ikinci düğüme gönderilebilir ve tersi de geçerlidir. Bu durum seyrek bir iletişim problemine yol açar: her cihaz diğer herhangi bir hedef sıraya farklı sayıda token gönderebilir. torch'tan gelen mevcut ilkel öğeler, özellikle all_to_all, bazı dolgu (padding) biçimleri veya GPU-CPU senkronizasyonu ve meta veri yayını gerektirebileceğinden pek uygun değildir. İletişimi etkili bir şekilde uygulamak için, yönlendirme bilgilerini işlemek ve CPU müdahalesi olmadan cihazlardan iletişimi başlatmak üzere özel çekirdeklere ihtiyaç vardır. Yönlendirmeden sonra bir dağıtım çekirdeği (dispatch kernel), token'ları yönlendirildikleri sıralara göndermelidir; birleştirme tarafında ise mevcut DP grubundaki isteklere ait aktivasyonlar toplanmalıdır. Ek olarak, yayını en aza indirmek ve sonraki katmanlar için tüm sıralardaki token'ları doğru bir şekilde çoğaltmak amacıyla, birden fazla cihaza sahip olabilen bir DP grubu içinde iş dengelenmelidir.
NVSHMEM
NVSHMEM, temel donanımın karmaşıklığını soyutlayan, taşınabilir cihazlar arası iletişim tesisleri sağlayan NVIDIA'ya özgü bir OpenSHMEM uygulamasıdır. API, bireysel taşıma katmanlarının ilkel öğelerine eşlenen cihazlar arası okuma ve yazma işlemlerini ifade edebilir. Hem NVLink hem de RDMA desteklenir; bu da bir dereceye kadar taşınabilirlik sağlar ve NVSHMEM çekirdeklerinin bir düğüm içinde veya birden fazla düğümden oluşan bir küme genelinde çalışmasına olanak tanır. Çekirdeklerimizde, verileri aktarmak ve katılan cihazları senkronize etmek için uzak bellek yazma ve sinyal verme işlemlerini kullanırız.
NVSHMEM işlemleri simetrik bellek kavramı etrafında oluşturulmuştur: cihazlar arası iletişime katılan tüm cihazlarda ayrılmış olan arabellekler üzerinde çalışırlar. Yerel bir cihaz, bir işlemin hedefini belirtmek için hedef sıranın dizini ile birlikte kendi yerel arabelleği içinde türetilmiş bir adresi kullanabilir. Aşağıdaki görsel bu kavramı göstermektedir: her iki GPU da aynı boyutta simetrik arabellekler ayırır ve bunlara src işaretçilerini (pointers) tutar. İlk sıra, ikincisine 3 tamsayı göndermek ve bunları arabelleğin başlangıcına yerleştirmek ister: nvshmem_int_put_nbi başlangıç adresini yerel arabellekten türeterek hedef cihazı belirtir. İkinci sıra kendi arabelleğinden bir uzaklık (offset) türeterek birinci cihaza bir öğe gönderir ve bir birim uzaklık uygular. Hedef adresler her zaman nvshmem_alloc kullanılarak ayrılan simetrik arabellekler olmalıdır, ancak kaynak arabellekler NVSHMEM'e önceden kaydedilmiş olmaları koşuluyla cihaz belleğinin keyfi bölgeleri olabilir.
NVSHMEM geniş bir ilkel öğe yelpazesi sağlasaM da, çekirdeklerimiz tüm senkronizasyon ve sınırlamaları bunların üzerine inşa ederek yalnızca 3 fonksiyona güvenir.
nvshmemx_putmem_signal_nbi_warp: Bir cihazdan diğerine bir veri bloğu aktarırken uzak cihazda bir bayrak da ayarlar. İşlem, 64 bitlik bir konumu ya ayarlar (NVSHMEM_SIGNAL_SET) ya da artırır (NVSHMEM_SIGNAL_ADD). Bayrak, bellek bloğunun tamamı aktarıldıktan sonra güncellenir. Uzak cihaz bayrakta bir değişiklik gözlemlerse, kendi belleğindeki arabelleğe güvenli bir şekilde erişebilir. Bu fonksiyon, veri aktarımı ile senkronizasyonun birleştirilmesi için yararlıdır.
nvshmemx_signal_op tek bir bellek konumunda (tipik olarak 64 bitlik bir bayrak) çalışarak onu atomik olarak ayarlar veya artırır. Meta verilerin gönderilmesinde ve cihazların senkronize edilmesinde yararlıdır.
nvshmem_uint64_wait_until, uzak cihaz güncelleyene kadar bir bayrağı yoklamak (poll) için bir sinyalin alıcı tarafında kullanılır.
nvshmem_quiet veya nvshmem_fence aracılığıyla işlemler arasında herhangi bir sıralama biçimini sağlamak maliyetlidir; bu nedenle çekirdek uygulamamız diğer NVSHMEM ilkel öğelerinin kullanımından kaçınır ve bireysel gönder-al çiftleri dışındaki bağımlılıkları en aza indirir. Veri gönderirken, verilerin yerel sıradan gönderilmesini bile beklemeden, her zaman fonksiyonların engellemesiz (non-blocking) versiyonunu kullanırız. Çekirdek grubu genelindeki diğer örtük senkronizasyonlar, NIC'lerin bu arabelleklerine erişmesi gerekirken bu arabelleklerin yıkıcı bir şekilde üzerine yazılmamasını sağlar.
NVSHMEM, NIC'lerin CPU'ları dahil etmeden veri değişimi için doğrudan GPU belleğini okuyup yazabilmesi amacıyla GPUDirect RDMA kullanır. Ayrıca, ConnectX NIC'lerde NVSHEMEM, GPU tarafından başlatılan iletişimi (Infiniband GPUDirect Async veya IBGDA olarak da bilinir) destekler; bu, GPU'nun RDMA işlemlerini doğrudan NIC'ye göndermesine ve NIC'nin tamamlama kuyruğunu doğrudan yoklamasına olanak tanır. GPU tarafından başlatılan iletişimi desteklemeyen platformlarda NVSHMEM, GPU adına iletişimi başlatmak ve tamamlama yoklaması yapmak için ana bilgisayar CPU'sunda bir "proxy" konu (thread) oluşturur. NVSHMEM programı, GPU tarafından başlatılan iletişimin desteklenip desteklenmediğine bakılmaksızın taşınabilirdir. Bununla birlikte, GPU tarafından başlatılan iletişim, CPU'ya yapılan dolambaçlı yolu tamamen ortadan kaldırdığı için gecikmeyi önemli ölçüde azaltır.
Taşınabilir Çekirdekler
MoE iletişimini bir dağıtım ve birleştirme çekirdeği çifti aracılığıyla uygularız. Dağıtım çekirdekleri, her sıradaki token'ları ve yönlendirme bilgilerini okumaktan ve bunları uygun uzmanlara dağıtmaktan sorumludur. Birleştirme çekirdekleri, uzmanlar tarafından üretilen aktivasyonları toplar ve bunları kaynak sıralarına geri gönderirken, yönlendirici tarafından hesaplanan ağırlıklara dayanarak seçilen uzmanlardan ağırlıklı ortalamayı da hesaplar. Veri aktarımlarının hesaplama ile örtüşmesine izin vermek için çekirdekler ayrıca bir gönder ve al bileşenine bölünmüştür. Gönderme çekirdeklerinin tümü engellemesiz ve senkronize etmeyendir: yalnızca tüm yazma işlemlerini uzaklara dağıtırlar. Diğer tarafta, birleştirme çekirdekleri yalnızca bellekten okur ve gerekli tüm veriler aktarılana kadar bekler. Çalışmalar NIC'lere dağıtıldıktan ve veriler kablo üzerinden asenkron olarak aktarılırken, GPU'lar yerel olarak paylaşılan uzmanları uygulamak veya dikkati hesaplamak gibi diğer yararlı işleri yapabilir.
Her çekirdek çiftinin kendi simetrik bellek arabellekleri vardır ve her sıra diğer tüm sıralardan veri almak için özel depolama alanı ayırır. Bir DP grubundan dağıtılabilecek maksimum token sayısı sıralar arasında sabittir; bu aynı zamanda her sıranın her DP sırasından her yerel uzman için alabileceği üst sınırı da belirler. Bu, gönderen sıraların, aralarında herhangi bir senkronizasyon gerektirmeden, yazmak için hedef sırada benzersiz bir adres türetmesini sağlar. Veriler alındıktan sonra çekirdekler, alıcı çekirdeklerin gerektirdiği en uygun biçimde belleğe yerleştirmek için token'ları karıştırır. Arabellekler hatırı sayılır bir boyuta sahip olsa da modelin tüm ardışık katmanları boyunca yeniden kullanılırlar.
Yukarıdaki görselde gösterildiği gibi küresel senkronizasyonun tek biçimi, birleştirme-alma çekirdeğinde uygulanır. Veriler gönderimden dağıtıldıktan sonra bir sıra, diğer sıralardan ihtiyaç duyduğu tüm token'ları aldığında geri döner ve yürütmeye devam eder ve işlenir işlenmez birleştirme gönderme çekirdeklerine girer. Birleştirme-alma aşamasındaki bariyer, hiçbir sıranın öne geçememesini ve potansiyel olarak yıkıcı örtüşmelere neden olacak şekilde diğer herhangi bir sıra veri almayı beklerken dispatch-send (dağıt-gönder) işlemine başlayamamasını sağlar. Senkronizasyon basitlik açısından birleştirme çekirdeğinde yapılır; bir optimizasyon olarak aynı bariyer dağıt-al ve birleştir-gönder çekirdekleri arasında uygulanabilir ve GPU diğer çekirdekleri çalıştırırken NIC'lerin aktarımları tamamlaması için daha fazla zaman tanınarak gecikme daha da azaltılabilir.
Her iki çekirdek de cihazların mevcut tüm SM'leri arasında bölünmüştür: dağıt-gönder ve birleştir-al çekirdekleri sıra başına maksimum token sayısı (max_m) üzerinden paralelleşmelidir, oysa dağıt-al ve birleştir-gönder çekirdekleri her sıradan ve yerel uzmandan en fazla max_m * (num_experts // EP) * (EP // TP) olmak üzere o kadar çok token'ı işlemelidir.
Dağıtım (Dispatch)
Dağıtım çekirdeği, token'ları ve blok ölçeklendirme faktörlerini, token'ların yönlendirildiği uzmanları barındıran eşlere dağıtmaktan sorumludur. Gönderen taraf, iki görevi paralelleştirmek için warp uzmanlığına dayanır: her sıradan kaç token'ın gönderildiğini belirlemek için yönlendirme bilgilerini toplamak ve token'ları uzaktakilere dağıtılacak mesajlar halinde paketlemek. Alıcı tarafı önce tüm token sayıverinin alınmasını bekler, ardından yükleri (payloads) paylaşılan bellekten aşağı akıştaki Gruplandırılmış GEMM çekirdeklerine aktarılacak tensörlere okur ve açar. Ayrıca, her token'ın nereye geri gönderilmesi gerektiğini belirtmek için birleştirme çekirdekleriyle paylaşılan arabelleklere bilgi kaydeder. Alma çekirdeği token'ları bitişik arabelleklerde deterministik olmayan bir sırada kardığı için bu bilgi gereklidir.
Gönderen kısımda, her bloktaki 32 konudan (threads) oluşan tek bir warp, yönlendirme bilgilerini okumaktan ve her hedef uzmanın bu sıradan alması beklenen token sayısını saymaktan sorumludur; nvshmem_signal_op kullanarak sayımı artı bir olarak gönderir. Uzak uçta sıfırdan sıfır olmayana geçiş, bir kaynak sıradan sayıların alındığını belirttiği için sayı bir artırılır. Paralel olarak, kalan warp'lar token'ları tüm bloklar arasında paralel olarak simetrik belleğe kopyalamak için iş birliği yapar; aktivasyonları, ölçeklendirme faktörlerini ve yerel sıradaki dizinlerini bitişik bir yığın halinde paketler. Dizin, birleştirme göndericisi tarafından token'ın yazılacağı adresi belirlemek için gereklidir. Ardından, warp grupları genelinde bir bariyer aracılığıyla tüm verilerin kopyalandığından emin olduktan sonra warp'lar yine bağımsız olarak çalışır ve her biri aynı arabelleği paralel olarak farklı bir uzmana gönderir. Token'lar, uzak cihazda yerel sıradan gönderilen token sayısını da atomik olarak artıran nvshmemx_putmem_signal_nbi_warp kullanılarak gönderilir. Bir DP grubu içinde, her sıra gönderilecek token'ın bir kopyasına sahip olduğundan dağıtım eşit olarak dengelenir ve her cihaz token'ların bir alt kümesini gönderir.
Alma tarafında, tüm çekirdekler önce gönderici sıralarıyla senkronize olur; bunun için gönderilecek toplam token sayılarının iletilmesini bekler. Ardından, atomik olarak artırılan gönderilmiş token sayılarının toplam sayılara ulaşmasını beklerler; bu da putmem çağrısının semantiği sayesinde kaynak sıralardaki tüm yüklerin de gönderilmiş olduğunu gösterir. Çekirdekler, işlemi tüm bloklar ve konular arasında paralelleştirerek sayılar üzerinde nvshmem_uint64_wait_until kullanarak yoklama yapar. Sonrasında, bloklar arası bir bariyer, tüm veriler doğru şekilde alınmadıkça hiçbir bloğun tamponları okumasını engeller. Bloklara yayılmış ve atomik olarak artırılan bir sayaçla senkronize edilen tokenlar, simetrik bellekten uzmanları uygulayan aşağı akış çekirdeklerinin girdileri hâline gelen sıradan, bitişik tamponlara kopyalanır. Kaynak sıra, uzman indeksi ve token indeksi ayrı ayrı saklanır; böylece birleştime çekirdeğinin aktivasyonları tam olarak nereye göndermesi gerektiği belirlenir. Tokenlar bir DP grubu içinden farklı cihazlardan gönderilse de, ilgili uzmana iletilmek üzere birlikte gruplandırılırlar.
Birleştirme (Combine)
Birleştirme çekirdekleri yine gönder ve al yarılarına bölünmüştür: göndericiler kuantize edilmemiş 16 bitlik aktivasyonları uzak cihazlara kopyalar, alıcı çekirdekler ise verilerin gönderilmesini bekler ve tüm uzman katkılarının ağırlıklı ortalamasını yerel olarak hesaplar. Ek olarak, dağıt-birleştir sırasını senkronize etmek için bir bariyer görevi de görürler: her sıra, gönderme çekirdeklerine girerken her eş üzerinde bir bayrak ayarlar ve alıcı çekirdeklerin bayrağın ayarlandığını gözlemlemedikleri sürece dönmesine izin verilmez. Senkronizasyonun gecikmesi minimumdur, çünkü gerçek iletişim ve hesaplama ile örtüşür.
Gönderen tarafta çekirdekler, tüm yerel uzmanlara atanan token listesini paralel olarak tarayarak bunları hedef sıradaki bir arabelleğe yazar. Hedef sıra, uzman dizini ve token dizini, token'ların alınması üzerine scater çekirdekleri tarafından doldurulan token başı arabelleklerden okunur. Yukarıdaki görselde belirtildiği gibi, her gönderenin yazmak için uzman başına kendi özel bellek bölgesi vardır ve bu da senkronizasyon ihtiyacını ortadan kaldırır. Dağıtıma benzer şekilde, birleştirme, verilerin alındığını belirtmek için hedef sıradaki token başı sayaçları atomik olarak artırır: sayaç, bir token'ın gönderildiği uzman sayısı ile eşleştiğinde token içeriğine erişilebilir.
Alma çekirdeğinde, token listesi birden fazla blok arasında paralel olarak taranır ve sinyal verme işlemi tarafından ayarlanan bayrak yoklanarak içeriklerinin gelmesi beklenir. Geldikten sonra, yönlendirme tablosunun hangi aralıktan okunacağını ve her uzmana hangi ağırlığın atanacağını belirttiği özel arabelleklerden yükler okunur. Sonuçlar daha sonra harici olarak ayrılmış tensörlere yazılır ve tüm cihazlar bariyeri geçtiğinde çekirdek yürütmeyi tamamlar. Bir DP grubu genelinde tüm sıralar, kendi kopyalarını hesaplamak için her uzman aktivasyonunun bir kopyasını alır.
Kıyaslamalar (Benchmarks)
Çekirdeklerimizi InfiniBand ve CX-7 NIC'ler aracılığıyla bağlanan 16 düğüme yayılmış 128 GPU'dan oluşan bir küme üzerinde değerlendiriyoruz. Hem GPUDirect Async (IBGDA) hem de bir CPU proxy'si ile Güvenilir Bağlantı (RC) deniyoruz. Bunları, son derece optimize edilmiş DeepSeek uygulamasının yanı sıra PyTorch (NCCL aracılığıyla) veya NVSHMEM tarafından sağlanan yoğun ilkel öğelerle karşılaştırıyoruz.
Yoğun NVSHMEM all-to-all işleminde IBRC ve IBGDA'nın performansı benzer olsa da (6378 µs'ye karşılık 6180 µs), IBGDA seyrek çekirdeklerle önemli ölçüde daha hızlıdır. Dağıtım ve Birleştirme toplandığında IBGDA 902 µs kullanırken IBRC 3223 µs alır; bu, gecikmede 3,6 katlık bir iyileştirmedir. All-to-all bant genişliği sınırlı (bound) iken, seyrek çekirdekler büyüklük mertebesinde daha az veri yayınlar ve gecikme sınırlıdır. Bir CPU proxy'sinin GPU ile NIC'yi koordine etmesini gerektirmeden, doğrudan bir GPU'dan ağ aktarımları tetiklenerek uçtan uca gecikme önemli ölçüde azaltılır.
Taşınabilir çekirdeklerimiz, son derece optimize edilmiş DeepSeek çekirdeklerinden yaklaşık 2 kat daha yavaş olmasına rağmen, yoğun çekirdeklere kıyasla gecikmeyi 10 kat iyileştirir (902 µs'ye karşılık 9944 µs).
Ek olarak, gönderen-alıcı bileşenlerine bölünme, kütüphane ilkel öğelerinin aksine, gecikmenin bir kısmının gizlenmesini de sağlar.
Tek düğümde (EP8) NVSHMEM, taşıma için NVLINK kullanarak düğümler arası ağa göre daha düşük gecikme ve daha yüksek aktarım hızı (throughput) sağlar. Taşınabilir çekirdeklerimiz tek düğümde DeepEP'den yaklaşık 2,5 kat daha hızlıdır (186 µs'ye karşılık 481 µs).
Daha Fazla İyileştirme
Burada açıklanan çekirdekler, ML framework'lerinin yerleşik ilkel öğelerinden daha iyi performans gösterir ve NVLink veya InfiniBand gibi belirli cihazlar arası taşımalar için aşırı özelleştirme yapmadan iyi bir performans sunar. Zaten bahsedilen fırsatların yanı sıra iletişim ilkel öğelerini daha özelleştirilmiş versiyonlarla değiştirerek daha fazla performans kazancı elde edilebilir. Örneğin, NVLink genelinde simetrik bellek kullanımı, cihazlar arasında paylaşılan arabelleklerle değiştirilebilir; böylece bazı kopyalamalar ortadan kaldırılır ve token grupları yerine bireysel token'lar üzerinde daha hassas senkronizasyon şemalarına izin verilir. InfiniBand genelinde bir uygulama, temel kuyruk çiftlerine doğrudan erişebilir; böylece hem beklenen hem de gönderilen token sayılarının aktarılması ve token'ların geldikçe kuyruklardan çıktı arabelleklerine yıkılması ihtiyacı ortadan kalkar. Bununla birlikte, bu tür uygulamalar taşınabilirlik maliyeti getirirken, uygulamalarımız belirli donanımlar için optimize etme geliştirme çabasına girmeden önce belirli konfigürasyonlara sahip kümelerin değerlendirilmesine olanak tanır.
Sonuç
Standart all-to-all iletişimine kıyasla 10 kat daha hızlı performans elde eden ve farklı donanım konfigürasyonları arasında uyumluluğu koruyan, MoE iletişimi için yüksek performanslı, taşınabilir bir kütüphane sunduk. NVLink içeren tek düğümlü dağıtımlarda çözümümüz, önceki uygulamalara göre 2,5 kat daha düşük gecikme gösterir.
Yaklaşımımız; GPU tarafından başlatılan iletişim desteği, hesaplama-iletişim örtüşmesini sağlayan bölünmüş bir çekirdek mimarisi ve minimum NVSHMEM ilkel öğeleri kullanan verimli token dağıtımı dahil olmak üzere temel yenilikler aracılığıyla performansı taşınabilirlikle dengelemektedir. Çoklu düğüm kurulumlarında son derece özelleştirilmiş uygulamalara göre yaklaşık 2 kat daha yavaş olmasına rağmen kütüphanemiz çeşitli ağ ortamlarında (NVLink, CX-7 ve EFA) üstün esneklik sunar.
MoE modelleri ölçeklenmeye devam ettikçe, bizimki gibi verimli iletişim stratejileri pratik dağıtım için giderek daha önemli hale gelecektir. Tamamen açık kaynaklı uygulamamız https://github.com/ppl-ai/pplx-kernels adresinde mevcuttur.
Referanslar
Atıf
@online{perplexity2025EfficientAndPortableMixtureOfExpertsCommunication,
author = {{Perplexity} and Nandor Licker and Lequn Chen and Phi Hoang},
title = {{Efficient and portable mixture-of-experts communication}},
date = {2025-04-02},
url = {https://perplexity.coolkeypoint.com/hub/blog/efficient-and-portable-mixture-of-experts-communication}
}