AWS Sagemaker Hyperpod'da Yüksek Performanslı GPU Bellek Aktarımı

3200 Gbps'ye Yolculuk

YazarlarPerplexity Research

Modern derin öğrenme altyapısı genellikle makineler arasında GPU'lar üzerinden büyük miktarda veri aktarımı gerektirir. Perplexity olarak benzersiz bir teknik zorlukla karşılaştık: makineler arasında bitişik olmayan GPU bellek bölgelerini olabilecek en yüksek hızda verimli bir şekilde aktarmak. Hedef platformumuz olan AWS p5 örnekleri, 32 ağ kartı aracılığıyla etkileyici bir 3200 Gbps ağ bant genişliği sunuyor. Bu makale, bu teorik bant genişliğinin %97,1'ine ulaşan özel, yüksek performanslı bir ağ çözümü oluşturma yolculuğumuzu paylaşıyor.

Teknik Zorluk

Kullanım senaryomuz birkaç temel teknik gereksinim ortaya koydu:

  • Uzak GPU'lar arasında bitişik olmayan bellek öbeklerinin yüksek bant genişlikli aktarımı
  • Devam eden operasyonları aksatmadan Kubernetes dağıtımlarına dinamik olarak düğüm ekleme veya düğüm çıkarma yeteneği
  • Eşler arası (peer-to-peer) iletişim kalıpları için destek

NVIDIA'nın NCCL kütüphanesi dağıtık derin öğrenme için fiili standart olsa da, bizim kullanım senaryomuz için ideal değildi:

  • NCCL toplu iletişimde mükemmeldir ancak statik bir "dünya" kurulmasını gerektirir, bu da katılımcı düğümler ayarlanırken tüm kümenin yeniden başlatılmasını zorunlu kılar.
  • NCCL'in senkron iletişim modeli, asenkron iş yükümüz için karmaşıklık ekler
  • Optimizasyon amacıyla bellek aktarım kalıplarımız üzerinde doğrudan kontrol sahibi olmak istiyorduk
  • Kendi çözümümüzü geliştirmek bize değerli öğrenme fırsatları sağladı

Modern Yüksek Performanslı Ağlar

Çözümümüzü anlamak için öncelikle modern yüksek performanslı ağların geleneksel ağ oluşturmadan nasıl farklılaştığını keşfedelim.

Günlük olarak kullandığımız çoğu ağ, uygulamaların soketleri kullanarak işletim sistemi çekirdeği aracılığıyla ağ kartıyla iletişim kurduğu TCP/IP protokollerine dayanır. Ancak yüksek performanslı ağlar, CPU'yu işin içine sokmadan makineler arasında doğrudan bellek erişimi sağlayan tamamen farklı bir donanım ve yazılım yığını olan RDMA'yı (Uzak Doğrudan Bellek Erişimi) kullanır.

AWS, Amazon'un Ölçeklenebilir Güvenilir Datagram (SRD) adlı özel protokolünü uygulayan özel bir ağ arayüzü olan Elastic Fabric Adapter'ı (EFA) sağlar. Verilerin kullanıcı alanı, çekirdek alanı ve ağ arabellekleri arasında defalarca kopyalanmasının gerektiği geleneksel TCP/IP ağ iletişiminin aksine, RDMA özellikli EFA, CPU'yu tamamen devre dışı bırakarak GPU belleği ile ağ kartı arasında doğrudan veri aktarımına izin verir.

Yüksek Performanslı Ağ Tasarımının Felsefesi

