Transfer Memori GPU Performa Tinggi di AWS Sagemaker Hyperpod
Perjalanan Menuju 3200 Gbps
Infrastruktur pembelajaran mendalam modern sering kali memerlukan transfer data dalam jumlah besar antar GPU di berbagai mesin. Di Perplexity, kami menghadapi tantangan teknis yang unik: mentransfer wilayah memori GPU non-kontigu secara efisien antar mesin pada kecepatan maksimum yang mungkin. Platform target kami, instans AWS p5, menawarkan bandwidth jaringan 3200 Gbps yang mengesankan melalui 32 kartu jaringan. Artikel ini membagikan perjalanan kami dalam membangun solusi jaringan performa tinggi kustom yang mencapai 97,1% dari bandwidth teoretis ini.
Tantangan Teknis
Kasus penggunaan kami menghadirkan beberapa persyaratan teknis utama:
- Operasi bidang data (transfer data aktual) melewati kernel untuk performa maksimum
- Kemampuan untuk menambah atau menghapus node secara dinamis dari deployment Kubernetes tanpa mengganggu operasi yang sedang berjalan
- Dukungan untuk pola komunikasi peer-to-peer
Meskipun pustaka NCCL NVIDIA adalah standar de facto untuk pembelajaran mendalam terdistribusi, pustaka tersebut tidak ideal untuk kasus penggunaan kami:
- NCCL unggul dalam komunikasi kolektif tetapi mengharuskan pembentukan "world" statis, yang mengharuskan proses restart seluruh klaster saat menyesuaikan node yang berpartisipasi.
- Model komunikasi sinkron NCCL menambah kerumitan untuk beban kerja asinkron kami
- Kami menginginkan kontrol langsung atas pola transfer memori kami untuk pengoptimalan
- Membangun solusi kami sendiri memberikan peluang pembelajaran yang berharga
Jaringan Performa Tinggi Modern
Untuk memahami solusi kami, mari kita jelajahi terlebih dahulu bagaimana jaringan performa tinggi modern berbeda dari jaringan tradisional.
Sebagian besar jaringan yang kita gunakan sehari-hari mengandalkan protokol TCP/IP, tempat aplikasi berkomunikasi dengan kartu jaringan melalui kernel sistem operasi menggunakan soket. Namun, jaringan performa tinggi menggunakan RDMA (Remote Direct Memory Access) - tumpukan perangkat keras dan perangkat lunak yang sepenuhnya berbeda yang memungkinkan akses memori langsung antar mesin tanpa melibatkan CPU.
AWS menyediakan Elastic Fabric Adapter (EFA), antarmuka jaringan kustom yang mengimplementasikan protokol kustom Amazon yang disebut Scalable Reliable Datagram (SRD). Tidak seperti jaringan TCP/IP tradisional di mana data harus disalin beberapa kali antara ruang pengguna, ruang kernel, dan buffer jaringan, EFA dengan RDMA memungkinkan transfer data langsung antara memori GPU dan kartu jaringan, sepenuhnya melewati CPU.
Filosofi Desain Jaringan Performa Tinggi
Membangun sistem jaringan performa tinggi mengharuskan pemikiran ulang terhadap beberapa asumsi mendasar:
- Kepemilikan Buffer: Tidak seperti soket tradisional di mana kernel mengelola buffer jaringan dan memerlukan penyalinan antara ruang pengguna dan ruang kernel, RDMA mengharuskan aplikasi untuk mengelola buffer mereka sendiri. Ketika sebuah aplikasi memulai operasi jaringan, aplikasi tersebut mentransfer kepemilikan buffer ke kartu jaringan hingga operasi selesai, sehingga menghilangkan kebutuhan untuk penyalinan data.
- Pendaftaran Memori: Aplikasi harus mendaftarkan wilayah memori dengan kernel sistem operasi. Kernel menyiapkan pemetaan alamat virtual yang memungkinkan CPU, GPU, dan kartu jaringan semuanya memahami alamat virtual yang sama. Pendaftaran ini adalah operasi satu kali yang memungkinkan transfer data zero-copy berikutnya.
- Bidang Kontrol vs Bidang Data: Jaringan performa tinggi memisahkan operasi ke dalam dua kategori:
- Operasi bidang kontrol (seperti penyiapan koneksi dan pendaftaran memori) melewati kernel untuk memastikan keamanan
- Operasi bidang data (transfer data aktual) melewati kernel untuk performa maksimum
- Penerimaan Sebelum Transmisi: Tanpa buffer yang dikelola kernel, aplikasi harus melakukan pra-pos operasi penerimaan, menentukan di mana data yang masuk harus ditempatkan. Ini adalah pergeseran mendasar dari model soket di mana aplikasi dapat menerima data kapan saja.
- Penyelesaian Berbasis Polling: Alih-alih menunggu notifikasi kernel melalui mekanisme seperti
epoll, aplikasi secara langsung melakukan polling pada antrean penyelesaian perangkat keras. Ini menghilangkan overhead panggilan sistem dan memungkinkan reaksi langsung terhadap operasi yang selesai. - Kesadaran Topologi Perangkat Keras: Memahami dan mengoptimalkan topologi perangkat keras sangat penting untuk mencapai performa maksimum.
Memahami Topologi Perangkat Keras
Instans AWS p5 memiliki arsitektur internal yang canggih. Seperti yang ditunjukkan di bawah ini, setiap instans berisi dua soket CPU yang membentuk dua node NUMA, dengan setiap node NUMA terhubung ke empat switch PCIe:
Di bawah setiap switch PCIe, kita menemukan:
- Empat kartu jaringan EFA 100 Gbps
- Satu GPU NVIDIA H100
- Satu SSD NVMe
Jalur data untuk transfer TCP/IP dan RDMA menunjukkan perbedaan mendasar dalam pendekatannya:
Dengan TCP/IP (sisi kiri), data harus disalin beberapa kali:
- Dari memori GPU ke buffer aplikasi di ruang pengguna
- Dari buffer ruang pengguna ke buffer kernel
- Dari buffer kernel ke kartu jaringan
- Proses terbalik terjadi pada sisi penerima
Setiap operasi salin menghabiskan siklus CPU dan bandwidth memori. Aplikasi juga harus melakukan pertukaran konteks (context switch) antara ruang pengguna dan ruang kernel untuk setiap operasi jaringan.
Sebaliknya, RDMA (sisi kanan) menyediakan transfer data zero-copy yang sebenarnya:
- Kartu jaringan membaca langsung dari memori GPU
- Data bergerak langsung ke kartu jaringan jarak jauh
- Kartu jaringan jarak jauh menulis langsung ke memori GPU tujuan
- Aplikasi hanya perlu memeriksa antrean penyelesaian (CQ) di ruang pengguna untuk mengetahui kapan transfer selesai
Dengan RDMA dan pemasangan perangkat keras yang tepat, mentransfer data antara dua GPU hanya memerlukan pelintasan switch PCIe lokal dan jaringan:
Sebaliknya, transfer TCP/IP harus menyalin data beberapa kali melalui memori utama, yang menyebabkan kemacetan bus PCIe yang signifikan:
Membangun dengan libfabric
Kami menggunakan libfabric - kerangka kerja yang menyediakan antarmuka generik untuk layanan fabrik. Implementasi kami menggunakan dua jenis operasi RDMA:
- RDMA dua sisi (SEND/RECV) untuk pesan kontrol yang membawa metadata tentang wilayah memori (misalnya, offset dan ukuran).
- RDMA WRITE satu sisi untuk transfer data aktual, di mana setiap operasi WRITE menangani satu bagian memori yang kontigu.
Perjalanan Menuju Performa Puncak
Pengembangan kami berjalan melalui beberapa tahap:
- Mengimplementasikan transfer pesan unireksional dasar menggunakan SEND/RECV
- Memperluas ke komunikasi bidireksional
- Menambahkan GPUDirect RDMA WRITE untuk transfer GPU-ke-GPU langsung
- Memperluas untuk menangani beberapa transfer serentak
- Memperkenalkan antrean operasi untuk ketahanan
- Mencapai pemanfaatan bandwidth 97,4% pada satu kartu jaringan
Saat melakukan penskalaan ke 32 kartu jaringan, kami menerapkan beberapa pengoptimalan krusial:
- Antrean Operasi: Alih-alih langsung mengirimkan operasi ke kartu jaringan, kami mempertahankan antrean tingkat aplikasi. Ini memberikan ketahanan terhadap kemacetan jaringan dan menyederhanakan model pemrograman.
- Pemanasan Jaringan: Membentuk koneksi terlebih dahulu meningkatkan performa awal.
- Multithreading: Utas khusus untuk operasi jaringan setiap GPU.
- Penyematan Inti CPU: Mengikat utas ke inti CPU tertentu untuk menghindari efek NUMA dan cache miss.
- Sharding Status: Mengurangi kontensi antarutas.
- Pengelompokan Operasi: Mengirimkan beberapa operasi secara bersamaan.
- Penerbitan Operasi Lazy: Operasi terlebih dahulu dimasukkan ke antrean dalam aplikasi. Setelah melakukan polling pada antrean penyelesaian, kami mencoba mengirimkan operasi tertunda ke kartu jaringan, memastikan penggunaan sumber daya jaringan secara efisien.
- Alokasi Sumber Daya Sadar-NUMA: Alokasikan sumber daya libfabric seperti antrean penyelesaian pada node NUMA yang benar untuk meminimalkan latensi akses memori.
Melalui pengoptimalan ini, kami mencapai performa akhir sebesar 3.108 Gbps - 97,1% dari maksimum bandwidth teoretis.
Video di bawah ini menunjukkan program baris perintah kami yang sedang beraksi. Program ini mentransfer bagian memori GPU non-kontigu ke node jarak jauh, mencapai kecepatan transmisi 3108,283 Gbps - mendemonstrasikan pemanfaatan bandwidth yang mendekati teoretis dari infrastruktur jaringan:
Kesimpulan
Membangun sistem jaringan performa tinggi memerlukan pemahaman tentang arsitektur perangkat keras dan prinsip desain sistem. Meskipun pustaka seperti NCCL menyediakan solusi luar biasa untuk pola umum, terkadang solusi kustom diperlukan untuk persyaratan tertentu.
Perjalanan kami menunjukkan bahwa mencapai performa jaringan yang mendekati teoretis dimungkinkan dengan perhatian cermat terhadap arsitektur sistem, topologi perangkat keras, dan berbagai teknik pengoptimalan. Kuncinya bukan hanya memahami komponen individu, tetapi bagaimana komponen tersebut berinteraksi membentuk sistem yang utuh.
Penjelasan teknis mendalam yang lengkap tentang perjalanan ini, termasuk detail implementasi dan contoh kode, tersedia di repositori sumber terbuka kami.
Kutipan
@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}
}