Высокоскоростная сеть для распределенного ИИ#
Данная ИИ-функция автоматизирует координацию и взаимодействие вычислительных ресурсов: она настраивает сетевые компоненты для технологий RDMA (Remote Direct Memory Access) и GPUDirect, что позволяет объединять вычислительные ресурсы для распределенного обучения и инференса моделей ИИ:
Сценарий позволяет пользователю:
развернуть высокоскоростную сеть для интенсивных вычислительных рабочих нагрузок;
проверить доступность ресурсов RDMA в кластере;
запускать рабочие нагрузки RDMA и GPU-Direct RDMA между несколькими pod;
проверять высокоскоростной обмен данными между вычислительными узлами и GPU.
Примечание
При использовании ИИ-функций DropApp соблюдайте правила работы пользователя с ИИ-функциями.
Предусловия#
Предварительными условиями выполнения сценария являются:
Развернутый кластер DropApp с установленным программным компонентом K8S Artificial Intelligence (K8SI).
Наличие сети с поддержкой RDMA через InfiniBand или RDMA через конвергентный Ethernet (RoCE), требующей сетевого адаптера Mellanox ConnectX-5 или новее.
Доступ к кластеру с правами, достаточными для просмотра состояния узлов, pod и ресурсов.
Установленный и настроенный Network Operator совместно с GPU Operator для обеспечения высокой пропускной способности и низкой задержки в сетях для GPU-кластеров.
Наличие метки
feature.node.kubernetes.io/pci-<vendor-id>.present=trueна узлах с сетевыми адаптерами, поддерживающими RDMA (метка добавляется Node Feature Discovery).
Установка и настройка Network Operator описана в разделе «Network Operator» Руководства администратора.
Проверка готовности высокоскоростной сети#
Проверьте, что Network Operator развернут в кластере и сетевые компоненты для высокоскоростной сети находятся в требуемом состоянии. Состояние кластера для сетевых устройств Network Operator описывает пользовательский ресурс NICClusterPolicy, а текущее состояние системы отражается в поле status этого ресурса.
Сценарий проверки готовности высокоскоростной сети:
Убедитесь, что pod Network Operator запущен в пространстве имен
nvidia-network-operator:kubectl -n nvidia-network-operator get podsУбедитесь, что пользовательский ресурс
NICClusterPolicyс именемnic-cluster-policyимеет состояниеready:kubectl get nicclusterpolicy nic-cluster-policy -o json | jq '.status.state, .status.appliedStates'Пример вывода:
"ready" [ { "name": "state-OFED", "state": "ready" }, { "name": "state-RDMA-device-plugin", "state": "ready" }, { "name": "state-multus-cni", "state": "ready" } ]Если глобальное состояние
stateравноready, а подсостояния сетевых компонентов (state-OFED,state-RDMA-device-plugin,state-multus-cniи других) такжеready, высокоскоростная сеть готова к запуску рабочих нагрузок.Убедитесь, что ресурс RDMA
rdma/rdma_shared_device_aдоступен на узлах кластера:kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, rdma: .status.capacity["rdma/rdma_shared_device_a"]}'Если в выводе команды для узла присутствует значение ресурса
rdma/rdma_shared_device_a, высокоскоростной сетевой интерфейс зарегистрирован в кластере и готов к использованию.
Запуск рабочей нагрузки RDMA#
Network Operator обеспечивает удаленный прямой доступ к памяти (RDMA) для передачи данных между модулями памяти в обход центрального процессора и сетевого стека ядра, поддерживая протоколы InfiniBand и RDMA через конвергентный Ethernet (RoCE). Для запуска рабочих нагрузок RDMA требуется ресурс rdma/rdma_shared_device_a, предоставляемый RDMA Shared Device Plugin.
Сценарий запуска рабочей нагрузки RDMA:
Создайте два pod, запрашивающих ресурс RDMA:
apiVersion: v1 kind: Pod metadata: name: rdma-test-pod-1 annotations: k8s.v1.cni.cncf.io/networks: rdma-net-ipam spec: restartPolicy: OnFailure containers: - name: rdma-test-ctr image: mellanox/rping-test securityContext: capabilities: add: ["IPC_LOCK"] resources: limits: rdma/rdma_shared_device_a: 1 requests: rdma/rdma_shared_device_a: 1 command: ["sh", "-c", "sleep infinity"]Примените манифест первого pod:
kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: rdma-test-pod-1 annotations: k8s.v1.cni.cncf.io/networks: rdma-net-ipam spec: restartPolicy: OnFailure containers: - name: rdma-test-ctr image: mellanox/rping-test securityContext: capabilities: add: ["IPC_LOCK"] resources: limits: rdma/rdma_shared_device_a: 1 requests: rdma/rdma_shared_device_a: 1 command: ["sh", "-c", "sleep infinity"] EOFАналогичным образом создайте второй pod
rdma-test-pod-2с тем же манифестом.Убедитесь, что оба pod находятся в состоянии
Running:kubectl get pods | grep rdma-test-podПолучите IP-адреса pod, подключенных к высокоскоростной сети:
kubectl get pod rdma-test-pod-1 -o json | jq '.status.podIP'kubectl get pod rdma-test-pod-2 -o json | jq '.status.podIP'Запустите тест высокоскоростной передачи данных
ib_write_bwв первом pod в режиме сервера:kubectl exec rdma-test-pod-1 -- ib_write_bw -d <RDMA_device> -a -F --report_gbits -RГде
<RDMA_device>— имя высокоскоростного сетевого устройства (например,mlx5_0).Во втором pod запустите
ib_write_bwв режиме клиента, указав IP-адрес первого pod:kubectl exec rdma-test-pod-2 -- ib_write_bw -d <RDMA_device> -a -F --report_gbits -R <ip_address_pod_1>Пример вывода:
--------------------------------------------------------------------------- RDMA_Write BW Test Dual-port : OFF Device : mlx5_0 Number of qps : 1 Transport type : IB Connection type : RC Using SRQ : OFF CQ Moderation : 100 Mtu : 4096[B] Link type : Ethernet GID index : 3 --------------------------------------------------------------------------- local address: LID 0000 QPN 0x0137 PSN 0xbd4e80 remote address: LID 0000 QPN 0x0137 PSN 0xbd4e80 ... --------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 1000 94.51 94.51 0.180431 ---------------------------------------------------------------------------Высокое значение пропускной способности (BW, gigabits per second) в выводе подтверждает, что высокоскоростная сеть RDMA работает корректно.
После завершения проверки удалите тестовые pod:
kubectl delete pod rdma-test-pod-1 rdma-test-pod-2
Запуск рабочей нагрузки GPU-Direct RDMA#
Network Operator совместно с GPU Operator обеспечивает технологию GPU-Direct RDMA, при которой GPU-устройства выполняют обмен данными напрямую между своими буферами памяти через высокоскоростную сеть в обход центрального процессора, что критично для распределенного обучения и инференса моделей ИИ.
Сценарий запуска рабочей нагрузки GPU-Direct RDMA:
Создайте два pod, запрашивающих ресурс RDMA и ресурс GPU:
apiVersion: v1 kind: Pod metadata: name: rdma-gpu-test-pod-1 annotations: k8s.v1.cni.cncf.io/networks: rdma-net-ipam spec: restartPolicy: OnFailure containers: - name: rdma-gpu-test-ctr image: mellanox/cuda-perftest securityContext: capabilities: add: ["IPC_LOCK"] resources: limits: nvidia.com/gpu: 1 rdma/rdma_shared_device_a: 1 requests: nvidia.com/gpu: 1 rdma/rdma_shared_device_a: 1Примените манифест первого pod:
kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: rdma-gpu-test-pod-1 annotations: k8s.v1.cni.cncf.io/networks: rdma-net-ipam spec: restartPolicy: OnFailure containers: - name: rdma-gpu-test-ctr image: mellanox/cuda-perftest securityContext: capabilities: add: ["IPC_LOCK"] resources: limits: nvidia.com/gpu: 1 rdma/rdma_shared_device_a: 1 requests: nvidia.com/gpu: 1 rdma/rdma_shared_device_a: 1 EOFАналогичным образом создайте второй pod
rdma-gpu-test-pod-2с тем же манифестом.Убедитесь, что оба pod находятся в состоянии
Runningи каждый из них получил GPU и ресурс RDMA:kubectl get pods | grep rdma-gpu-test-podПолучите IP-адреса pod, подключенных к высокоскоростной сети:
kubectl get pod rdma-gpu-test-pod-1 -o json | jq '.status.podIP'kubectl get pod rdma-gpu-test-pod-2 -o json | jq '.status.podIP'Запустите тест GPU-Direct RDMA
ib_write_bwс использованием CUDA в первом pod в режиме сервера:kubectl exec rdma-gpu-test-pod-1 -- ib_write_bw -d <RDMA_device> -a -F --report_gbits -R -q 2 --use_cuda 0Где:
<RDMA_device>— имя высокоскоростного сетевого устройства (например,mlx5_0);-q 2— количество очередей (Queue Pair) для передачи данных;--use_cuda 0— использование GPU-устройства с индексом0для передачи данных напрямую из памяти GPU.
Во втором pod запустите
ib_write_bwв режиме клиента, указав IP-адрес первого pod:kubectl exec rdma-gpu-test-pod-2 -- ib_write_bw -d <RDMA_device> -a -F --report_gbits -R -q 2 --use_cuda 0 <ip_address_pod_1>Пример вывода:
--------------------------------------------------------------------------- RDMA_Write BW Test Dual-port : OFF Device : mlx5_0 Number of qps : 2 Transport type : IB Connection type : RC Using SRQ : OFF CQ Moderation : 100 Mtu : 4096[B] Link type : Ethernet GID index : 3 --------------------------------------------------------------------------- local address: LID 0000 QPN 0x0137 PSN 0xbd4e80 remote address: LID 0000 QPN 0x0137 PSN 0xbd4e80 ... --------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 1000 93.87 93.87 0.179103 ---------------------------------------------------------------------------Высокое значение пропускной способности (BW, gigabits per second) подтверждает, что GPU-устройства выполняют обмен данными напрямую через высокоскоростную сеть без участия центрального процессора.
После завершения проверки удалите тестовые pod:
kubectl delete pod rdma-gpu-test-pod-1 rdma-gpu-test-pod-2
Результат#
Ожидаемым результатом являются:
подтверждение готовности высокоскоростной сети;
доступность ресурсов RDMA в кластере;
успешное выполнение рабочими нагрузками RDMA и GPU-Direct RDMA высокоскоростного обмена данными между вычислительными узлами и GPU.