Impartición de formación en machine learning en Amazon EKS con Elastic Fabric Adapter - Amazon EKS

Ayude a mejorar esta página

¿Quiere contribuir a esta guía del usuario? Desplácese hasta el final de esta página y seleccione Editar esta página en GitHub. Sus contribuciones ayudarán a que nuestra guía del usuario sea mejor para todos.

Impartición de formación en machine learning en Amazon EKS con Elastic Fabric Adapter

En este tema se describe cómo integrar Elastic Fabric Adapter (EFA) con los Pods implementados en el clúster de Amazon EKS. Elastic Fabric Adapter (EFA) es una interfaz de red para instancias de Amazon EC2 que le permite ejecutar aplicaciones que requieren altos niveles de comunicaciones entre nodos a escala en AWS. Su interfaz de hardware de bypass del sistema operativo diseñada a medida mejora el rendimiento de las comunicaciones entre instancias, lo que es fundamental para ajustar la escala de estas aplicaciones. Con EFA, las aplicaciones de High Performance Computing (HPC, informática de alto rendimiento) que utilizan la Message Passing Interface (MPI, interfaz de paso de mensajes) y las aplicaciones de Machine Learning (ML) que utilizan NVIDIA Collective Communications Library (NCCL, Biblioteca de comunicación colectiva de NVIDIA) pueden aumentar su escala a miles de CPU o GPU. Como resultado, obtiene el rendimiento de las aplicaciones de los clústeres HPC en las instalaciones con la elasticidad y flexibilidad bajo demanda de la nube de AWS. La integración de Elastic Fabric Adapter (EFA) con aplicaciones que se ejecutan en clústeres de Amazon EKS puede reducir el tiempo necesario para completar cargas de trabajo de formación distribuidas a gran escala sin tener que agregar instancias adicionales al clúster. Para obtener más información sobre EFA, consulte Elastic Fabric Adapter.

Tipos de instancias con EFA

El complemento de dispositivos de Kubernetes para AWS EFA es compatible con todos los tipos de instancias de Amazon EC2 que tienen EFA. Para obtener una lista de los tipos de instancia que tienen EFA, consulte Tipos de instancias admitidos en la Guía del usuario de Amazon EC2. Sin embargo, para ejecutar rápidamente aplicaciones de ML, recomendamos que una instancia tenga chips de aceleración de hardware, como GPU nVidia, chips AWS Inferentia o AWS Trainium, además de EFA. Para ver una lista de los tipos de instancias que tienen chips de aceleración de hardware y EFA, consulte Computación acelerada en la Guía del usuario de Amazon EC2.

Al comparar los tipos de instancias con el fin elegir entre ellos, tenga en cuenta la cantidad de tarjetas de red de EFA disponibles para cada uno, así como la cantidad de tarjetas de acelerador, de CPU y de memoria. Puede asignar hasta un EFA por tarjeta de red. Un EFA cuenta como una interfaz de red. Para ver cuántos EFA están disponibles para cada tipo de instancia que tiene EFA, consulte la lista de tarjetas de red en la Guía del usuario de Amazon EC2.

Requisitos previos

  • Un clúster existente de Amazon EKS. Si no dispone de un clúster existente, utilice una de nuestras guías Introducción a Amazon EKS para crear uno. El clúster debe implementarse en una VPC que tenga al menos una subred privada con suficientes direcciones IP disponibles para implementar nodos en ella. La subred privada debe tener acceso a Internet saliente proporcionado por un dispositivo externo, como una puerta de enlace NAT.

    Si planea usar eksctl para crear su grupo de nodos, eksctl también puede crear un clúster.

  • La versión 2.12.3 o posterior, o bien, la versión 1.27.160 o posterior de la AWS Command Line Interface (AWS CLI) instalada y configurada en su dispositivo o AWS CloudShell. Para comprobar su versión actual, utilice aws --version | cut -d / -f2 | cut -d ' ' -f1. Los administradores de paquetes tales como yum, apt-get o Homebrew para macOS suelen estar atrasados varias versiones respecto de la versión de la AWS CLI más reciente. Para instalar la versión más reciente, consulte Instalar, actualizar y desinstalar la AWS CLI y Configuración rápida con aws configure en la Guía del usuario de AWS Command Line Interface. La versión de AWS CLI instalada en AWS CloudShell también puede estar atrasada varias versiones respecto de la versión más reciente. Para actualizarla, consulte Instalación de la AWS CLI en el directorio de inicio en la Guía del usuario de AWS CloudShell.

  • La herramienta de línea de comandos de kubectl está instalada en su dispositivo o AWS CloudShell. La versión puede ser la misma o hasta una versión secundaria anterior o posterior a la versión de Kubernetes de su clúster. Por ejemplo, si la versión del clúster es 1.30, puede usar la versión 1.29, 1.30 o 1.31 de kubectl con él. Para instalar o actualizar kubectl, consulte Configuración de kubectl y eksctl.

  • Debe tener instalada la versión 1.7.10 o una posterior de Amazon VPC CNI plugin for Kubernetes antes de lanzar nodos de trabajo que admitan varios Elastic Fabric Adapter, como p4d o p5. Para obtener más información sobre cómo actualizar Amazon VPC CNI plugin for Kubernetes, consulte Asignación de direcciones IP a Pods con CNI de Amazon VPC.

