Blog de Amazon Web Services (AWS)
Ensamblado de modelos de machine learning sin servidor con Amazon SageMaker & AWS StepFunctions
Por Maximiliano Paz, Startup Solutions Architect en AWS
Breve reseña
En este blog voy a mostrar como hacer ensamblado de modelos (ejecutar más de un modelo para lograr mayor certeza en una inferencia) de manera serverless, aplicando lógica durante la orquestración, y ejecutando un proceso de aprobación manual en casos de baja certeza.
Servicios
Amazon API Gateway – servicio que permite crear, escalar y mantener APIs completamente administrado.
AWS Step Functions – servicio para crear flujos de trabajo automatizados, orquestrando procesos y ejecuciones en máquinas de estado.
Amazon Sagemaker – servicio que permite construir, entrenar y publicar modelos de ML.
AWS Lambda – servicio para ejecutar codigo sin servidor
Amazon SNS – servicio de notificaciones Pub/Sub.
Amazon DynamoDB – servicio de base de datos NoSQL sin servidor.
Paso a paso de la solución
Vamos a usar Amazon API Gateway para empezar la ejecución sincrónica de la máquina de estados en AWS Step Functions.
La máquina de estados realiza la siguientes actividades:
- Recibir el ingreso de información desde la llamada de API (input)
- Enviar el input a una función de AWS Lambda que va a realizar la inferencia y devolver un resultado parcial
- Comparar el resultado parcial con el límite incluido para elegir el camino apropiado:
- terminar el proceso porque la inferencia superó el límite, y devolver el resultado a la API
- enviar el input a otro modelo para una nueva inferencia
- En el segundo caso, la máquina de estado va a llamar a Amazon Sagemaker de manera directa (sin enviar el input a AWS Lambda como en el paso anterior) usando una llamada de API de Amazon Sagemaker, y va a recibir el resultado de la inferencia.
- Comparar el nuevo resultado con el límite establecido en ese paso y en base a eso:
- Envíar un mensaje a Amazon SNS con el contenido de la inferencia parcial y la notificacion que el proceso manual fue iniciado; iniciar una nueva máquina de estados para realizar una aprobación manual y terminar la llamada de API notificando al solicitante del mismo
- Comparar el valor de la inferencia para mapear el resultado (vale aclarar que el modelo devuelve números que son transformados a valores) haciendo una llamada directa a una tabla en Amazon DynamoDB, transformar el resultado de la base de datos y agregar el valor de certeza de la inferencia y devolver esto al cliente.
En este blog voy a utilizar un modelo de machine learning creado en un blog anterior con Amazon Sagemaker Autopilot https://aws.amazon.com/es/blogs/aws-spanish/como-entrenar-un-modelo-de-machine-learning-para-reconocer-cosecha-con-aws-earth-sagemaker-autopilot/, y voy a usar otro modelo creado con el mismo dataset en Amazon Sagemaker con el algoritmo Xgboost.
Para el proceso de aprobación manual, esta solución de AWS simplifica la creación de la máquina de estados y todos los recursos necesarios -> https://aws.amazon.com/es/blogs/compute/implementing-serverless-manual-approval-steps-in-aws-step-functions-and-amazon-api-gateway/
Esquema de arquitectura
Prueba de ejecución
Para hacer la llamada a API Gateway necesitamos incluir los datos de la inferencia y un nombre de referencia de ejecucion para la máquina de estados, nuestra API va a utilizar esto para realizar la llamada sincrónica
En este caso voy a usar el siguiente script de Python para realizar la llamada:
La configuración en Amazon API Gateway para ejecutar una máquina de estados es la siguiente:
Y por ultimo configuramos un mapping template que incluya el nombre de la máquina de estados, y como enviar los datos a la misma:
Vale aclarar que Amazon API Gateway necesita un rol que tenga permisos para iniciar una ejecución.
Una vez iniciada la ejecución, verificamos que el ingreso de datos sea el correcto:
Vemos que la función AWS Lambda (misma función que figura en el post anterior) fue ejecutada con el payload incial.
Confirmamos el resultado de la función de lambda:
Con esa información (Payload) tomamos nuestra decisión:
En este caso, considerando que la primer inferencia devolvio un valor inferior a 90% de certeza, vamos a realizar una inferencia con el segundo modelo:
Necesitamos separar los valores devueltos por el modelo en un string, y para esto usamos la funcion de AWS Step Functions ResultSelector. Posteriormente asignamos cada valor a una variable usando Funciones intrínsecas de AWS Step Functions.
Revisamos el resultado:
En este caso, como la inferencia es mayor al limite vamos a buscar en la tabla “Granos” de Amazon DynamoDB cual es el nombre que corresponde al valor “1”, que es el resultado de la inferencia.
Y revisamos el resultado devuelto por Amazon DynamoDB:
Finalmente en el último paso, mapeamos los resultados de la inferencia y de AWS DynamoDB para poder devolver los valores a la llamada de API:
Y viendo esto desde donde inciamos la llamada:
Verificamos que la respuesta sincrónica de la llamada incluye:
Tiempo facturado en Milisegundos (2900) y cantidad de memoria en MBs (64)
El mensaje con el resultado de nuestra inferencia.
En los logs de ejecucion de step functions se puede confirmar el tiempo que tardo cada paso en inciarse, ejecutarse y finalizar.
La inferencia en el endpoint serverless de Amazon Sagemaker tarda menos de 100ms en responder, que las decisiones (si bien simples) se toman de manera instantánea y que la llamada a Amazon DynamoDB tarda menos de 40ms.
En el caso que ambas inferencias fueran menores a los limites establecidos, se ejecutaría otro camino de decision, que empieza por notificar a un topico de Amazon SNS.
Ese tópico de SNS tiene como unico subscriptor una casilla de mail y la máquina de estados envía tanto el mensaje como variables de los procesos anteriores.
Ejemplo de mail:
Posteriormente iniciamos una segunda máquina de estados, va a ser de tipo “Standard” ya que una de las diferencias entre ambas es duración: la Express dura como máximo 5 minutos de tiempo de ejecución, mientras que la Standard puede durar hasta 365 dias (Comparación entre tipos de máquinas de estado)
Esta máquina de estado es más sencilla, y pueden ver como funciona en el siguiente link a la documentación oficial de AWS Step Functions en el que van a encontrar una template de AWS CloudFormation.
El ultimo paso responde la llamada de API sincrónica:
Limpieza
Eliminar desde la consola tanto el API Gateway creado, como la máquina de estados.
Para borrar la máquina de estados que realiza el proceso de aprobación manual proceder a eliminar el stack de AWS CloudFormation
Conclusión
Nuestros procesos de ensamblado de modelos pueden ser realizados de manera sincrónica y con servicios completamente administrados sin servidor manteniendo tiempos de respuesta, bajando los costos y simplificando el mantenimiento de los mismos.
Acerca de lo autor
Maximiliano Paz, Startup Solutions Architect en AWS