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
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ón1.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
. Los administradores de paquetes tales comoaws --version | cut -d / -f2 | cut -d ' ' -f1
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 es1.30
, puede usar la versión1.29
,1.30
o1.31
dekubectl
con él. Para instalar o actualizarkubectl
, 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, comop4d
op5
. 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
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.
-
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
por la Región de AWS en la que desea implementar su grupo de nodos.region-code
aws ec2 describe-instance-types --region
region-code
\ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output textAl 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.
-
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
con cualquier tipo de instancia que se devolvió en el paso anterior.p5.48xlarge
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 textUn 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.
-
Cree un grupo de nodos mediante
eksctl
.Requisito previo
La versión
0.191.0
o posterior de la herramienta de línea de comandoseksctl
instalada en su dispositivo o AWS CloudShell. Para instalar o actualizareksctl
, consulte la sección de Instalaciónen la documentación de eksctl
.-
Copie el siguiente contenido en un archivo denominado
. Reemplace losefa-cluster.yaml
por los de su propiedad. Puede reemplazarexample values
por una instancia diferente, pero si lo hace, asegúrese de que los valores dep5.48xlarge
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 -
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.
-
-
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 ampliadosen 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 NCCLaws-samples/awsome-distributed-training
de GitHub. Las pruebas de NCCL
-
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. -
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 instanciap5.48xlarge
.-
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
-
Aplicación de NCCL-tests MPIJob
Aplique el manifiesto para enviar
MPIJob
. Esto creará dos instanciasp5.48xlarge
de Amazon EC2.kubectl apply -f nccl-tests.yaml
Un ejemplo de salida sería el siguiente.
mpijob.kubeflow.org/nccl-tests created
-
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 2m49sEl operador MPI crea un Pod de lanzamiento y dos Pods de trabajo (uno en cada nodo).
-
Comprobación de que el trabajo se ejecute correctamente con los registros
Consulte el registro del Pod de
nccl-tests-launcher
. Sustituya
con el valor de su salida.nbql9
kubectl logs -f nccl-tests-launcher-
nbql9
-
Si la prueba se completó correctamente, puede implementar las aplicaciones que utilizan Nvidia Collective Communication Library.