importante

Una consideración importante que se requiere para adoptar EFA con Kubernetes es configurar y administrar Huge Pages como un recurso en el clúster. Para obtener más información, consulte Administración de Huge Pages en la documentación de Kubernetes. Las instancias de Amazon EC2 con el controlador de EFA instalado preasignan 5128 páginas de gran tamaño de 2 MiB, que puede solicitar como recursos para utilizar en sus especificaciones de trabajo.

Crear un grupo de nodos

El procedimiento siguiente ayuda a crear un grupo de nodos con un grupo de nodos con respaldo de p4d.24xlarge con interfaces EFA y RDMA GPUDirect. También lo ayuda a ejecutar una prueba de ejemplo de NVIDIA Collective Communications Library (NCCL) para descubrir el rendimiento NCCL de varios nodos mediante el uso de EFA. El ejemplo se puede utilizar en una plantilla para la formación de aprendizaje profundo distribuida en Amazon EKS mediante EFA.

  1. Determine qué tipos de instancias de Amazon EC2 compatibles con EFA están disponibles en la Región de AWS en la que desea implementar los nodos. Reemplace region-code por la Región de AWS en la que desea implementar su grupo de nodos.

    aws ec2 describe-instance-types --region region-code \ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output text

    Al implementar nodos, el tipo de instancia que desea implementar debe estar disponible en la Región de AWS en el que está su clúster.

  2. Determine en qué zonas de disponibilidad está disponible el tipo de instancia que desea implementar. En este tutorial, el tipo de instancia p5.48xlarge se utiliza el tipo de instancia y se debe devolver en la salida de la Región de AWS que especificó en el paso anterior. Cuando implemente nodos en un clúster de producción, sustituya p5.48xlarge con cualquier tipo de instancia que se devolvió en el paso anterior.

    aws ec2 describe-instance-type-offerings --region region-code \ --location-type availability-zone --filters Name=instance-type,Values=p4d.24xlarge,p5.48xlarge \ --query 'InstanceTypeOfferings[*].Location' --output text

    Un ejemplo de salida sería el siguiente.

    us-west-2a us-west-2c us-west-2b

    Tenga en cuenta las zonas de disponibilidad devueltas para su uso en pasos posteriores. Al implementar nodos en un clúster, la VPC debe tener subredes con direcciones IP disponibles en una de las zonas de disponibilidad que se muestran en el resultado.

  3. Cree un grupo de nodos mediante eksctl.

    Requisito previo

    La versión 0.191.0 o posterior de la herramienta de línea de comandos eksctl instalada en su dispositivo o AWS CloudShell. Para instalar o actualizar eksctl, consulte la sección de Instalación en la documentación de eksctl.

    1. Copie el siguiente contenido en un archivo denominado efa-cluster.yaml. Reemplace los example values por los de su propiedad. Puede reemplazar p5.48xlarge por una instancia diferente, pero si lo hace, asegúrese de que los valores de availabilityZones sean zonas de disponibilidad que se devolvieron para el tipo de instancia en el paso uno.

      apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-efa-cluster region: region-code version: "1.XX" iam: withOIDC: true availabilityZones: ["us-west-2a", "us-west-2c"] managedNodeGroups: - name: my-efa-ng instanceType: p5.48xlarge minSize: 1 desiredCapacity: 2 maxSize: 3 availabilityZones: ["us-west-2a"] volumeSize: 300 privateNetworking: true efaEnabled: true
    2. Cree un grupo de nodos administrados en un clúster existente.

      eksctl create nodegroup -f efa-cluster.yaml

      Si no dispone de un clúster existente, puede ejecutar el siguiente comando para crear un clúster y el grupo de nodos.

      eksctl create cluster -f efa-cluster.yaml
      nota

      Como el tipo de instancia que se usa en este ejemplo tiene GPU,eksctl instala automáticamente el complemento de dispositivo NVIDIA Kubernetes en cada instancia por ti.

  4. Implemente el complemento de EFA del dispositivo de Kubernetes.

    El complemento de EFA del dispositivo de Kubernetes detecta y anuncia interfaces de EFA como recursos asignables a Kubernetes. Una aplicación puede consumir el tipo de recurso ampliado vpc.amazonaws.com/efa en una especificación de solicitud de Pod al igual que la CPU y la memoria. Para obtener más información, consulte Consumir recursos ampliados en la documentación de Kubernetes. Una vez solicitado, el complemento asigna automáticamente una interfaz de EFA al Pod y la monta en él. El uso del complemento del dispositivo simplifica la configuración de EFA y no requiere que un Pod se ejecute en modo privilegiado.

    helm repo add eks https://aws.github.io/eks-charts helm install aws-efa-k8s-device-plugin --namespace kube-system eks/aws-efa-k8s-device-plugin

(Opcional) Prueba del rendimiento de EFA

