Высокоскоростная сеть для распределенного ИИ#

Данная ИИ-функция автоматизирует координацию и взаимодействие вычислительных ресурсов: она настраивает сетевые компоненты для технологий 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 этого ресурса.

Сценарий проверки готовности высокоскоростной сети:

  1. Убедитесь, что pod Network Operator запущен в пространстве имен nvidia-network-operator:

    kubectl -n nvidia-network-operator get pods
    
  2. Убедитесь, что пользовательский ресурс 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, высокоскоростная сеть готова к запуску рабочих нагрузок.

  3. Убедитесь, что ресурс 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:

  1. Создайте два 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 с тем же манифестом.

  2. Убедитесь, что оба pod находятся в состоянии Running:

    kubectl get pods | grep rdma-test-pod
    
  3. Получите 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'
    
  4. Запустите тест высокоскоростной передачи данных 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).

  5. Во втором 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 работает корректно.

  6. После завершения проверки удалите тестовые 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:

  1. Создайте два 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 с тем же манифестом.

  2. Убедитесь, что оба pod находятся в состоянии Running и каждый из них получил GPU и ресурс RDMA:

    kubectl get pods | grep rdma-gpu-test-pod
    
  3. Получите 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'
    
  4. Запустите тест 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.

  5. Во втором 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-устройства выполняют обмен данными напрямую через высокоскоростную сеть без участия центрального процессора.

  6. После завершения проверки удалите тестовые pod:

    kubectl delete pod rdma-gpu-test-pod-1 rdma-gpu-test-pod-2
    

Результат#

Ожидаемым результатом являются:

  • подтверждение готовности высокоскоростной сети;

  • доступность ресурсов RDMA в кластере;

  • успешное выполнение рабочими нагрузками RDMA и GPU-Direct RDMA высокоскоростного обмена данными между вычислительными узлами и GPU.