Implemente un punto final de inferencia de ML sin servidor para modelos de lenguaje grandes utilizando FastAPI, AWS Lambda y AWS CDK.

Implement a serverless ML inference endpoint for large language models using FastAPI, AWS Lambda, and AWS CDK.

Para los científicos de datos, mover modelos de aprendizaje automático (ML) desde la prueba de concepto a la producción a menudo presenta un desafío significativo. Uno de los principales desafíos puede ser implementar un modelo entrenado localmente con un buen rendimiento en la nube para inferencia y uso en otras aplicaciones. Puede ser engorroso gestionar el proceso, pero con la herramienta adecuada, puede reducir significativamente el esfuerzo requerido.

Amazon SageMaker Inference, que se lanzó en abril de 2022, facilita la implementación de modelos de ML en producción para hacer predicciones a escala, proporcionando una amplia selección de infraestructura de ML y opciones de implementación de modelos para ayudar a satisfacer todo tipo de necesidades de inferencia de ML. Puede usar los endpoints de SageMaker Serverless Inference para cargas de trabajo que tienen períodos de inactividad entre los picos de tráfico y pueden tolerar los arranques en frío. Los endpoints se escalan automáticamente según el tráfico y eliminan el trabajo pesado no diferenciado de seleccionar y administrar servidores. Además, puede usar AWS Lambda directamente para exponer sus modelos e implementar sus aplicaciones de ML utilizando su marco de código abierto preferido, lo que puede resultar más flexible y rentable.

FastAPI es un marco web moderno y de alto rendimiento para la creación de APIs con Python. Destaca cuando se trata de desarrollar aplicaciones sin servidor con microservicios RESTful y casos de uso que requieren inferencia de ML a escala en múltiples industrias. Su facilidad y funcionalidades incorporadas como la documentación automática de API lo hacen una opción popular entre los ingenieros de ML para implementar APIs de inferencia de alto rendimiento. Puede definir y organizar sus rutas utilizando las funcionalidades integradas de FastAPI para escalar y manejar la lógica empresarial en crecimiento según sea necesario, probar localmente y alojarlo en Lambda, luego exponerlo a través de una única puerta de enlace de API, lo que le permite traer un marco web de código abierto a Lambda sin ningún trabajo pesado o refactorización de su código.

Esta publicación le muestra cómo implementar y ejecutar inferencia de ML sin servidor exponiendo su modelo de ML como un endpoint mediante FastAPI, Docker, Lambda y Amazon API Gateway. También le mostramos cómo automatizar la implementación utilizando el AWS Cloud Development Kit (AWS CDK).

Descripción general de la solución

El siguiente diagrama muestra la arquitectura de la solución que implementamos en esta publicación.

Prerrequisitos

Debe tener los siguientes prerrequisitos:

  • Python3 instalado, junto con virtualenv para crear y administrar entornos virtuales en Python
  • aws-cdk v2 instalado en su sistema para poder usar la CLI de AWS CDK
  • Docker instalado y ejecutándose en su máquina local

Pruebe si tiene todo el software necesario instalado:

  1. Se necesita la Interface de línea de comandos de AWS (AWS CLI). Inicie sesión en su cuenta y elija la región donde desea implementar la solución.

  2. Use el siguiente código para verificar la versión de Python:

    python3 --version
  3. Compruebe si virtualenv está instalado para crear y administrar entornos virtuales en Python. Hablando estrictamente, no es un requisito riguroso, pero hará que su vida sea más fácil y ayudará a seguir esta publicación con mayor facilidad. Use el siguiente código:

    python3 -m virtualenv --version
  4. Compruebe si cdk está instalado. Esto se utilizará para implementar nuestra solución.

    cdk --version
  5. Compruebe si Docker está instalado. Nuestra solución hará que su modelo sea accesible a través de una imagen de Docker a Lambda. Para construir esta imagen localmente, necesitamos Docker.

    docker --version
  6. Asegúrese de que Docker esté en funcionamiento con el siguiente código:

    docker ps

Cómo estructurar su proyecto FastAPI utilizando AWS CDK

Usamos la siguiente estructura de directorios para nuestro proyecto (ignorando parte del código de AWS CDK de plantilla que es irrelevante en el contexto de esta publicación):

```

fastapi_model_serving
│
└───.venv
│
└───fastapi_model_serving
│   │   __init__.py
│   │   fastapi_model_serving_stack.py
│   │
│   └───model_endpoint
│       └───docker
│       │      Dockerfile
│       │      serving_api.tar.gz
│
│
│       └───runtime
│            └───serving_api
│                    requirements.txt
│                    serving_api.py
│                └───custom_lambda_utils
│                     └───model_artifacts
│                            ...
│                     └───scripts
│                            inference.py
│
└───templates
│   └───api
│   │     api.py
│   └───dummy
│         dummy.py
│
│ app.py
│   cdk.json
│   README.md
│   requirements.txt
│   init-lambda-code.sh

```