Yüksek performanslı ağ sistemleri kurmak, çeşitli temel varsayımların yeniden ele alınmasını gerektirir:

  1. Arabellek Sahipliği: Çekirdeğin ağ arabelleklerini yönettiği ve kullanıcı alanı ile çekirdek alanı arasında kopyalama gerektirdiği geleneksel soketlerin aksine, RDMA uygulamaların kendi arabelleklerini yönetmesini gerektirir. Bir uygulama bir ağ işlemi başlattığında, işlem tamamlanana kadar arabellek sahipliğini ağ kartına devrederek veri kopyalama ihtiyacını ortadan kaldırır.
  2. Bellek Kaydı (Memory Registration): Uygulamalar bellek bölgelerini işletim sistemi çekirdeğine kaydetmelidir. Çekirdek; CPU, GPU'lar ve ağ kartlarının aynı sanal adresleri anlamasını sağlayan sanal adres eşlemelerini ayarlar. Bu kayıt, sonraki sıfır kopyalamalı veri aktarımlarını sağlayan bir defalık bir işlemdir.
  3. Kontrol Düzlemi ve Veri Düzlemi: Yüksek performanslı ağlar işlemleri iki kategoriye ayırır:
    1. Güvenliği sağlamak için kontrol düzlemi işlemleri (bağlantı kurulumu ve bellek kaydı gibi) çekirdek üzerinden geçer
    2. Maksimum performans için veri düzlemi işlemleri (gerçek veri aktarımı) çekirdeği atlar
  4. İletim Öncesi Alım (Reception Before Transmission): Çekirdek tarafından yönetilen arabellekler olmadan uygulamalar, gelen verilerin nereye yerleştirileceğini belirterek alım işlemlerini önceden göndermelidir. Bu, uygulamaların her an veri alabildiği soket modelinden köklü bir sapmadır.
  5. Yoklama Tabanlı Tamamlama (Poll-based Completion): epoll gibi mekanizmalar aracılığıyla çekirdek bildirimlerini beklemek yerine, uygulamalar doğrudan donanım tamamlama kuyruklarını yoklar (poll). Bu, sistem çağrısı ek yükünü ortadan kaldırır ve tamamlanan işlemlere hemen tepki verilmesini sağlar.
  6. Donanım Topolojisi Farkındalığı: Maksimum performansa ulaşmak için donanım topolojisini anlamak ve optimize etmek çok önemlidir.

Donanım Topolojisini Anlamak

AWS p5 örnekleri gelişmiş bir dahili mimariye sahiptir. Aşağıda gösterildiği gibi, her örnek iki NUMA düğümü oluşturan iki CPU soketi içerir ve her NUMA düğümü dört PCIe anahtarına bağlanır:

İki NUMA düğümü, sekiz GPU ve 32 EFA arayüzü olan sistem topolojisi.

Her PCIe anahtarının altında şunları buluruz:

  • Dört adet 100 Gbps EFA ağ kartı
  • Bir adet NVIDIA H100 GPU
  • Bir adet NVMe SSD

TCP/IP ve RDMA aktarımları için veri yolları, yaklaşımlarındaki temel farklılıkları ortaya koyar:

GPU’lar, kullanıcı alanı uygulamaları, Linux çekirdekleri ve ağ arayüzleri arasındaki TCP ve GPUDirect RDMA veri aktarım yolları.

TCP/IP ile (sol taraf), verilerin birkaç kez kopyalanması gerekir:

  1. GPU belleğinden kullanıcı alanındaki uygulama belleğine
  2. Kullanıcı alanı belleğinden çekirdek belleğine
  3. Çekirdek belleğinden ağ kartına
  4. Benzer işlem ters yönde alıcı tarafta gerçekleşir

Her kopyalama işlemi CPU döngüleri ve bellek bant genişliği tüketir. Uygulama ayrıca her ağ işlemi için kullanıcı alanı ile çekirdek alanı arasında bağlam (context) değiştirmelidir.

Buna karşılık, RDMA (sağ taraf) gerçek sıfır kopyalamalı (zero-copy) veri aktarımı sağlar:

  1. Ağ kartı doğrudan GPU belleğinden okuma yapar
  2. Veriler doğrudan uzak ağ kartına gider
  3. Uzak ağ kartı doğrudan hedef GPU belleğine yazar
  4. Uygulamanın aktarımın ne zaman bittiğini anlamak için yalnızca kullanıcı alanındaki bir tamamlama kuyruğunu (CQ) kontrol etmesi gerekir

RDMA ve uygun donanım eşleştirmesi ile iki GPU arasında veri aktarımı yalnızca yerel PCIe anahtarının ve ağın geçilmesini gerektirir:

PCIe Gen5 x16 ve dört 100 Gbps EFA bağlantısıyla bağlanan eşleştirilmiş yerel ve uzak GPU’lar.

Buna karşılık, TCP/IP aktarımları verileri ana bellekte defalarca kopyalamalıdır, bu da önemli PCIe veri yolu tıkanıklığına neden olur:

Ana bellek, CPU, dört PCIe anahtarı ve dört GPU arasındaki TCP aktarımlarından kaynaklanan sistem veri yolu tıkanıklığı.

libfabric ile Oluşturma

