Optimizing TensorFlow model serving with Kubernetes and Amazon Elastic Inference

Esta publicación ofrece una inmersión profunda sobre cómo usar Amazon Elastic Inference con Amazon Elastic Kubernetes Service . Cuando combina Elastic Inference con EKS, puede ejecutar cargas de trabajo de inferencia escalables y de bajo costo con su sistema de orquestación de contenedores preferido.

Elastic Inference es una forma cada vez más popular de ejecutar cargas de trabajo de inferencia de bajo costo en AWS. Le permite adjuntar aceleración de bajo costo con GPU a las instancias de Amazon EC2 y Amazon SageMaker para reducir el costo de ejecutar inferencias de aprendizaje profundo hasta en un 75%. Amazon EKS también es cada vez más importante para las empresas de todos los tamaños, desde nuevas empresas hasta empresas, para ejecutar contenedores en AWS. Para aquellos que buscan ejecutar cargas de trabajo de inferencia en un entorno de Kubernetes administrado, el uso de Elastic Inference y EKS juntos abre la puerta para ejecutar estas cargas de trabajo con recursos informáticos acelerados pero de bajo costo.

El ejemplo en esta publicación muestra cómo usar Elastic Inferencia y EKS juntos para ofrecer una solución escalable y de costo optimizado para realizar la detección de objetos en cuadros de video. Más específicamente, hace lo siguiente:

  • Ejecute pods en EKS que leen un video de Amazon S3
  • Fotogramas de video de preproceso
  • Envíe los fotogramas para la detección de objetos a un pod TensorFlow Serving modificado para trabajar con Elastic Inferencia.

Este caso de uso computacionalmente intensivo muestra las ventajas de usar Elastic Inference y EKS para lograr una inferencia acelerada a bajo costo dentro de una arquitectura escalable y en contenedores. Para obtener más información sobre este código, consulte Optimización de cargas de trabajo de inferencia ML escalables con Amazon Elastic Inference y Amazon EKS en GitHub.

Descripción de Elastic Inference

La investigación realizada por AWS indica que la inferencia puede conducir hasta 90 % del costo de ejecutar cargas de trabajo de aprendizaje automático, un porcentaje mucho mayor que los modelos de capacitación. Sin embargo, el uso de una instancia de GPU para inferencia a menudo es un desperdicio porque normalmente no está utilizando la instancia por completo.

Elastic Inference resuelve esto al permitirle conectar la cantidad justa de aceleración de GPU de bajo costo a cualquier Amazon EC2 o Amazon SageMaker Instancia basada en CPU. Esto reduce los costos de inferencia hasta en un 75% porque ya no necesita sobreaprovisionar el cálculo de la GPU para la inferencia.

Puede configurar instancias EC2 o puntos finales de Amazon SageMaker con aceleradores de inferencia elástica utilizando la AWS Management Console , AWS CLI AWS SDK, AWS CloudFormation o Terraform. El lanzamiento de una instancia con Elastic Inference proporciona un acelerador en la misma zona de disponibilidad detrás de un punto final de VPC. El acelerador luego se conecta a la instancia a través de la red. Existen dos requisitos previos:

  • Primero, aprovisione un punto final de AWS PrivateLink VPC para las subredes donde planea lanzar aceleradores.
  • Segundo, proporcione un rol de instancia con una política que permita acciones en aceleradores de inferencia elástica.

Usted También deberá asegurarse de que sus grupos de seguridad estén configurados correctamente para permitir el tráfico hacia y desde el punto final VPC y la instancia. Para obtener más detalles, consulte Configuración para iniciar Amazon EC2 con Elastic Inference .

Las herramientas y marcos de aprendizaje profundo habilitados para Elastic Inference pueden detectar y descargar automáticamente los cálculos del modelo apropiado al acelerador adjunto. Elastic Inference es compatible con los modelos TensorFlow, Apache MXNet y ONNX, con más marcos próximamente. Si es usuario de PyTorch, puede convertir sus modelos al formato ONNX para permitir el uso de Elastic Inference. El ejemplo en esta publicación utiliza TensorFlow.

Descripción general de EKS

Kubernetes es un software de código abierto que le permite implementar y administrar aplicaciones en contenedores a escala. Kubernetes agrupa los contenedores en agrupaciones lógicas para la gestión y la capacidad de detección, luego los lanza en grupos de instancias EC2. EKS facilita la implementación, administración y escala de aplicaciones en contenedores usando Kubernetes en AWS.

