Construye una solución centralizada de monitoreo e informes para Amazon SageMaker utilizando Amazon CloudWatch

Crear una solución de monitoreo e informes centralizada para Amazon SageMaker con Amazon CloudWatch.

Amazon SageMaker es una plataforma de aprendizaje automático (ML) totalmente gestionada que ofrece un conjunto completo de servicios que sirven para cargas de trabajo de ML de extremo a extremo. Como se recomienda AWS como una mejor práctica, los clientes han utilizado cuentas separadas para simplificar la gestión de políticas para los usuarios y aislar los recursos por cargas de trabajo y cuenta. Sin embargo, cuando más usuarios y equipos utilizan la plataforma de ML en la nube, monitorear las grandes cargas de trabajo de ML en un entorno de múltiples cuentas escalables se vuelve más desafiante. Para una mejor observabilidad, los clientes buscan soluciones para monitorear el uso de recursos entre cuentas y rastrear actividades, como el lanzamiento de trabajos y el estado de ejecución, que son esenciales para sus requisitos de gobierno y gestión de ML.

Los servicios de SageMaker, como Procesamiento, Entrenamiento y Hospedaje, recopilan métricas y registros de las instancias en ejecución y los envían a las cuentas de Amazon CloudWatch de los usuarios. Para ver los detalles de estos trabajos en diferentes cuentas, es necesario iniciar sesión en cada cuenta, encontrar los trabajos correspondientes y revisar su estado. No hay una única interfaz que muestre de manera fácil esta información de múltiples trabajos y cuentas. Además, el equipo de administración en la nube debe proporcionar a los individuos acceso a diferentes cuentas de trabajo de SageMaker, lo que agrega una carga adicional de gestión para el equipo de la plataforma en la nube.

En esta publicación, presentamos un panel de observabilidad entre cuentas que proporciona una vista centralizada para monitorear las actividades y recursos de usuario de SageMaker en varias cuentas. Permite a los usuarios finales y al equipo de gestión en la nube monitorear eficientemente las cargas de trabajo de ML en ejecución, ver el estado de estas cargas de trabajo y rastrear las actividades de diferentes cuentas en determinados momentos. Con este panel, no es necesario navegar desde la consola de SageMaker y hacer clic en cada trabajo para encontrar los detalles de los registros del trabajo. En su lugar, puede ver fácilmente los trabajos en ejecución y su estado, solucionar problemas con los trabajos y configurar alertas cuando se identifiquen problemas en cuentas compartidas, como fallas en los trabajos o recursos infrautilizados, entre otros. También puede controlar el acceso a este panel de monitoreo centralizado o compartirlo con las autoridades relevantes para fines de auditoría y gestión.

Descripción general de la solución

Esta solución está diseñada para permitir el monitoreo centralizado de trabajos y actividades de SageMaker en un entorno de varias cuentas. La solución está diseñada para no depender de AWS Organizations, pero se puede adoptar fácilmente en un entorno de Organizations o AWS Control Tower. Esta solución puede ayudar al equipo de operaciones a tener una vista de alto nivel de todas las cargas de trabajo de SageMaker distribuidas en varias cuentas de trabajo desde una única interfaz. También tiene la opción de habilitar la observabilidad entre cuentas de CloudWatch en las cuentas de trabajo de SageMaker para proporcionar acceso a telemetría de monitoreo, como métricas, registros y trazas desde la cuenta de monitoreo centralizada. Se muestra un ejemplo de panel en la siguiente captura de pantalla.

El siguiente diagrama muestra la arquitectura de esta solución de panel centralizada.

