Yapay zeka eğitimindeki ölçek arttıkça, tek bir veri merkezi (DC) gereken hesaplama gücünü sağlamak için yetersiz kalmaktadır. Bu sorunu ele almak için en son yaklaşımlar, birden fazla veri merkezinin ya birlikte ya da coğrafi olarak dağıtılmış şekilde konumlandırılmasına dayanıyor. NVIDIA Kolektif İletişim Kütüphanesi (NCCL), artık ağ topolojisini dikkate alarak birden fazla veri merkezi arasında kesintisiz iletişim sağlayabilen yeni bir özellik ile açık kaynak olarak sunulmuştur.
Bu makalede, önerilen yaklaşımın iç işleyişi ve beklenen yetenekleri sunmak için dikkate alınması gereken önemli noktalar açıklanacaktır.
NCCL, farklı ağlara bağlı olan çoklu iletişimcileri desteklemektedir. Örneğin, bir tüm azalma kolektifini, intra-DC ağı ile bir iç DC reduce-scatter işlemi olarak başlatabiliriz, ardından inter-DC ağı üzerinde bir tüm azalma ve son olarak intra-DC ağı üzerinden bir tüm toplama işlemi gerçekleştirebiliriz. Bu yaklaşım NVIDIA Nemo çerçevesinde de kullanılmıştır.
NCCL’de Çoklu Veri Merkezi İletişimi
Önerilen NCCL’deki Cross-DC özelliğinin iki ana hedefi vardır. Birincisi, çoklu DC bağlantılarındaki en iyi performansı garanti etmektir. İkincisi ise, AI eğitim iş yüklerindeki minimal değişikliklerle çoklu DC iletişimini mümkün kılmaktır.
Bu özellik, özellikle iki bağlantı senaryosunu hedeflemektedir:
- Farklı veri merkezleri arasında homojen bir ağ üzerinden bağlantı (genellikle intra-DC ve inter-DC ağları için IB veya RoCE).
- Veri merkezleri arasında heterojen ağlarla bağlantı. Genellikle intra-DC bağlantısı için InfiniBand (IB) veya RDMA ve inter-DC ağları için TCP kullanılır.
Her iki senaryoda da, NCCL’deki cross-DC özelliğini nasıl kullanacağınızı ve performansı değerlendirirken dikkate almanız gereken bazı önemli noktaları açıklayacağız.
Ağ Topolojisi Bilincinin NCCL’deki Rolü
Ağlar, NCCL’ye ncclNet
API’si aracılığıyla sunulmaktadır. Her ncclNet
, aynı ağa bağlı sanal bir cihaz setini temsil eder ve bu setle etkileşim kurmak için bir API sağlar. NCCL açısından, farklı ağlarda sunulan iki cihaz, iki ayrı ve bağlantısız ağ olarak kabul edilir.
Bazı durumlarda, bu soyutlama, çoklu DC iletişimini desteklemek için gerekli olan yapı taşlarını sağlar. Burada “ağ” terimi, ncclNet
şeklinde yorumlanmaktadır.
Birden Fazla Ağı Etkinleştirmek
NCCL’nin birden fazla ağ kullanabilmesi için, NCCL_ALLNET_ENABLE=1
olarak ayarlanması gerekmektedir. Bu ayar gerçekleştirildiğinde, NCCL her iletişimci için tüm ncclNet
eklentilerini yüklemeye çalışacaktır. Bu durum, collNet
kullanımını devre dışı bırakır. Değeri 0
(varsayılan) olarak ayarlanırsa, NCCL yalnızca ilk başarıyla yüklenen eklentiyi kullanmaya geri döner.
NCCL’nin, farklı ağlardan gelen cihazları ayrı ve bağlantısız olarak değerlendirdiği varsayımı, heterojen ağlar durumunda yeterli olsa da, homojen ağ senaryolarında yetersiz kalmaktadır. Bu nedenle, ağ topolojisi hakkında daha ayrıntılı bilgi sağlamak adına fabric ID kavramını getiriyoruz.
NCCL’nin Ağ Topolojisini Keşfetmesi
Ağ bilinci fabricId
ile sağlanır; bu, cihazlar arasındaki bağlantıyı ve topoloji bilgisini kapsar. fabricId
kullanılarak, NCCL, aynı ncclNet
içindeki iki ağ cihazı arasındaki bağlantı ve diğer yol bilgilerini sorgular. NCCL, ağ topolojisini iki adımda keşfeder:
- Başlatma sırasında, iletişimci içindeki her rank için mevcut
fabricId
listesinin değişimi yapılır.fabricId
, ağ eklentisi tarafından sağlanan 64 bitlik bir tanımsız kimliktir ve bu kimliğin anlamı eklenti uygulamasına bağlıdır. - Bağlantı kurarken, NCCL, yeni eklenen
ncclNet
API’sini kullanarakgetNetPath(uint64_t fabricId0, uint64_t fabricId1, ncclNetPath_t* path)
ile ağ bağlantısını sorgular. Bu özellik özelinde,path
bilgisi yalnızca verilen ikifabricId
arasındaki bağlantıyı içerir: NET_LOC_DCL0 intra-DC bağlantıları için, NET_LOC_DCL1 ise cross-DC bağlantıları içindir.
Ağ Topolojisi Destekli Algoritmalar
NCCL, farklı kolektifler ve iletişim desenlerine destek veren Üst, Ağaç ve PAT algoritmalarına sahiptir. Cross-DC iletişimi üzerinde yoğunlaşan çalışmalarımız, Ring ve Ağaç algoritmaları gibi daha seyrek iletişim desenlerine odaklanmıştır. Aşağıda açıklanan değişikliklerin temel hedefleri şunlardır: (1) Genellikle daha yavaş olan inter-DC bağlantılarını en az sayıda geçmek, (2) inter-DC bağlantılarında mümkün olduğunca çok ağ cihazını kullanmaktır.
Ring Algoritması
Birden fazla inter-DC bağlantısından kaçınmak için, her DC içinde öncelikle sıralama yapılır. Sonrasında, her halka açılarak birbirine bağlanır. Bu yaklaşım ile cross-DC bağlantılarının sayısını 2*(nDc-1) olarak garanti ederiz.
Ancak heterojen ağlar durumunda, bu yaklaşımda bile tek bir inter-DC cihazı, tüm kolektif performansının darboğazı olabilir. NCCL, birden fazla halka (örneğin, dört halka) oluşturur, bu halkaların hepsi aynı düğümler arasında DC bağlantısını keser. Bu durumu aşmak için, dağıtım (artık NCCL_SCATTER_XDC=1
ile etkinleştirilebiliyor) uygulamasıyla, her halka iki farklı düğümü kullanarak DC bağlantısını geçer.
Bu değişimin performansa olan etkisi önemli olabilir. Örneğin, her biri 400 Gbps hızında dört GPU’ya sahip bir iletişimde, tek bir cross-DC bağlantısı 1.6 Tbps sağlamak zorunda olurken, dağıtım etkinleştirildiğinde bu ihtiyaç 400 Gbps’a düşer. Bu pratikte, HCA başına daha fazla kanal kullanarak cross-DC bağlantılarının sayısını artırarak daha da düşürülebilir. Bu açıklama bazı detaylardan yoksun olsa da, dağıtım etkinleştirildiğinde kanal davranışı hakkında güçlü bir sezgi sunar.
Ağaç Algoritması
Ring algoritmasında olduğu gibi, amacımız cross-DC bağlantısını gereksiz yere geçmekten kaçınmak ve dağıtımı birden fazla cihaza yayarak tek cihaz darboğazını önlemektir. Öncelikle her DC içinde ağaçlar oluşturuyoruz. NCCL ağaçları oluşturma şekli nedeniyle, her kökün boş bir çocuk slotu ve boş bir ebeveyn slotu bulunmaktadır. Bu sayede her DC’nin köklerini birbirine bağlayarak tüm DC’leri kapsayan bir küresel ağaç oluşturabiliriz. Bu yeni ağacın derinliği, DC sayısında lineer, DC içindeki düğüm sayısında ise logaritmik olacaktır. Düzgün bir DC düğüm sayısı varsayımı yapıldığında, (nDC – 1) + log2(nNodes) derinliği elde ederiz.
Kanal dağıtımı, ring algoritmasında olduğu gibi burada da benzer şekilde uygulanmıştır. Ağaç kökleri DC’ler arası iletişim kuran unsurlardır, bu yüzden bunları mevcut düğümler arasında dağıtmak NCCL’ye daha fazla geçiş imkânı tanır ve potansiyel darboğazları kaldırır.
Performans Dikkat Edilmesi Gerekenler
DC’ler arasındaki bağlantının kalitesi, uygulamanın genel performansını dikkate alırken çok önemlidir. İkili bağlantıların performansını nicelendirerek NCCL_SCATTER_XDC ile NCCL_MIN/MAX_CTAS için doğru değerleri belirlemek kritik bir adımdır. Birincisi, kanalları birden fazla cihaz arasında dağıtmaya olanak tanırken, ikincisi NCCL tarafından kaç kanaldan yararlanılacağını kontrol eder.
Aşağıda, cross-DC bağlantısında üst düzey performansa ulaşmak için dikkate alınması gereken bazı önemli parametrelerin kısa bir listesi bulunmaktadır:
NCCL_IB_QPS_PER_CONNECTION
yüksek gecikme süreli IB/RoCE bağlantıları için.NCCL_NSOCKS_PERTHREAD
veNCCL_SOCKET_NTHREADS
yüksek gecikme süreli TCP bağlantıları için.NCCL_SOCKET_INLINE
veNCCL_SOCKET_MIN_TASKSIZE
TCP mesaj boyutu ve inline veri boyutunu kontrol etmek için.NCCL_BUFFSIZE
NCCL ile daha büyük mesajların gönderilmesine izin vermek için.
Özet
NCCL, son gelişmelerle birlikte, iki ana bağlantı senaryosunda çoklu DC’ler arasında kesintisiz kolektif iletişimi desteklemekte. Birincisi, homojen durumda, hem intra-DC hem de inter-DC için tek bir ağın sağladığı bağlantıdır. İkincisi ise heterojen durumda, düğümleri intra-DC ve inter-DC olarak birbirine bağlayan farklı ağların kullanılmasıdır.
Bununla birlikte, çoklu ağların desteğinin, NCCL’nin en iyi performansı elde etmesi için yeterli topolojik farkındalığı sağlamadığını bulduk. Bu boşluğu doldurmak için, fabricID ile birlikte yeni bir ncclNet
API’si sunduk. Bu, NCCL’nin ağ topolojisi hakkında ayrıntılı bilgi sorgulamasına ve algoritmik seçimler yapmasına olanak tanır. Yaklaşımımızı göstermeyi, NCCL tarafından oluşturulan halkaları ve ağaçları optimize etmek adına bu ağ topolojisi bilgisinden faydalanmayı hedefliyoruz.
Aİ iletişiminin geleceğini geliştirmeye devam ederken, NCCL’nin cross-DC iletişimini nasıl kullandığınıza, performansına ve yaklaşımımızdaki zayıflıklara dair geri bildirimlerinizi toplamak için sabırsızlanıyoruz. Geri bildirimlerinizi Geliştirici Forumunda veya Github’da paylaşabilirsiniz.