Dalam pelatihan GPU multi-node, latensi komunikasi jaringan dapat menjadi bottleneck performa. Untuk memperpendek siklus pelatihan model, Anda dapat menggunakan Arena untuk mengirim pekerjaan pelatihan terdistribusi PyTorch dan mengaktifkan elastic Remote Direct Memory Access (eRDMA) guna mempercepat komunikasi jaringan. Konfigurasi ini menyediakan komunikasi antar-node dengan latensi rendah dan throughput tinggi, sehingga meningkatkan efisiensi pelatihan dan pemanfaatan kluster.
Penerapan
Jenis kluster: Hanya ACK managed clusters yang didukung.
Tipe instans yang mendukung elastic Remote Direct Memory Access (eRDMA):
gn8is, ebmgn8is, gn8v, ebmgn8v
Langkah 1: Instal ACK eRDMA Controller
Ikuti langkah-langkah berikut untuk menginstal ACK eRDMA Controller.
Jika kluster ACK Anda menggunakan Terway, konfigurasikan filter elastic network interface (ENI) untuk Terway agar tidak mengubah ENI eRDMA. Untuk informasi selengkapnya, lihat Konfigurasikan filter untuk ENI.
Jika sebuah node memiliki beberapa ENI, ACK eRDMA Controller mengonfigurasi entri rute untuk ENI tambahan eRDMA dengan prioritas lebih rendah dibandingkan entri rute untuk ENI dalam blok CIDR yang sama, menggunakan prioritas perutean default
200. Jika Anda perlu mengonfigurasi ENI secara manual setelah menginstal ACK eRDMA Controller, pastikan untuk menghindari konflik perutean.
Pada halaman Clusters, temukan kluster yang ingin Anda kelola lalu klik namanya. Di panel navigasi kiri, klik Add-ons.
Pada halaman Add-ons, klik tab Networking, temukan ACK eRDMA Controller, lalu ikuti petunjuk di halaman tersebut untuk mengonfigurasi dan menginstal komponen.
Parameter
Deskripsi
preferDriver Driver type
Pilih tipe driver eRDMA yang digunakan pada node kluster. Nilai yang valid:
default: Mode driver default.compat: Mode driver yang kompatibel dengan RDMA over Converged Ethernet (RoCE).ofed: Mode driver berbasis ofed, yang berlaku untuk model GPU.
Untuk informasi selengkapnya tentang jenis-jenis driver, lihat Aktifkan eRDMA.
Specifies whether to assign all eRDMA devices of nodes to pods
Nilai yang valid:
True: Jika Anda memilih kotak centang ini, semua perangkat eRDMA pada node dialokasikan ke pod.
False: Jika Anda tidak memilih kotak centang ini, pod dialokasikan satu perangkat eRDMA berdasarkan topologi akses memori non-seragam (NUMA). Anda harus mengaktifkan kebijakan CPU statis untuk node guna memastikan NUMA dapat dialokasikan ke pod dan perangkat. Untuk informasi selengkapnya tentang cara mengonfigurasi kebijakan CPU, lihat Buat dan kelola kelompok node.
Di panel navigasi sebelah kiri, pilih Workloads > Pods. Pada halaman Pods, pilih namespace ack-erdma-controller untuk melihat status pod dan memastikan komponen berjalan sesuai harapan.
Langkah 2: Aktifkan dan verifikasi eRDMA pada node
Aktifkan eRDMA pada node dan verifikasi bahwa sumber daya GPU dan eRDMA pada node terdeteksi serta tersedia untuk penjadwalan.
Pada halaman Clusters, klik nama kluster target. Di panel navigasi kiri, pilih . Pada baris pod yang Anda buat, klik Terminal di kolom Actions. Masuk ke node yang mendukung eRDMA dan jalankan perintah berikut untuk melihat informasi perangkat eRDMA.
Jika output menampilkan perangkat
erdma_0dan status port-nya adalahPORT_ACTIVE, perangkat eRDMA telah diaktifkan.ibv_devinfoLihat sumber daya yang dapat dialokasikan dari node.
kubectl get node <node_name> -o jsonpath='{.status.allocatable}'Contoh output:
{"aliyun/erdma":"200","cpu":"15890m","ephemeral-storage":"243149919035","hugepages-1Gi":"0","hugepages-2Mi":"0","memory":"128290128Ki","nvidia.com/gpu":"1","pods":"64"}"nvidia.com/gpu":"1": Menunjukkan bahwa satu GPU tersedia."aliyun/erdma":"200": Menunjukkan bahwa hingga 200 pod dapat menggunakan eRDMA.
Langkah 3: Kirim pekerjaan pelatihan menggunakan Arena
Gunakan Arena untuk mengirim pekerjaan pelatihan terdistribusi PyTorch dan minta sumber daya eRDMA guna mempercepat komunikasi antar-node.
Konfigurasikan klien Arena dan kirim pekerjaan pelatihan. Untuk informasi selengkapnya tentang parameter, lihat Parameter inti pekerjaan.
Topik ini menggunakan citra pre-built
kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch:mnist-exampleuntuk tujuan demonstrasi. Citra ini hanya untuk percobaan. Untuk lingkungan produksi, lihat Bagaimana cara membuat gambar kontainer yang mendukung eRDMA untuk lingkungan produksi?arena submit pytorch \ --name=pytorch-mnist \ --namespace=default \ --workers=2 \ --gpus=1 \ --device=aliyun/erdma=1 \ --nproc-per-node=1 \ --env NCCL_NET_GDR_LEVEL=1 \ --env NCCL_P2P_LEVEL=5 \ --env NCCL_DEBUG=INFO \ --env NCCL_SOCKET_IFNAME=eth0 \ --env NCCL_ALGO=Ring \ --clean-task-policy=None \ --working-dir=/root \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch:mnist-example \ --image-pull-policy=Always \ --tensorboard \ --logdir=/workspace/logs \ "torchrun /workspace/arena/examples/pytorch/mnist/main.py \ --epochs 10000 \ --backend nccl \ --data /workspace \ --dir /workspace/logs"
Langkah 4: Verifikasi status pekerjaan pelatihan
Konfirmasi bahwa pekerjaan pelatihan telah dimulai dan jaringan eRDMA aktif.
Dapatkan KubeConfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Lihat log pod Master. Jika log pelatihan menampilkan informasi
Train Epoch, pekerjaan pelatihan berjalan dengan benar.kubectl logs pytorch-mnist-master-0 | head -n 50Verifikasi bahwa eRDMA aktif. Cari pesan
NET/IB : Using [0]erdma_0:1/RoCEdalam log pod Master. Kehadiran baris ini menunjukkan hal berikut:NCCL berhasil mendeteksi network interface card eRDMA (
erdma_0).Protokol RoCE (RDMA over Converged Ethernet) digunakan untuk komunikasi.
Komunikasi antar-node untuk pelatihan terdistribusi dipercepat oleh eRDMA.
Langkah 5: Pantau lalu lintas network interface card eRDMA
Pantau lalu lintas network interface card eRDMA secara real-time untuk memverifikasi transmisi data.
Pada halaman Clusters, klik nama kluster target. Di panel navigasi kiri, pilih . Pada baris pod yang Anda buat, klik Terminal di kolom Actions. Masuk ke node pelatihan dan jalankan perintah berikut untuk memantau lalu lintas network interface card eRDMA.
eadm stat -d erdma_0 -lOutput yang diharapkan mirip dengan
rx (download): 914,89 MiB/s 150423 p/s; tx (upload):914,66 MiB/s 147128 p/s. Jika Anda melihat lalu lintas dua arah yang berkelanjutan untuk upload dan download selama pelatihan, hal ini menunjukkan bahwa operasi komunikasi, seperti sinkronisasi gradien, sedang terjadi antar-node.Untuk petunjuk cara menganalisis performa pelatihan, lihat .
Kluster ACK menyediakan fitur AI Profiling, yang memungkinkan Anda menganalisis performa pelatihan di berbagai tingkatan, seperti Torch, Python, dan CUDA Kernel. Anda dapat menggunakan alat profiling untuk menganalisis bottleneck performa dalam pekerjaan pelatihan, termasuk komputasi, komunikasi, dan penggunaan memori.
Bersihkan sumber daya
Setelah pekerjaan pelatihan selesai, jalankan perintah berikut untuk menghapus pekerjaan:
Operasi ini menghapus semua pod dan sumber daya terkait pekerjaan tetapi tidak menghapus data persisten, seperti log TensorBoard.
arena delete pytorch-mnist -n defaultContoh output:
INFO[0001] The training job pytorch-mnist has been deleted successfullyFAQ
Mengapa log tidak menampilkan NET/IB : Using erdma_0?
Kemungkinan penyebabnya meliputi:
Parameter
--device=aliyun/erdma=1tidak ditambahkan ke perintah pengiriman.Node tidak mendukung eRDMA, atau komponen eRDMA Controller tidak diinstal dengan benar.
Gambar kontainer tidak memiliki pustaka mode pengguna RDMA, seperti `libibverbs` dan `librdmacm`.
Solusi:
Jalankan
kubectl get node <node_name> -o jsonpath='{.status.allocatable}'untuk memastikan node memiliki sumber dayaaliyun/erdma.Masuk ke node dan jalankan
ibv_devinfountuk memeriksa apakah perangkat eRDMA berfungsi dengan benar.Verifikasi bahwa gambar kontainer berisi pustaka RDMA yang diperlukan.
Apa yang harus saya lakukan jika terjadi kesalahan timeout NCCL selama pelatihan?
Timeout NCCL biasanya disebabkan oleh ketidakstabilan jaringan atau konfigurasi yang salah. Untuk mengatasi masalah ini, Anda dapat mencoba hal berikut:
Tingkatkan periode timeout: Tetapkan
--env NCCL_IB_TIMEOUT=23(default adalah 22).Tingkatkan jumlah percobaan ulang: Tetapkan
--env NCCL_IB_RETRY_CNT=10.Periksa konektivitas jaringan antar-node dan status perangkat eRDMA.
Bagaimana cara menentukan apakah eRDMA telah meningkatkan performa pelatihan?
Anda dapat membandingkan performa dengan langkah-langkah berikut:
Kirim dua pekerjaan pelatihan: satu yang menggunakan eRDMA dan satu yang tidak. Anda dapat membedakannya dengan menambahkan atau menghilangkan parameter
--device=aliyun/erdma=1.Bandingkan waktu penyelesaian untuk jumlah langkah pelatihan yang sama.
Gunakan alat AI Profiling untuk menganalisis proporsi waktu yang dihabiskan untuk komunikasi.
Umumnya, peningkatan performa dari eRDMA paling signifikan dalam skenario dengan banyak node (lebih dari dua) dan model besar (miliaran parameter atau lebih).
Apa yang harus saya lakukan jika pengiriman pekerjaan Arena gagal dengan kesalahan sumber daya tidak mencukupi?
Kemungkinan penyebabnya meliputi:
Sumber daya GPU atau eRDMA tidak mencukupi.
Node tidak memenuhi kondisi penjadwalan, seperti selector node atau toleransi taint.
Solusi:
Jalankan
kubectl get nodesuntuk melihat status node dan sumber daya yang tersedia.Jalankan
kubectl describe pod <pod_name>untuk melihat alasan detail kegagalan penjadwalan pod.Sesuaikan permintaan sumber daya atau tambahkan lebih banyak node untuk memenuhi persyaratan.
Parameter inti pekerjaan
Parameter | Deskripsi | Konfigurasi yang direkomendasikan |
| Nama pekerjaan, yang harus unik dalam kluster. | Gunakan nama yang spesifik untuk bisnis. |
| Namespace tempat pekerjaan berada. | Isolasi berdasarkan tim atau proyek. |
| Jumlah node pekerja, termasuk node Master. | Atur ke 2 untuk satu Master dan satu pekerja. |
| Jumlah GPU yang digunakan oleh setiap pekerja. | Atur berdasarkan ukuran model dan kebutuhan memori GPU. |
| Parameter utama untuk mengaktifkan eRDMA. Parameter ini mengalokasikan satu sumber daya eRDMA ke setiap pekerja. | Harus diatur ke 1 untuk mengaktifkan eRDMA. |
| Jumlah proses pelatihan yang akan dimulai pada setiap node. | Umumnya diatur ke nilai yang sama dengan |
| Kebijakan pembersihan pod. | Atur ke |
| Variabel lingkungan. | Digunakan untuk mengonfigurasi parameter komunikasi NCCL. |
Konfigurasi variabel lingkungan NCCL (untuk mengoptimalkan komunikasi terdistribusi):
Variabel lingkungan | Deskripsi | Konfigurasi yang direkomendasikan |
| Menentukan network interface card untuk komunikasi. | Atur ke |
| Tingkat kebijakan GPU Direct RDMA (0-5). | Dalam skenario eRDMA, atur ke |
| Kebijakan komunikasi peer-to-peer (0-5). | Atur ke |
| Algoritma komunikasi kolektif. | Opsi meliputi |
| Tingkat log. | Atur ke |
| Menentukan network interface card RDMA yang akan digunakan. | Gunakan |
| Periode timeout komunikasi InfiniBand (IB). | Sesuaikan berdasarkan latensi jaringan. |
| Jumlah percobaan ulang untuk komunikasi IB yang gagal. | Anda dapat menambahkan nilai ini untuk jaringan yang tidak stabil. |
Untuk informasi selengkapnya tentang variabel lingkungan NCCL, lihat dokumentasi resmi NCCL.
Bagaimana cara membuat gambar kontainer yang mendukung eRDMA untuk lingkungan produksi?
Untuk menggunakan eRDMA, Anda harus menginstal pustaka dan driver mode pengguna RDMA dalam kontainer. Contoh Dockerfile berikut didasarkan pada citra PyTorch resmi dan mengintegrasikan driver eRDMA serta contoh pelatihan MNIST.
Buat gambar kontainer produksi yang mendukung eRDMA. Untuk informasi selengkapnya, lihat Aktifkan eRDMA dalam kontainer (Docker).
ARG PYTORCH_IMAGE=docker.io/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime
FROM docker.io/library/alpine:3.22.1 AS downloader
WORKDIR /workspace
RUN apk add git wget gzip
RUN mkdir -p /workspace/MNIST/raw && \
cat <<EOF > /workspace/MNIST/raw/checksums.md5
f68b3c2dcbeaaa9fbdd348bbdeb94873 train-images-idx3-ubyte.gz
d53e105ee54ea40749a09fcbcd1e9432 train-labels-idx1-ubyte.gz
9fb629c4189551a2d022fa330f9573f3 t10k-images-idx3-ubyte.gz
ec29112dd5afa0611ce80d1b7f02629c t10k-labels-idx1-ubyte.gz
EOF
RUN cd /workspace/MNIST/raw && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/train-labels-idx1-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/t10k-images-idx3-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/t10k-labels-idx1-ubyte.gz && \
md5sum -c checksums.md5 && \
rm checksums.md5 && \
gzip -d *.gz
RUN git clone https://github.com/kubeflow/arena.git -b v0.15.2
FROM ${PYTORCH_IMAGE}
WORKDIR /workspace
COPY --from=downloader /workspace .
RUN set -eux && \
apt update && \
apt install -y wget gpg && \
wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg && \
echo "deb [ ] https://mirrors.aliyun.com/erdma/apt/ubuntu jammy/erdma main" > /etc/apt/sources.list.d/erdma.list && \
apt update && \
apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 && \
pip install --no-cache-dir -r /workspace/arena/examples/pytorch/mnist/requirements.txt && \
rm -rf /var/lib/apt/lists/*