Ml 16277 Neuron Observability.drawio 803x630.png

Los avances recientes en el aprendizaje automático (ML) han dado lugar a modelos cada vez más grandes, algunos de los cuales requieren cientos de miles de millones de parámetros. Aunque son más potentes, el entrenamiento y la inferencia sobre esos modelos requieren importantes recursos computacionales. A pesar de la disponibilidad de bibliotecas de capacitación distribuidas avanzadas, es común que los trabajos de capacitación e inferencia necesiten cientos de aceleradores (GPU o chips de aprendizaje automático especialmente diseñados, como Capacitación en AWS y AWS Inferencia), y por lo tanto decenas o cientos de instancias.

En dichos entornos distribuidos, la observabilidad tanto de las instancias como de los chips ML se vuelve clave para ajustar el rendimiento del modelo y optimizar los costos. Las métricas permiten a los equipos comprender el comportamiento de las cargas de trabajo y optimizar la asignación y utilización de recursos, diagnosticar anomalías y aumentar la eficiencia general de la infraestructura. Para los científicos de datos, la utilización y saturación de los chips ML también son relevantes para la planificación de la capacidad.

Esta publicación lo guía a través del Patrón de observabilidad de código abierto para AWS Inferentiaque le muestra cómo monitorear el rendimiento de los chips ML, utilizados en un Servicio Amazon Elastic Kubernetes (Amazon EKS), con nodos de plano de datos basados ​​en Nube informática elástica de Amazon (Amazon EC2) instancias de tipo Inf1 y Inf2.

El patrón es parte del Acelerador de observabilidad de AWS CDK, un conjunto de módulos obstinados que le ayudarán a establecer la observabilidad de los clústeres de Amazon EKS. El Acelerador de observabilidad de AWS CDK está organizado en torno a patrones, que son unidades reutilizables para implementar múltiples recursos. El conjunto de patrones de observabilidad de código abierto instrumenta la observabilidad con Grafana administrada por Amazon tableros de instrumentos, un Distribución AWS para OpenTelemetry recopilador para recopilar métricas, y Servicio administrado de Amazon para Prometheus para almacenarlos.

Descripción general de la solución

El siguiente diagrama ilustra la arquitectura de la solución.

Esta solución implementa un clúster de Amazon EKS con un grupo de nodos que incluye instancias Inf1.

El tipo de AMI del grupo de nodos es AL2_x86_64_GPUque utiliza el AMI de Amazon Linux acelerada optimizada para Amazon EKS. Además de la configuración de AMI estándar optimizada para Amazon EKS, la AMI acelerada incluye la Tiempo de ejecución de NeuronX.

Para acceder a los chips ML de Kubernetes, el patrón implementa el Neurona AWS complemento del dispositivo.

Las métricas están expuestas a Amazon Managed Service for Prometheus mediante el neuron-monitor DaemonSet, que implementa un contenedor mínimo, con el Herramientas neuronales instalado. Específicamente, el neuron-monitor DaemonSet ejecuta el neuron-monitor comando canalizado al neuron-monitor-prometheus.py script complementario (ambos comandos son parte del contenedor):

neuron-monitor | neuron-monitor-prometheus.py --port <port>

El comando utiliza los siguientes componentes:

  • neuron-monitor recopila métricas y estadísticas de las aplicaciones Neuron que se ejecutan en el sistema y transmite los datos recopilados a la salida estándar en formato JSON
  • neuron-monitor-prometheus.py Mapea y expone los datos de telemetría del formato JSON al formato compatible con Prometheus.

Los datos se visualizan en Amazon Managed Grafana mediante el panel correspondiente.

El resto de la configuración para recopilar y visualizar métricas con Amazon Managed Service for Prometheus y Amazon Managed Grafana es similar a la utilizada en otros patrones basados ​​en código abierto, que se incluyen en el AWS Observability Accelerator for CDK Repositorio de GitHub.

Requisitos previos

Necesita lo siguiente para completar los pasos de esta publicación:

Configurar el entorno

Complete los siguientes pasos para configurar su entorno:

  1. Abra una ventana de terminal y ejecute los siguientes comandos:
export AWS_REGION=<YOUR AWS REGION>
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

  1. Recupere los ID del espacio de trabajo de cualquier espacio de trabajo de Amazon Managed Grafana existente:
aws grafana list-workspaces

El siguiente es nuestro resultado de muestra:

