Remote Direct Memory Access (RDMA) transfiere datos directamente entre la memoria de dos máquinas y omite el sistema operativo en ambos extremos. Esto elimina la replicación de memoria y la sobrecarga por cambio de contexto, lo que reduce el uso de CPU y mejora el throughput y la latencia de la red en cargas de trabajo de entrenamiento de IA, cómputo de alto rendimiento (HPC) y almacenamiento distribuido.
Esta guía explica cómo instalar el plugin de dispositivo RDMA en Node Lingjun y desplegar pods que utilicen RDMA.
Elección del modo de red
Antes de empezar, decida qué modo de red utilizarán sus pods. Esta decisión determina si necesita IPv6 en el clúster subyacente de bare metal de Lingjun.
|
Modo |
Descripción |
IPv6 obligatorio en el clúster de bare metal de Lingjun |
|
Modo hostNetwork |
El pod comparte la pila de red del nodo host |
No |
|
Modo non-hostNetwork |
El pod tiene su propia dirección IP |
Sí |
Si sus pods utilizan el modo non-hostNetwork, el clúster de bare metal de Lingjun que aloja a Node Lingjun debe estar configurado con IPv6. Seleccione el modo IPv6 al crear dicho clúster. Para habilitar esta opción, enviando un ticket para contactar al equipo de Lingjun.
Funcionamiento
El plugin de dispositivo RDMA de ACK (ack-rdma-device-plugin) se ejecuta como un DaemonSet en cada Node Lingjun con RDMA habilitado. Este registra el recurso extendido rdma/hca en Kubernetes para que los pods puedan solicitar acceso a RDMA mediante límites de recursos estándar.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster administrado ACK Pro con al menos un Node Lingjun que disponga de hardware RDMA
(Para el modo non-hostNetwork) Un clúster de bare metal de Lingjun configurado con IPv6
Instalación del plugin de dispositivo RDMA
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en Add-ons.
-
En la página Add-ons, haga clic en la pestaña Others. Busque ack-rdma-device-plugin e instálelo. Configure el siguiente parámetro durante la instalación:
ImportanteSi habilita RDMA para el modo non-hostNetwork pero el clúster de bare metal de Lingjun no utiliza IPv6, la configuración de RDMA no surtirá efecto.
Parámetro
Descripción
Enable RDMA for non-hostNetwork
Controla qué pods pueden usar RDMA. Establezca este valor en
False (cleared)para restringir RDMA a los pods en modo hostNetwork. Establézcalo enTrue (selected)para permitir también los pods en modo non-hostNetwork; esto requiere que el clúster de bare metal de Lingjun use IPv6.
Comprobación de la configuración
Después de la instalación, ejecute las siguientes comprobaciones para confirmar que RDMA está disponible en sus nodos.
Verificación de la ejecución del DaemonSet
kubectl get ds ack-rdma-dp-ds -n kube-system
Salida esperada:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ack-rdma-dp-ds 2 2 2 2 2 <none> xxh
Todos los nodos con RDMA habilitado aparecen en los conteos DESIRED, CURRENT y READY. Si READY es menor que DESIRED, revise los registros del pod del DaemonSet en busca de errores.
Verificación de la exposición del recurso RDMA en los nodos
kubectl get node e01-cn-xxxx -oyaml
Busque rdma/hca tanto en allocatable como en capacity. Un valor de 1k confirma que los recursos RDMA están registrados y disponibles para que los pods los soliciten.
Salida esperada:
...
allocatable:
cpu: 189280m
ephemeral-storage: "3401372677838"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 2063229768Ki
nvidia.com/gpu: "8"
pods: "64"
rdma/hca: 1k
capacity:
cpu: "192"
ephemeral-storage: 3690725568Ki
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 2112881480Ki
nvidia.com/gpu: "8"
pods: "64"
rdma/hca: 1k
...
Despliegue de un pod con RDMA
Para otorgar acceso a RDMA a un pod, solicite el recurso rdma/hca en sus limits. Una solicitud de rdma/hca: 1 es suficiente.
El pod requiere dos capacidades de Linux (IPC_LOCK y SYS_RESOURCE) y un volumen de memoria compartida en /dev/shm. IPC_LOCK permite el bloqueo de memoria para transferencias sin copia. SYS_RESOURCE permite que el proceso establezca límites de recursos. Sin estas capacidades, las operaciones de RDMA fallarán o tendrán un rendimiento deficiente.
El siguiente manifiesto de Job muestra una configuración completa de RDMA:
apiVersion: batch/v1
kind: Job
metadata:
name: hps-benchmark
spec:
parallelism: 1
template:
spec:
containers:
- name: hps-benchmark
image: **
command:
- sh
- -c
- |
python /workspace/wdl_8gpu_outbrain.py
resources:
limits:
nvidia.com/gpu: 8
rdma/hca: 1 # Request one RDMA HCA device
workingDir: /root
volumeMounts:
- name: shm
mountPath: /dev/shm # Shared memory required for RDMA operations
securityContext:
capabilities:
add:
- SYS_RESOURCE # Allows the process to set resource limits (required for RDMA)
- IPC_LOCK # Allows memory locking (required for zero-copy RDMA transfers)
restartPolicy: Never
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 8Gi
hostNetwork: true # Remove this line if using non-hostNetwork mode with IPv6
tolerations:
- operator: Exists
Si habilitó RDMA para el modo non-hostNetwork, elimine la línea hostNetwork: true. Los pods sin ese campo utilizan el modo non-hostNetwork y aun así pueden acceder a RDMA a través del plugin.