Más específicamente, EKS aprovisiona, administra y escala el plano de control de Kubernetes por usted. En un nivel alto, Kubernetes consta de dos componentes principales: un grupo de nodos de trabajo que ejecutan sus contenedores, y el plano de control que administra cuándo y dónde los contenedores comienzan en su cluster y monitorea su estado.

Sin EKS, debe ejecute el plano de control de Kubernetes y el grupo de nodos de trabajo usted mismo. Al manejar el plano de control por usted, EKS elimina una carga operativa sustancial para ejecutar Kubernetes y le permite concentrarse en crear su aplicación en lugar de administrar la infraestructura.

Además, EKS es seguro de manera predeterminada y ejecuta la infraestructura de administración de Kubernetes en Múltiples zonas de disponibilidad para eliminar un solo punto de falla. EKS cuenta con la certificación de Kubernetes para que pueda utilizar las herramientas y complementos existentes de socios y la comunidad de Kubernetes. Las aplicaciones que se ejecutan en cualquier entorno Kubernetes estándar son totalmente compatibles, y puede migrarlas fácilmente a EKS.

Integración de la inferencia elástica con EKS

El ejemplo de esta publicación implica realizar la detección de objetos en cuadros de video. Estos cuadros se extraen de videos almacenados en S3. El siguiente diagrama muestra la arquitectura general:

Contenedor de nodo de inferencia con TensorFlow Serving y soporte de inferencia elástica

TensorFlow Serving (TFS) es la forma preferida de servir los modelos TensorFlow. En consecuencia, el primer paso en esta solución es construir un contenedor de inferencia con TFS y soporte de inferencia elástica. AWS proporciona un binario TFS modificado para Elastic Inference. Las versiones del binario están disponibles para varias versiones diferentes de TFS, así como para Apache MXNet. Para obtener más información y enlaces a los binarios, consulte Amazon Elastic Inference Basics .

En esta solución, la inferencia Dockerfile obtiene el binario TFS modificado de S3 y lo instala, junto con un modelo de detección de objetos. El modelo es una variante de MobileNet entrenado en el conjunto de datos COCO, publicado en el Zoológico modelo de detección de Tensorflow . El Dockerfile completo está disponible en el amazon-elastic-inference-eks repositorio GitHub, bajo el directorio / Dockerfile_tf_serving .

Contenedor de nodo estándar

Además de un contenedor de inferencia con TFS con Elastic Inference habilitado y un modelo de detección de objetos, también necesita un contenedor de nodo estándar separado que realice la mayor parte de las tareas de la aplicación y obtenga predicciones del contenedor de inferencia. Como resumen de nivel superior, este contenedor de nodo estándar realiza las siguientes tareas:

  • Sondea una cola Amazon SQS para mensajes sobre la disponibilidad de videos.
  • Obtiene el siguiente video disponible de S3.
  • Convierte el video en fotogramas individuales.
  • Agrupa algunos de los fotogramas y envía los fotogramas por lotes al contenedor del servidor modelo para inferencia.
  • Procesa las predicciones devueltas.

El único aspecto del código que no es Es sencillo la necesidad de habilitar la protección de terminación de instancia EC2 mientras los trabajadores procesan videos, como se muestra en el siguiente ejemplo de código:

 ec2.modify_instance_attribute (
    InstanceId = instancia_id,
    DisableApiTermination = {'Value': True},
) 

Después de que el trabajo procesa, una llamada API similar deshabilita la protección de terminación. Esta aplicación de ejemplo utiliza la protección de terminación porque los trabajos son de larga duración y no desea que una instancia de EC2 finalice durante un evento de escala si aún está procesando un video.

Puede modificar fácilmente el código de inferencia y optimizar para su caso de uso, por lo que esta publicación no pasa más tiempo examinándola. Para revisar el Dockerfile para el código de inferencia, consulte el amazon-elastic-inference-eks repositorio de GitHub, en el directorio / Dockerfile . El código en sí está en el archivo test.py.

Detalles del clúster de Kubernetes

El clúster EKS implementado en la plantilla de CloudFormation de muestra contiene dos grupos de nodos distintos de forma predeterminada.

Un grupo de nodos contiene instancias M5 que actualmente son la última generación de instancias de uso general. Y el otro grupo de nodos contiene instancias C5 que actualmente son la última generación de instancias optimizadas para cómputo . Las instancias en el grupo de nodos C5 tienen un único acelerador de inferencia elástica adjunto.