{
  "workspaces": [
    {
      "authentication": {
        "providers": [
          "AWS_SSO"
        ]
      },
      "created": "2023-06-07T12:23:56.625000-04:00",
      "description": "accelerator-workspace",
      "endpoint": "g-XYZ.grafana-workspace.us-east-2.amazonaws.com",
      "grafanaVersion": "9.4",
      "id": "g-XYZ",
      "modified": "2023-06-07T12:30:09.892000-04:00",
      "name": "accelerator-workspace",
      "notificationDestinations": [
        "SNS"
      ],
      "status": "ACTIVE",
      "tags": {}
    }
  ]
}

  1. Asigne los valores de id y endpoint a las siguientes variables de entorno:
export COA_AMG_WORKSPACE_ID="<<YOUR-WORKSPACE-ID, similar to the above g-XYZ, without quotation marks>>"
export COA_AMG_ENDPOINT_URL="<<https://YOUR-WORKSPACE-URL, including protocol (i.e. https://), without quotation marks, similar to the above https://g-XYZ.grafana-workspace.us-east-2.amazonaws.com>>"

COA_AMG_ENDPOINT_URL necesita incluir https://.

  1. Cree una clave API de Grafana desde el espacio de trabajo de Amazon Managed Grafana:
export AMG_API_KEY=$(aws grafana create-workspace-api-key \
--key-name "grafana-operator-key" \
--key-role "ADMIN" \
--seconds-to-live 432000 \
--workspace-id $COA_AMG_WORKSPACE_ID \
--query key \
--output text)

  1. Establecer un secreto en Gerente de sistemas AWS:
aws ssm put-parameter --name "/cdk-accelerator/grafana-api-key" \
--type "SecureString" \
--value $AMG_API_KEY \
--region $AWS_REGION

El complemento Secretos externos accederá al secreto y estará disponible como un secreto nativo de Kubernetes en el clúster EKS.

Arranque el entorno AWS CDK

El primer paso para cualquier implementación de AWS CDK es iniciar el entorno. tu usas el cdk bootstrap en la CLI de AWS CDK para preparar el entorno (una combinación de cuenta de AWS y región de AWS) con los recursos requeridos por AWS CDK para realizar implementaciones en ese entorno. El arranque de AWS CDK es necesario para cada combinación de cuenta y región, por lo que si ya inició AWS CDK en una región, no necesita repetir el proceso de arranque.

cdk bootstrap aws://$ACCOUNT_ID/$AWS_REGION

Implementar la solución

Complete los siguientes pasos para implementar la solución:

  1. Clonar el Acelerador de observabilidad cdk-aws repositorio e instalar los paquetes de dependencia. Este repositorio contiene código AWS CDK v2 escrito en TypeScript.
git clone https://github.com/aws-observability/cdk-aws-observability-accelerator.git
cd cdk-aws-observability-accelerator

Se espera que la configuración real de los archivos JSON del panel de Grafana se especifique en el contexto de AWS CDK. Necesitas actualizar context en el cdk.json archivo, ubicado en el directorio actual. La ubicación del tablero está especificada por el fluxRepository.values.GRAFANA_NEURON_DASH_URL parámetro, y neuronNodeGroup se utiliza para establecer el tipo de instancia, el número y Tienda de bloques elásticos de Amazon (Amazon EBS) tamaño utilizado para los nodos.

  1. Ingrese el siguiente fragmento en cdk.jsonreemplazando context:
"context": {
    "fluxRepository": {
      "name": "grafana-dashboards",
      "namespace": "grafana-operator",
      "repository": {
        "repoUrl": "https://github.com/aws-observability/aws-observability-accelerator",
        "name": "grafana-dashboards",
        "targetRevision": "main",
        "path": "./artifacts/grafana-operator-manifests/eks/infrastructure"
      },
      "values": {
        "GRAFANA_CLUSTER_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/cluster.json",
        "GRAFANA_KUBELET_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/kubelet.json",
        "GRAFANA_NSWRKLDS_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/namespace-workloads.json",
        "GRAFANA_NODEEXP_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodeexporter-nodes.json",
        "GRAFANA_NODES_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodes.json",
        "GRAFANA_WORKLOADS_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/workloads.json",
        "GRAFANA_NEURON_DASH_URL" : "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/neuron/neuron-monitor.json"
      },
      "kustomizations": [
        {
          "kustomizationPath": "./artifacts/grafana-operator-manifests/eks/infrastructure"
        },
        {
          "kustomizationPath": "./artifacts/grafana-operator-manifests/eks/neuron"
        }
      ]
    },
     "neuronNodeGroup": {
      "instanceClass": "inf1",
      "instanceSize": "2xlarge",
      "desiredSize": 1, 
      "minSize": 1, 
      "maxSize": 3,
      "ebsSize": 512
    }
  }

Puede reemplazar el tipo de instancia Inf1 con Inf2 y cambiar el tamaño según sea necesario. Para verificar la disponibilidad en su región seleccionada, ejecute el siguiente comando (modificar Values como veas conveniente):