Es recomendable que pruebe la configuración de EFA. Puede usar las pruebas de NCCL en el repositorio aws-samples/awsome-distributed-training de GitHub. Las pruebas de NCCL evalúan el rendimiento de la red mediante Nvidia Collective Communication Library. Los siguientes pasos envían las pruebas de NCCL en Amazon EKS.

  1. Implementar el operador MPI de Kubeflow

    Para las pruebas NCCL puede aplicar el operador MPI de Kubeflow. El operador Message Passing Interface (MPI, interfaz de paso de mensajes) facilita la ejecución de la formación distribuida de estilo AllReduce en Kubernetes. Para obtener más información, consulte Operador de MPI en GitHub.

  2. Ejecución de la prueba de rendimiento de NCCL de varios nodos para verificar GPUDirectRDMA/EFA

    Para verificar el rendimiento de NCCL con GPUDirectRDMA en EFA, ejecute la prueba de rendimiento de NCCL estándar. Para obtener más información, consulte el repositorio oficial Pruebas de NCCL en GitHub.

    Complete los pasos que se indican a continuación para ejecutar una NCCL Performance Test de dos nodos. En el trabajo de prueba de NCCL de ejemplo, cada trabajo solicita ocho GPU, 5210 Mi de hugepages-2Mi, cuatro EFA y 8000 Mi de memoria, lo que significa que cada trabajo consume todos los recursos de una instancia p5.48xlarge.

    1. Creación del manifiesto MPIJob

      Copie lo siguiente en un archivo denominado nccl-tests.yaml:

      apiVersion: kubeflow.org/v2beta1 kind: MPIJob metadata: name: nccl-tests spec: runPolicy: cleanPodPolicy: Running backoffLimit: 20 slotsPerWorker: 8 mpiReplicaSpecs: Launcher: replicas: 1 template: spec: restartPolicy: OnFailure containers: - image: public.ecr.aws/hpc-cloud/nccl-tests:latest imagePullPolicy: IfNotPresent name: test-nccl-launcher env: - name: PATH value: $PATH:/opt/amazon/efa/bin:/usr/bin - name: LD_LIBRARY_PATH value: /opt/amazon/openmpi/lib:/opt/nccl/build/lib:/opt/amazon/efa/lib:/opt/aws-ofi-nccl/install/lib:/usr/local/nvidia/lib:$LD_LIBRARY_PATH - name: NCCL_DEBUG value: INFO - name: NCCL_BUFFSIZE value: '8388608' - name: NCCL_P2P_NET_CHUNKSIZE value: '524288' - name: NCCL_TUNER_PLUGIN value: /opt/aws-ofi-nccl/install/lib/libnccl-ofi-tuner.so command: - /opt/amazon/openmpi/bin/mpirun - --allow-run-as-root - --tag-output - -np - "16" - -N - "8" - --bind-to - none - -x - PATH - -x - LD_LIBRARY_PATH - -x - NCCL_DEBUG=INFO - -x - NCCL_BUFFSIZE - -x - NCCL_P2P_NET_CHUNKSIZE - -x - NCCL_TUNER_PLUGIN - --mca - pml - ^cm,ucx - --mca - btl - tcp,self - --mca - btl_tcp_if_exclude - lo,docker0,veth_def_agent - /opt/nccl-tests/build/all_reduce_perf - -b - "8" - -e - "16G" - -f - "2" - -g - "1" - -c - "1" - -n - "100" Worker: replicas: 2 template: spec: nodeSelector: node.kubernetes.io/instance-type: "p5.48xlarge" containers: - image: public.ecr.aws/hpc-cloud/nccl-tests:latest imagePullPolicy: IfNotPresent name: nccl-tests-worker volumeMounts: - name: shmem mountPath: /dev/shm resources: limits: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi vpc.amazonaws.com/efa: 32 memory: 32000Mi requests: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi vpc.amazonaws.com/efa: 32 memory: 32000Mi volumes: - name: shmem hostPath: path: /dev/shm
    2. Aplicación de NCCL-tests MPIJob

      Aplique el manifiesto para enviar MPIJob. Esto creará dos instancias p5.48xlarge de Amazon EC2.

      kubectl apply -f nccl-tests.yaml

      Un ejemplo de salida sería el siguiente.

      mpijob.kubeflow.org/nccl-tests created
    3. Comprobación de que el trabajo haya iniciado los pods

      Consulte su ejecución Pods.

      kubectl get pods

      Un ejemplo de salida sería el siguiente.

      NAME READY STATUS RESTARTS AGE nccl-tests-launcher-nbql9 0/1 Init:0/1 0 2m49s nccl-tests-worker-0 1/1 Running 0 2m49s nccl-tests-worker-1 1/1 Running 0 2m49s

      El operador MPI crea un Pod de lanzamiento y dos Pods de trabajo (uno en cada nodo).

    4. Comprobación de que el trabajo se ejecute correctamente con los registros

      Consulte el registro del Pod de nccl-tests-launcher. Sustituya nbql9 con el valor de su salida.

      kubectl logs -f nccl-tests-launcher-nbql9

Si la prueba se completó correctamente, puede implementar las aplicaciones que utilizan Nvidia Collective Communication Library.