El directorio sigue la estructura recomendada de proyectos AWS CDK para Python.

La parte más importante de este repositorio es el directorio fastapi_model_serving. Contiene el código que definirá el stack de AWS CDK y los recursos que se utilizarán para la prestación de modelos.

El directorio fastapi_model_serving contiene el subdirectorio model_endpoint, que contiene todos los activos necesarios que conforman nuestro punto final sin servidor, a saber, el Dockerfile para construir la imagen de Docker que Lambda usará, el código de la función Lambda que utiliza FastAPI para manejar solicitudes de inferencia y enrutarlas al punto final correcto, y los artefactos del modelo del modelo que queremos implementar. model_endpoint también contiene lo siguiente:

  • Docker: Este subdirectorio contiene lo siguiente:
  • Dockerfile: Se utiliza para construir la imagen para la función Lambda con todos los artefactos (código de función Lambda, artefactos de modelo, etc.) en el lugar correcto para que se puedan utilizar sin problemas.
  • serving.api.tar.gz: Es un archivo tar que contiene todos los activos de la carpeta de tiempo de ejecución necesarios para construir la imagen de Docker. Discutimos cómo crear el archivo .tar.gz más adelante en este post.
  • runtime: Este subdirectorio contiene lo siguiente:
  • serving_api: El código de la función Lambda y sus dependencias especificadas en el archivo requirements.txt.
  • custom_lambda_utils: Incluye un script de inferencia que carga los artefactos de modelo necesarios para que el modelo se pueda pasar a serving_api que luego lo expondrá como un punto final.

Además, tenemos el directorio de plantillas, que proporciona una plantilla de estructuras de carpetas y archivos donde puede definir sus códigos y APIs personalizados siguiendo la muestra que acabamos de ver. El directorio de plantillas contiene código ficticio que puede utilizar para crear nuevas funciones Lambda:

  • dummy: Contiene el código que implementa la estructura de una función Lambda ordinaria utilizando el tiempo de ejecución de Python.
  • api: Contiene el código que implementa una función Lambda que envuelve un punto final de FastAPI alrededor de una puerta de enlace de API existente.

Implementar la solución

De forma predeterminada, el código se implementa dentro de la región eu-west-1. Si desea cambiar la región, puede cambiar la variable de contexto DEPLOYMENT_REGION en el archivo cdk.json.

Tenga en cuenta, sin embargo, que la solución intenta implementar una función Lambda en la arquitectura arm64, y que esta característica puede no estar disponible en todas las regiones. En este caso, debe cambiar el parámetro de arquitectura en el archivo fastapi_model_serving_stack.py, así como la primera línea del archivo Dockerfile dentro del directorio Docker, para alojar esta solución en la arquitectura x86.

Para implementar la solución, complete los siguientes pasos:

  1. Ejecute el siguiente comando para clonar el repositorio de GitHub: git clone https://github.com/aws-samples/lambda-serverless-inference-fastapi. Como queremos demostrar que la solución puede funcionar con artefactos de modelo que se entrenan localmente, contamos con un artefacto de modelo de muestra de un modelo DistilBERT preentrenado en el Hugging Face model hub para una tarea de respuesta de pregunta en el archivo serving_api.tar.gz. El tiempo de descarga puede tardar alrededor de 3-5 minutos. Ahora, configuremos el entorno.

  2. Descargue el modelo preentrenado que se implementará desde el Hugging Face model hub en el directorio ./model_endpoint/runtime/serving_api/custom_lambda_utils/model_artifacts. También crea un entorno virtual e instala todas las dependencias necesarias. Solo necesita ejecutar este comando una vez: make prep. Este comando puede tardar alrededor de 5 minutos (dependiendo del ancho de banda de su conexión a Internet) porque necesita descargar los artefactos del modelo.

  3. Empaquete los artefactos del modelo dentro de un archivo .tar.gz que se utilizará dentro de la imagen de Docker que se construye en el stack de AWS CDK. Debe ejecutar este código cada vez que realice cambios en los artefactos del modelo o en la API misma para tener siempre la versión más actualizada de su punto final de prestación: make package_model. Todos los artefactos están en su lugar. Ahora podemos implementar el stack de AWS CDK en su cuenta de AWS.

  4. Ejecute cdk bootstrap si es la primera vez que implementa una aplicación AWS CDK en un entorno (combinación de cuenta + región):

    make cdk_bootstrap

    Este stack incluye recursos que se necesitan para la operación del toolkit. Por ejemplo, el stack incluye un bucket de Amazon Simple Storage Service (Amazon S3) que se utiliza para almacenar plantillas y activos durante el proceso de implementación.

    Como estamos creando imágenes de Docker localmente en esta implementación de AWS CDK, debemos asegurarnos de que el daemon de Docker se esté ejecutando antes de que podamos implementar este stack a través de la CLI de AWS CDK.

  5. Para verificar si el daemon de Docker se está ejecutando en su sistema, use el siguiente comando:

    docker ps

    Si no recibe un mensaje de error, debería estar listo para implementar la solución.

  6. Implemente la solución con el siguiente comando:

    make deploy

    Este paso puede tardar alrededor de 5-10 minutos debido a la construcción y el envío de la imagen de Docker.