SageMaker tiene integración nativa con Amazon EventBridge, que monitorea eventos de cambio de estado en SageMaker. EventBridge le permite automatizar SageMaker y responder automáticamente a eventos como un cambio de estado de un trabajo de entrenamiento o un cambio de estado de un punto de enlace. Los eventos de SageMaker se entregan a EventBridge en tiempo casi real. Para obtener más información sobre los eventos de SageMaker monitoreados por EventBridge, consulte Automatización de Amazon SageMaker con Amazon EventBridge. Además de los eventos nativos de SageMaker, AWS CloudTrail publica eventos cuando realiza llamadas de API, que también se transmiten a EventBridge para que puedan ser utilizados por muchos casos de uso de automatización o monitoreo aguas abajo. En nuestra solución, utilizamos reglas de EventBridge en las cuentas de trabajo para transmitir eventos de servicios de SageMaker y eventos de API a la cola de eventos de la cuenta de monitoreo para monitoreo centralizado.

En la cuenta de monitoreo centralizada, los eventos son capturados por una regla de EventBridge y posteriormente procesados en diferentes destinos:

  • Un grupo de registros de CloudWatch, para usar en lo siguiente:
    • Fines de auditoría y archivo. Para obtener más información, consulte la Guía del usuario de Amazon CloudWatch Logs.
    • Análisis de datos de registro con consultas de CloudWatch Log Insights. CloudWatch Logs Insights le permite buscar y analizar de forma interactiva sus datos de registro en CloudWatch Logs. Puede realizar consultas para ayudarlo a responder de manera más eficiente y efectiva a problemas operativos. Si ocurre un problema, puede usar CloudWatch Logs Insights para identificar posibles causas y validar las soluciones implementadas.
    • Soporte para el widget de consulta de métricas de CloudWatch en el panel de control de CloudWatch, agregar consulta de CloudWatch Insights a paneles y exportar resultados de consultas.
  • Una función de AWS Lambda para realizar las siguientes tareas:
    • Ejecutar lógica personalizada para complementar eventos de servicios de SageMaker. Un ejemplo es realizar una consulta de métricas en las métricas de utilización del host del trabajo de SageMaker cuando se recibe un evento de finalización del trabajo.
    • Convertir la información del evento en métricas en ciertos formatos de registro que se ingieren como registros EMF. Para obtener más información, consulte Incrustación de métricas dentro de registros.

El ejemplo en esta publicación está respaldado por la función de observabilidad intercuentas nativa de CloudWatch para lograr acceso a métricas, registros y trazas entre cuentas. Como se muestra en la parte inferior del diagrama de arquitectura, se integra con esta función para habilitar métricas y registros intercuentas. Para habilitar esto, es necesario crear permisos y recursos necesarios tanto en las cuentas de monitoreo como en las cuentas de carga de trabajo fuente.

Puede utilizar esta solución tanto para las cuentas de AWS gestionadas por Organizaciones como para las cuentas independientes. Las siguientes secciones explican los pasos para cada escenario. Tenga en cuenta que dentro de cada escenario, los pasos se realizan en diferentes cuentas de AWS. Para su conveniencia, se resalta el tipo de cuenta para realizar el paso al comienzo de cada paso.

Prerrequisitos

Antes de comenzar este procedimiento, clone nuestro código fuente desde el repositorio de GitHub en su entorno local o AWS Cloud9. Además, necesita lo siguiente:

  • Node.js 14.15.0 (o posterior) y nmp instalados
  • La Interfaz de línea de comandos de AWS (AWS CLI) versión 2 instalada
  • El Conjunto de herramientas AWS CDK
  • Motor de Docker instalado (en estado de ejecución al realizar los procedimientos de implementación)

Implementar la solución en un entorno de Organizaciones

Si la cuenta de monitoreo y todas las cuentas de carga de trabajo de SageMaker están en la misma organización, la infraestructura requerida en las cuentas de carga de trabajo fuente se crea automáticamente a través de un conjunto de pilas de AWS CloudFormation desde la cuenta de administración de la organización. Por lo tanto, no se requiere una implementación manual de infraestructura en las cuentas de carga de trabajo fuente. Cuando se crea una cuenta nueva o se mueve una cuenta existente a una unidad organizativa (OU) objetivo, la pila de infraestructura de carga de trabajo fuente se implementará automáticamente e se incluirá en el ámbito del monitoreo centralizado.

Configurar los recursos de la cuenta de monitoreo