Kumaş (fabric) servisleri için genel bir arayüz sağlayan bir çerçeve olan libfabric'i kullandık. Uygulamamız iki tür RDMA işlemi kullanır:

  • Bellek bölgeleri hakkında meta veriler (ör. uzaklıklar ve boyutlar) taşıyan kontrol mesajları için iki taraflı RDMA (SEND/RECV).
  • Her bir WRITE işleminin bitişik bir bellek öbeğini işlediği, gerçek veri aktarımı için tek taraflı RDMA WRITE.

Zirve Performansa Yolculuk

Geliştirme sürecimiz birkaç aşamadan geçti:

  1. SEND/RECV kullanarak temel tek yönlü mesaj aktarımı uygulandı
  2. Çift yönlü iletişime genişletildi
  3. Doğrudan GPU'dan GPU'ya aktarım için GPUDirect RDMA WRITE eklendi
  4. Birden fazla eşzamanlı aktarımı işleyecek şekilde genişletildi
  5. Sağlamlık için işlem kuyruğa alma (queuing) özelliği eklendi
  6. Tek bir ağ kartında %97,4 bant genişliği kullanımına ulaşıldı

32 ağ kartına ölçeklenirken birkaç çok önemli optimizasyon uyguladık:

  1. İşlem Kuyruğa Alma (Operation Queuing): İşlemleri doğrudan ağ kartlarına göndermek yerine, uygulama düzeyinde bir kuyruk tutarız. Bu, ağ tıkanıklığına karşı dayanıklılık sağlar ve programlama modelini basitleştirir.
  2. Ağ Isınması (Network Warmup): Bağlantıların önceden kurulması başlangıç performansını iyileştirdi.
  3. Çoklu Konu (Multi-threading): Her GPU'nun ağ işlemleri için ayrılmış konular (threads).
  4. CPU Çekirdeği Sabitleme (CPU Core Pinning): NUMA etkilerini ve önbellek (cache) kaçırmalarını önlemek için konuları belirli CPU çekirdeklerine bağlama.
  5. Durum Bölme (State Sharding): Konular arasındaki çekişmeyi azaltma.
  6. İşlem Toplu İşleme (Operation Batching): Birden fazla işlemi birlikte gönderme.
  7. Tembel İşlem Gönderme (Lazy Operation Posting): İşlemler önce uygulamada kuyruğa alınır. Tamamlama kuyruğu yoklandıktan sonra, beklemedeki işlemleri ağ kartına göndermeye çalışarak ağ kaynaklarının verimli kullanımı sağlanır.
  8. NUMA Farkında Kaynak Tahsisi: Bellek erişim gecikmesini en aza indirmek için tamamlama kuyrukları gibi libfabric kaynaklarını doğru NUMA düğümünde tahsis edin.

Bu optimizasyonlar sayesinde 3.108 Gbps'lik nihai bir performansa ulaştık - bu, teorik maksimum bant genişliğinin %97,1'idir.

Aşağıdaki video komut satırı programımızın çalışırken nasıl olduğunu gösterir. Bitişik olmayan GPU belleği öbeklerini uzak bir düğüme aktararak 3108.283 Gbps iletim hızına ulaşır ve ağ altyapısının teorik sınıra yakın bant genişliği kullanımını gösterir:

Sonuç

Yüksek performanslı bir ağ sistemi oluşturmak hem donanım mimarisini hem de sistem tasarım ilkelerini anlamayı gerektirir. NCCL gibi kütüphaneler yaygın kalıplar için mükemmel çözümler sunarken, bazen belirli gereksinimler için özel çözümler gereklidir.

Yolculuğumuz, sistem mimarisine, donanım topolojisine ve çeşitli optimizasyon tekniklerine dikkat edilerek teorik sınıra yakın ağ performansı elde etmenin mümkün olduğunu göstermektedir. Buradaki anahtar sadece bireysel bileşenleri anlamak değil, eksiksiz bir sistem oluşturmak için nasıl etkileşim kurduklarını kavramaktır.

Uygulama detayları ve kod örnekleri dahil olmak üzere bu yolculuğun teknik derinlemesine incelemesinin tamamı açık kaynak deposunda mevcuttur.

Alıntı

BibTeX
@online{perplexity2025HighPerformanceGpuMemoryTransferOnAwsSagemakerHyperpod,
  author = {{Perplexity} and Lequn Chen and Phi Hoang},
  title = {{High-performance GPU memory transfer on AWS Sagemaker Hyperpod}},
  date = {2025-02-10},
  url = {https://www.perplexity.ai/hub/blog/high-performance-gpu-memory-transfer-on-aws-sagemaker-hyperpod}
}