Actualmente, Kubernetes no programa vainas utilizando aceleradores de inferencia elástica. En consecuencia, este ejemplo utiliza etiquetas y selectores de Kubernetes para distribuir la carga de trabajo de inferencia a los recursos en el clúster con aceleradores de inferencia elásticos conectados.

Más específicamente, para minimizar la complejidad de programar el acceso al acelerador de inferencia elástica , los pods de aplicación e inferencia se implementan como un DaemonSet con un selector, lo que garantiza que cada nodo con una etiqueta definida ejecute una copia de la aplicación y la inferencia en la instancia.

La aplicación de muestra extrae metadatos de trabajo de la cola SQS y luego procesa cada uno secuencialmente, por lo que no debe preocuparse por los múltiples procesos que interactúan con el acelerador de inferencia elástica.

Además, el clúster desplegado contiene un Auto Scaling grupo que escala los nodos en la entrada / salida del grupo de inferencia en función de la profundidad aproximada de la cola SQS. El escalado automático ayuda a mantener el grupo de nodos de inferencia dimensionado adecuadamente para mantener los costos lo más bajo posible. Dependiendo de su carga de trabajo, también podría considerar usar Instancias puntuales para mantener sus costos bajos.

Actualmente, las métricas de SQS se actualizan cada cinco minutos, por lo que puede activar una función AWS Lambda usando Eventos de CloudWatch una vez por minuto para consultar directamente la profundidad de la cola y actualizar una métrica personalizada de CloudWatch.

Iniciando con AWS CloudFormation

Para crear los recursos descritos en esta publicación, debe ejecutar varios comandos de AWS CLI. Obtener más información sobre cómo ejecutar y ejecutar estos recursos, consulte el archivo Makefile asociado en GitHub. Para obtener instrucciones para crear estos recursos utilizando una plantilla de CloudFormation, consulte el archivo README en el repositorio de GitHub.

Comparación de costos

Finalmente, puede ver cuánto ahorró en costos al usar Elastic Inference en lugar de que una instancia de GPU completa.

Por defecto, esta solución utiliza una instancia de CPU del tipo c5.large con un acelerador adjunto del tipo eia1.medium para los nodos de inferencia.

El precio actual bajo demanda para esos recursos es de $ 0.085 por hora, más $ 0.130 por hora, para un total de $ 0.215 por hora. El costo total en comparación con el precio de la instancia de GPU de generación actual más pequeña es la siguiente:

  • Solución de inferencia elástica – $ 0.215 por hora
  • Instancia de GPU p3.2xlarge – $ 3.06 por hora

Para resumir, la solución de inferencia elástica el costo es inferior al 10% del costo de usar una instancia de GPU completa.

A pesar de su costo mucho más bajo, la solución de inferencia elástica en estas pruebas puede hacer inferencia en tiempo real, procesando video a una velocidad de casi 30 cuadros por segundo .

Este resultado es impresionante, especialmente teniendo en cuenta que hay espacio para optimizar aún más el código. Para obtener más información sobre la comparación de costos de Elastic Inference versus GPU, consulte Optimización de costos en Amazon Elastic Inference con TensorFlow .

Para lograr ahorros de costos aún mayores, puede usar instancias puntuales para las instancias de CPU para obtener hasta un 90% de descuento para esas instancias en comparación con los precios bajo demanda.

Conclusión

La inferencia elástica permite la inferencia acelerada de bajo costo, y EKS facilita la ejecución de Kubernetes en AWS. Puede combinar los dos para crear una solución potente y de bajo contacto para ejecutar cargas de trabajo de inferencia aceleradas de bajo costo en un clúster de Kubernetes administrado, escalable y altamente disponible.

Muchas variaciones de esta solución son posibles en AWS. Por ejemplo, en lugar de usar EKS, puede usar Amazon ECS otro servicio de orquestación de contenedores administrados en AWS.

Alternativamente, puede ejecutar el plano de control de Kubernetes usted mismo directamente en EC2, o ejecutar contenedores directamente en EC2 sin Kubernetes.

La decisión es tuya. AWS le permite crear la arquitectura que mejor se adapte a su caso de uso, herramientas y preferencias de flujo de trabajo.

Para comenzar, vaya a Consola CloudFormation y cree una pila usando la plantilla CloudFormation para esta publicación de blog.

Solución de ejemplo. Los detalles se pueden encontrar en la Lanzamiento con AWS CloudFormation sección anterior, y en el repositorio de GitHub relacionado vinculado allí.

Dejá un comentario