Necesitamos recopilar la siguiente información de la cuenta de AWS para configurar los recursos de la cuenta de monitoreo, que utilizamos como entradas para el script de configuración más adelante.

Entrada Descripción Ejemplo
Región de inicio La región donde se ejecutan las cargas de trabajo. ap-southeast-2
Nombre de perfil de AWS CLI de la cuenta de monitoreo Puede encontrar el nombre del perfil en ~/.aws/config. Esto es opcional. Si no se proporciona, se utilizan las credenciales de AWS predeterminadas de la cadena. .
Ruta de la unidad organizativa de carga de trabajo de SageMaker La ruta de la OU que tiene las cuentas de carga de trabajo de SageMaker. Mantenga la / al final de la ruta. o-1a2b3c4d5e/r-saaa/ou-saaa-1a2b3c4d/

Para recuperar la ruta de la OU, puede ir a la consola de Organizaciones y, en Cuentas de AWS, encontrar la información para construir la ruta de la OU. Para el siguiente ejemplo, la ruta de OU correspondiente es o-ye3wn3kyh6/r-taql/ou-taql-wu7296by/.

Después de recuperar esta información, ejecute el siguiente comando para implementar los recursos requeridos en la cuenta de monitoreo:

./scripts/organization-deployment/deploy-monitoring-account.sh

Puede obtener las siguientes salidas de la implementación. Tome nota de las salidas para usarlas en el próximo paso al implementar la pila de la cuenta de administración.

Configurar recursos de la cuenta de administración

Necesitamos recopilar la siguiente información de la cuenta de AWS para configurar los recursos de la cuenta de administración, que utilizamos como entradas para el script de configuración más adelante.

Entrada Descripción Ejemplo
Región principal La región donde se ejecutan las cargas de trabajo. Debe ser la misma que la pila de monitoreo. ap-southeast-2
Nombre del perfil de AWS CLI de la cuenta de administración Puede encontrar el nombre del perfil en ~/.aws/config. Esto es opcional. Si no se proporciona, utiliza las credenciales de AWS predeterminadas de la cadena. .
ID de la OU de la carga de trabajo de SageMaker Aquí utilizamos solo el ID de la OU, no la ruta. ou-saaa-1a2b3c4d
ID de la cuenta de monitoreo El ID de la cuenta donde se implementa la pila de monitoreo. .
Nombre del rol de la cuenta de monitoreo La salida de MonitoringAccountRoleName del paso anterior. .
ARN del bus de eventos de la cuenta de monitoreo La salida de MonitoringAccountEventbusARN del paso anterior. .
Identificador de sink de la cuenta de monitoreo La salida de MonitoringAccountSinkIdentifier del paso anterior. .

Puede implementar los recursos de la cuenta de administración ejecutando el siguiente comando:

./scripts/organization-deployment/deploy-management-account.sh

Implementar la solución en un entorno sin Organizaciones

Si su entorno no utiliza Organizaciones, la pila de infraestructura de la cuenta de monitoreo se implementa de manera similar pero con algunos cambios. Sin embargo, la pila de infraestructura de la carga de trabajo debe implementarse manualmente en cada cuenta de carga de trabajo. Por lo tanto, este método es adecuado para un entorno con un número limitado de cuentas. Para un entorno grande, se recomienda considerar el uso de Organizaciones.

Configurar recursos de la cuenta de monitoreo

Necesitamos recopilar la siguiente información de la cuenta de AWS para configurar los recursos de la cuenta de monitoreo, que utilizamos como entradas para el script de configuración más adelante.

Entrada Descripción Ejemplo
Región principal La región donde se ejecutan las cargas de trabajo. ap-southeast-2
Lista de cuentas de carga de trabajo de SageMaker Una lista de cuentas que ejecutan la carga de trabajo de SageMaker y transmiten eventos a la cuenta de monitoreo, separadas por comas. 111111111111,222222222222
Nombre del perfil de AWS CLI de la cuenta de monitoreo Puede encontrar el nombre del perfil en ~/.aws/config. Esto es opcional. Si no se proporciona, utiliza las credenciales de AWS predeterminadas de la cadena. .