aws ec2 describe-instance-type-offerings \
--filters Name=instance-type,Values="inf1*" \
--query "InstanceTypeOfferings[].InstanceType" \
--region $AWS_REGION

  1. Instale las dependencias del proyecto:
  1. Ejecute los siguientes comandos para implementar el patrón de observabilidad de código abierto:
make build
make pattern single-new-eks-inferentia-opensource-observability deploy

Validar la solución

Complete los siguientes pasos para validar la solución:

  1. Ejecute el update-kubeconfig dominio. Debería poder obtener el comando del mensaje de salida del comando anterior:
aws eks update-kubeconfig --name single-new-eks-inferentia-opensource... --region <your region> --role-arn arn:aws:iam::xxxxxxxxx:role/single-new-eks-....

  1. Verifique los recursos que creó:

La siguiente captura de pantalla muestra nuestro resultado de muestra.

  1. Asegúrate que neuron-device-plugin-daemonset DaemonSet se está ejecutando:
kubectl get ds neuron-device-plugin-daemonset --namespace kube-system

El siguiente es nuestro resultado esperado:

NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
neuron-device-plugin-daemonset   1         1         1       1            1           <none>          2h

  1. Confirme que el neuron-monitor DaemonSet se está ejecutando:
kubectl get ds neuron-monitor --namespace kube-system

El siguiente es nuestro resultado esperado:

NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
neuron-monitor   1         1         1       1            1           <none>          2h

  1. Para verificar que los dispositivos y núcleos de Neuron estén visibles, ejecute el neuron-ls y neuron-top comandos de, por ejemplo, su módulo de monitoreo de neuronas (puede obtener el nombre del módulo de la salida de kubectl get pods -A):
kubectl exec -it {your neuron-monitor pod} -n kube-system -- /bin/bash -c "neuron-ls"

La siguiente captura de pantalla muestra nuestro resultado esperado.

kubectl exec -it {your neuron-monitor pod} -n kube-system -- /bin/bash -c "neuron-top"

La siguiente captura de pantalla muestra nuestro resultado esperado.

Visualice datos utilizando el panel de Grafana Neuron

Inicie sesión en su espacio de trabajo de Amazon Managed Grafana y navegue hasta Paneles de control panel. Deberías ver un panel llamado Neurona / Monitor.

Para ver algunas métricas interesantes en el panel de Grafana, aplicamos el siguiente manifiesto:

curl https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/k8s-deployment-manifest-templates/neuron/pytorch-inference-resnet50.yml | kubectl apply -f -

Esta es una carga de trabajo de muestra que compila el modelo torchvision ResNet50 y ejecuta inferencias repetitivas en un bucle para generar datos de telemetría.

Para verificar que el pod se implementó correctamente, ejecute el siguiente código:

Deberías ver un pod llamado pytorch-inference-resnet50.

Después de unos minutos, mirando hacia el Neurona / Monitor panel, debería ver las métricas recopiladas similares a las siguientes capturas de pantalla.

Grafana Operador y Flux siempre trabajan juntos para sincronizar sus paneles con Git. Si elimina sus paneles por accidente, se reaprovisionarán automáticamente.

Limpiar

Puede eliminar toda la pila de AWS CDK con el siguiente comando:

make pattern single-new-eks-inferentia-opensource-observability destroy

Conclusión

En esta publicación, le mostramos cómo introducir la observabilidad, con herramientas de código abierto, en un clúster EKS que presenta un plano de datos que ejecuta instancias EC2 Inf1. Comenzamos seleccionando la AMI acelerada optimizada para Amazon EKS para los nodos del plano de datos, que incluye el tiempo de ejecución del contenedor Neuron y proporciona acceso a los dispositivos AWS Inferentia y Trainium Neuron. Luego, para exponer los núcleos y dispositivos de Neuron a Kubernetes, implementamos el complemento del dispositivo Neuron. La recopilación y el mapeo reales de datos de telemetría en un formato compatible con Prometheus se lograron a través de neuron-monitor y neuron-monitor-prometheus.py. Las métricas se obtuvieron de Amazon Managed Service for Prometheus y se muestran en el panel de Neuron de Amazon Managed Grafana.

Le recomendamos que explore patrones de observabilidad adicionales en el Acelerador de observabilidad de AWS para CDK Repositorio de GitHub. Para obtener más información sobre Neuron, consulte la Documentación de neuronas de AWS.


Sobre el Autor

Ricardo Freschi es arquitecto sénior de soluciones en AWS y se centra en la modernización de aplicaciones. Trabaja en estrecha colaboración con socios y clientes para ayudarlos a transformar sus entornos de TI en su viaje hacia la nube de AWS mediante la refactorización de aplicaciones existentes y la creación de otras nuevas.