Solución de problemas

Si eres usuario de Mac, es posible que encuentres un error al iniciar sesión en Amazon Elastic Container Registry (Amazon ECR) con el inicio de sesión de Docker, como Error saving credentials ... not implemented. Por ejemplo:

exited with error code 1: Error saving credentials: error storing credentials - err: exit status 1,...dial unix backend.sock: connect: connection refused

Antes de poder usar Lambda en contenedores Docker dentro de AWS CDK, es posible que debas cambiar el archivo ~/docker/config.json. Más específicamente, es posible que debas cambiar el parámetro credsStore en ~/.docker/config.json a osxkeychain. Eso soluciona los problemas de inicio de sesión de Amazon ECR en un Mac.

Ejecutar inferencia en tiempo real

Después de que tu pila de AWS CloudFormation se haya implementado correctamente, ve a la pestaña Outputs de tu pila en la consola de AWS CloudFormation y abre la URL de punto final. Ahora nuestro modelo es accesible a través de la URL de punto final y estamos listos para ejecutar la inferencia en tiempo real.

Ve a la URL para ver si puedes ver un mensaje de “hola mundo” y agrega /docs a la dirección para ver si puedes ver la página de UI interactiva de swagger con éxito. Puede haber algún tiempo de inicio en frío, así que es posible que debas esperar o actualizar algunas veces.

Después de iniciar sesión en la página de aterrizaje de la página de swagger de FastAPI, puedes ejecutar a través de la raíz / o a través de /question.

Desde /, puedes ejecutar la API y obtener el mensaje de “hola mundo”.

Desde /question, puedes ejecutar la API y ejecutar la inferencia de ML en el modelo que implementamos para un caso de respuesta de pregunta. Por ejemplo, usamos la pregunta ¿Cuál es el color de mi auto ahora? y el contexto es Mi auto solía ser azul pero lo pinté de rojo.

Cuando elijas Ejecutar, en función del contexto dado, el modelo responderá la pregunta con una respuesta, como se muestra en la siguiente captura de pantalla.

En el cuerpo de la respuesta, puedes ver la respuesta con la puntuación de confianza del modelo. También puedes experimentar con otros ejemplos o incrustar la API en tu aplicación existente.

Alternativamente, puedes ejecutar la inferencia a través del código. Aquí hay un ejemplo escrito en Python, usando la biblioteca requests:

import requests

url = "https://<YOUR_API_GATEWAY_ENDPOINT_ID>.execute-api.<YOUR_ENDPOINT_REGION>.amazonaws.com/prod/question?question=\"What is the color of my car now?\"&context=\"My car used to be blue but I painted red\""

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

El código produce una cadena similar a la siguiente:

'{"score":0.6947233080863953,"start":38,"end":41,"answer":"red"}'

Si estás interesado en saber más sobre cómo implementar la inteligencia artificial generativa y los grandes modelos de lenguaje en AWS, revisa aquí:

  • Implementar inteligencia artificial generativa sin servidor en AWS Lambda con OpenLLaMa
  • Implementar grandes modelos de lenguaje en AWS Inferentia2 usando contenedores de inferencia de modelos grandes

Limpieza

Dentro del directorio raíz de tu repositorio, ejecuta el siguiente código para limpiar tus recursos:

make destroy

Conclusión

En este post, presentamos cómo puedes usar Lambda para implementar tu modelo de ML entrenado usando tu framework de aplicación web preferido, como FastAPI. Proporcionamos un repositorio de código detallado que puedes implementar, y mantienes la flexibilidad de cambiar a cualquier artefacto de modelo entrenado que proceses. El rendimiento puede depender de cómo implementes y implementes el modelo.

¡Te invitamos a que lo pruebes tú mismo, y estamos emocionados de escuchar tus comentarios!

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

Apoyando la sostenibilidad, la salud digital y el futuro del trabajo

La Iniciativa de Convergencia MIT y Accenture para la Industria y la Tecnología selecciona tres nuevos proyectos de i...

Inteligencia Artificial

Construyendo una Red Neuronal Convolucional con PyTorch

Esta entrada de blog proporciona un tutorial sobre la construcción de una red neuronal convolucional para la clasific...

Inteligencia Artificial

Este artículo de IA revela DiffEnc Avanzando en los modelos de difusión para mejorar el rendimiento generativo

Los modelos de difusión son modelos poderosos que se destacan en una amplia gama de tareas de generación, como imágen...

Inteligencia Artificial

Desarrollar un ChatGPT específico de la empresa es un tercio tecnología y dos tercios mejoras en los procesos.

A lo largo de 2023, hemos estado desarrollando un asistente virtual basado en el modelo GPT para los empleados de Ene...