Podemos implementar los recursos de la cuenta de monitoreo ejecutando el siguiente comando después de recopilar la información necesaria:

./scripts/individual-deployment/deploy-monitoring-account.sh

Obtenemos las siguientes salidas cuando se completa la implementación. Tome nota de las salidas para usar en el siguiente paso al implementar la pila de la cuenta de administración.

Configurar la infraestructura de monitoreo de la cuenta de carga de trabajo

Necesitamos recopilar la siguiente información de la cuenta de AWS para configurar la infraestructura de monitoreo de la cuenta de carga de trabajo, que utilizaremos como entradas para el script de configuración más adelante.

Entrada Descripción Ejemplo
Región de inicio La región donde se ejecutan las cargas de trabajo. Debe ser la misma que la pila de monitoreo. ap-southeast-2
ID de cuenta de monitoreo El ID de cuenta donde se implementa la pila de monitoreo. .
Nombre de rol de cuenta de monitoreo La salida para MonitoringAccountRoleName del paso anterior. .
ARN de bus de eventos de cuenta de monitoreo La salida para MonitoringAccountEventbusARN del paso anterior. .
Identificador de destino de cuenta de monitoreo La salida de MonitoringAccountSinkIdentifier del paso anterior. .
Nombre de perfil de AWS CLI de la cuenta de carga de trabajo Puede encontrar el nombre del perfil en ~/.aws/config. Esto es opcional. Si no se proporciona, utiliza las credenciales de AWS predeterminadas de la cadena. .

Podemos implementar los recursos de la cuenta de monitoreo ejecutando el siguiente comando:

./scripts/individual-deployment/deploy-workload-account.sh

Visualizar las tareas de ML en el panel de control de CloudWatch

Para comprobar si la solución funciona, debemos ejecutar múltiples trabajos de procesamiento de SageMaker y trabajos de entrenamiento de SageMaker en las cuentas de carga de trabajo que utilizamos en las secciones anteriores. El panel de control de CloudWatch es personalizable según sus propios escenarios. Nuestro panel de control de muestra consta de widgets para visualizar los trabajos de procesamiento de SageMaker y los trabajos de entrenamiento de SageMaker. Todos los trabajos de las cuentas de carga de trabajo se muestran en este panel. En cada tipo de trabajo, mostramos tres widgets, que son el número total de trabajos, el número de trabajos fallidos y los detalles de cada trabajo. En nuestro ejemplo, tenemos dos cuentas de carga de trabajo. A través de este panel, podemos encontrar fácilmente que una cuenta de carga de trabajo tiene tanto trabajos de procesamiento como trabajos de entrenamiento, y otra cuenta de carga de trabajo solo tiene trabajos de entrenamiento. Al igual que con las funciones que utilizamos en CloudWatch, podemos establecer el intervalo de actualización, especificar el tipo de gráfico y hacer zoom o acercamiento, o podemos ejecutar acciones como descargar registros en un archivo CSV.

Personalizar su panel de control

La solución proporcionada en el repositorio de GitHub incluye el monitoreo tanto de los trabajos de entrenamiento de SageMaker como de los trabajos de procesamiento de SageMaker. Si desea agregar más paneles de control para monitorear otros trabajos de SageMaker, como trabajos de transformación por lotes, puede seguir las instrucciones de esta sección para personalizar su panel de control. Modificando el archivo index.py, puede personalizar los campos que desea mostrar en el panel de control. Puede acceder a todos los detalles capturados por CloudWatch a través de EventBridge. En la función Lambda, puede elegir los campos necesarios que desea mostrar en el panel de control. Vea el siguiente código:

@metric_scope
def lambda_handler(event, context, metrics):
    
    try:
        event_type = None
        try:
            event_type = SAGEMAKER_STAGE_CHANGE_EVENT(event["detail-type"])
        except ValueError as e:
            print("Evento inesperado recibido")

        if event_type:
            account = event["account"]
            detail = event["detail"]

            job_detail = {
                "Consulta del panel de control": "Verdadero"
            }
            job_detail["Cuenta"] = account
            job_detail["Tipo de trabajo"] = event_type.name


            metrics.set_dimensions({"cuenta": account, "tipoDeTrabajo": event_type.name}, use_default=False)
            metrics.set_property("TipoDeTrabajo", event_type.value)
            
            if event_type == SAGEMAKER_STAGE_CHANGE_EVENT.PROCESSING_JOB:
                job_status = detail.get("ProcessingJobStatus")

                metrics.set_property("NombreDeTrabajo", detail.get("ProcessingJobName"))
                metrics.set_property("ARNDeTrabajoDeProcesamiento", detail.get("ProcessingJobArn"))

                job_detail["NombreDeTrabajo"]  = detail.get("ProcessingJobName")
                job_detail["ARNDeTrabajoDeProcesamiento"] = detail.get("ProcessingJobArn")
                job_detail["Estado"] = job_status
                job_detail["HoraDeInicio"] = detail.get("ProcessingStartTime")
                job_detail["TipoDeInstancia"] = detail.get("ProcessingResources").get("ClusterConfig").get("InstanceType")
                job_detail["CantidadDeInstancias"] = detail.get("ProcessingResources").get("ClusterConfig").get("InstanceCount")
                if detail.get("FailureReason"):

Para personalizar el panel de control o los widgets, puedes modificar el código fuente en el archivo monitoring-account-infra-stack.ts. Ten en cuenta que los nombres de campo que utilices en este archivo deben ser los mismos que los (las claves de job_detail) definidos en el archivo Lambda:

 // Panel de control de CloudWatch
    const sagemakerMonitoringDashboard = new cloudwatch.Dashboard(
      this, 'sagemakerMonitoringDashboard',
      {
        dashboardName: Parameters.DASHBOARD_NAME,
        widgets: []
      }
    )

    // Trabajo de procesamiento
    const processingJobCountWidget = new cloudwatch.GraphWidget({
      title: "Recuento total de trabajos de procesamiento",
      stacked: false,
      width: 12,
      height: 6,
      left:[
        new cloudwatch.MathExpression({
          expression: `SEARCH('{${AWS_EMF_NAMESPACE},account,jobType} jobType="PROCESSING_JOB" MetricName="ProcessingJobCount_Total"', 'Sum', 300)`,
          searchRegion: this.region,
          label: "${PROP('Dim.account')}",
        })
      ]
    });
    processingJobCountWidget.position(0,0)
    const processingJobFailedWidget = new cloudwatch.GraphWidget({
      title: "Recuento de trabajos de procesamiento fallidos",
      stacked: false,
      width: 12,
      height:6,
      right:[
        new cloudwatch.MathExpression({
          expression: `SEARCH('{${AWS_EMF_NAMESPACE},account,jobType} jobType="PROCESSING_JOB" MetricName="ProcessingJobCount_Failed"', 'Sum', 300)`,
          searchRegion: this.region,
          label: "${PROP('Dim.account')}",
        })
      ]
    })
    processingJobFailedWidget.position(12,0)
    
    const processingJobInsightsQueryWidget = new cloudwatch.LogQueryWidget(
      {
        title: 'Historial de trabajos de procesamiento de SageMaker',
        logGroupNames: [ingesterLambda.logGroup.logGroupName],
        view: cloudwatch.LogQueryVisualizationType.TABLE,
        queryLines: [
          'sort @timestamp desc',
          'filter DashboardQuery == "True"',
          'filter JobType == "PROCESSING_JOB"',
          'fields Account, JobName, Status, Duration, InstanceCount, InstanceType, Host, fromMillis(StartTime) as StartTime, FailureReason',
          'fields Metrics.CPUUtilization as CPUUtil, Metrics.DiskUtilization as DiskUtil, Metrics.MemoryUtilization as MemoryUtil',
          'fields Metrics.GPUMemoryUtilization as GPUMemoeyUtil, Metrics.GPUUtilization as GPUUtil',
        ],
        width:24,
        height: 6,
      }
    );
    processingJobInsightsQueryWidget.position(0, 6)
    sagemakerMonitoringDashboard.addWidgets(processingJobCountWidget);
    sagemakerMonitoringDashboard.addWidgets(processingJobFailedWidget);
    sagemakerMonitoringDashboard.addWidgets(processingJobInsightsQueryWidget);

Después de modificar el panel de control, debes volver a implementar esta solución desde cero. Puedes ejecutar el cuaderno Jupyter proporcionado en el repositorio de GitHub para volver a ejecutar el pipeline de SageMaker, lo que lanzará nuevamente los trabajos de procesamiento de SageMaker. Cuando los trabajos hayan terminado, puedes ir a la consola de CloudWatch y, en el panel de navegación, seleccionar Paneles de control y luego Paneles de control personalizados. Ahí podrás encontrar el panel de control llamado SageMaker-Monitoring-Dashboard.

Limpieza

Si ya no necesitas este panel de control personalizado, puedes eliminar los recursos. Para eliminar todos los recursos creados, utiliza el código de esta sección. La limpieza es ligeramente diferente para un entorno de Organizaciones frente a un entorno no Organizaciones.

Para un entorno de Organizaciones, utiliza el siguiente código:

make destroy-management-stackset # Ejecutar en la cuenta de administración
make destroy-monitoring-account-infra # Ejecutar en la cuenta de monitoreo

Para un entorno que no es de Organizaciones, utiliza el siguiente código:

make destroy-workload-account-infra # Ejecutar en cada cuenta de carga de trabajo
make destroy-monitoring-account-infra # Ejecutar en la cuenta de monitoreo

Alternativamente, puedes iniciar sesión en la cuenta de monitoreo, la cuenta de carga de trabajo y la cuenta de administración para eliminar las pilas desde la consola de CloudFormation.

Conclusión

En esta publicación, se discutió la implementación de una solución centralizada de monitoreo e informes para SageMaker utilizando CloudWatch. Siguiendo las instrucciones paso a paso descritas en esta publicación, puedes crear un panel de control de monitoreo multi cuenta que muestra métricas clave y consolida registros relacionados con varios trabajos de SageMaker de diferentes cuentas en tiempo real. Con este panel de control de monitoreo centralizado, puedes tener una mejor visibilidad de las actividades de los trabajos de SageMaker en varias cuentas, solucionar problemas más rápidamente y tomar decisiones informadas basadas en datos en tiempo real. En general, la implementación de una solución de monitoreo e informes centralizada utilizando CloudWatch ofrece una forma eficiente para que las organizaciones administren su infraestructura de aprendizaje automático basada en la nube y la utilización de recursos.

Por favor, pruebe la solución y envíenos sus comentarios, ya sea en el foro de AWS para Amazon SageMaker o a través de sus contactos habituales de AWS.

Para obtener más información sobre la función de observabilidad entre cuentas, consulte el blog Amazon CloudWatch Cross-Account Observability.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Los ajustes de privacidad de Zoom avivan el temor de que sus llamadas se utilicen para entrenar a la IA

Zoom también dijo que, no obstante los usos mencionados en sus reglas, no utilizará contenido del cliente de audio, v...

Inteligencia Artificial

Cómo Nexusflow's NexusRaven-V2 supera a GPT-4 en su propio juego!

En el paisaje en constante evolución de la inteligencia artificial, ha surgido un nuevo contendiente que desafía la d...

Inteligencia Artificial

Meet LLMWare Un marco de Inteligencia Artificial todo en uno para agilizar el desarrollo de aplicaciones basadas en LLM para aplicaciones de IA generativa

A pesar del gran interés en los Modelos de Lenguaje Grande LLM (por sus siglas en inglés) durante el último año, much...

Inteligencia Artificial

Nvidia está probando una IA generativa para sus ingenieros

Bill Dally de Nvidia dijo que la empresa está probando si puede aumentar la productividad de sus diseñadores de chips...