Optimice sus trabajos de inferencia mediante la inferencia dinámica por lotes con TorchServe en Amazon SageMaker

Nodo de origen: 1884601

En el aprendizaje profundo, el procesamiento por lotes se refiere a introducir múltiples entradas en un modelo. Si bien es esencial durante el entrenamiento, también puede ser muy útil para administrar el costo y optimizar el rendimiento durante el tiempo de inferencia. Los aceleradores de hardware están optimizados para el paralelismo, y el procesamiento por lotes ayuda a saturar la capacidad informática y, a menudo, conduce a un mayor rendimiento.

El procesamiento por lotes puede ser útil en varios escenarios durante la implementación del modelo en producción. Aquí los categorizamos ampliamente en dos casos de uso:

  • Aplicaciones en tiempo real donde se reciben varias solicitudes de inferencia de diferentes clientes y se procesan dinámicamente por lotes y se alimentan al modelo de servicio. La latencia suele ser importante en estos casos de uso.
  • Aplicaciones fuera de línea donde varias entradas o solicitudes se procesan por lotes en el lado del cliente y se envían al modelo de servicio. Con frecuencia, el objetivo de estos casos de uso es un mayor rendimiento, lo que ayuda a administrar el costo. Ejemplos de casos de uso incluyen análisis de video y evaluación de modelos.

Amazon SageMaker proporciona dos opciones populares para sus trabajos de inferencia. Para las aplicaciones en tiempo real, SageMaker Hosting utiliza TorchServe como la biblioteca de servicio de back-end que maneja el procesamiento por lotes dinámico de las solicitudes recibidas. Para las aplicaciones sin conexión, puede utilizar los trabajos de transformación por lotes de SageMaker. En esta publicación, analizamos un ejemplo de cada opción para ayudarlo a comenzar.

Debido a que TorchServe es nativo integrado con SageMaker mediante el Kit de herramientas de inferencia SageMaker PyTorch, puede implementar fácilmente un modelo de PyTorch en TorchServe utilizando SageMaker Hosting. También puede haber momentos en los que necesite personalizar aún más su entorno utilizando imágenes de Docker personalizadas. En esta publicación, primero mostramos cómo implementar un punto final en tiempo real utilizando el kit de herramientas de inferencia SageMaker PyTorch nativo y configurar el tamaño del lote para optimizar el rendimiento. En el segundo ejemplo, demostramos cómo usar una imagen de Docker personalizada para configurar configuraciones avanzadas de TorchServe que no están disponibles como una variable de entorno para optimizar su trabajo de inferencia por lotes.

Prácticas recomendadas para la inferencia por lotes

El procesamiento por lotes puede aumentar el rendimiento y optimizar sus recursos porque ayuda a completar una mayor cantidad de inferencias en un cierto período de tiempo a expensas de la latencia. Para optimizar la implementación del modelo para un mayor rendimiento, la pauta general es aumentar el tamaño del lote hasta que el rendimiento disminuya. Por lo general, esto se adapta a las aplicaciones fuera de línea, donde se agrupan varias entradas (como cuadros de video, imágenes o texto) para obtener resultados de predicción.

Para las aplicaciones en tiempo real, la latencia suele ser una de las principales preocupaciones. Existe una compensación entre un mayor rendimiento y un mayor tamaño de lote y latencia; es posible que deba realizar ajustes según sea necesario para cumplir con su SLA de latencia. En cuanto a las mejores prácticas en la nube, el costo por una cierta cantidad de inferencias es una guía útil para tomar una decisión informada que satisfaga las necesidades de su negocio. Un factor que contribuye a la gestión de costes es la elección del acelerador adecuado. Para más información, ver Elija el mejor acelerador de IA y compilación de modelos para la inferencia de visión por computadora con Amazon SageMaker.

TorchServe procesamiento por lotes dinámico en SageMaker

AntorchaServir es la biblioteca PyTorch nativa para servir modelos en producción a escala. Es un desarrollo conjunto de Facebook y AWS. TorchServe le permite monitorear, agregar métricas personalizadas, admitir múltiples modelos, escalar hacia arriba y hacia abajo la cantidad de trabajadores a través de API de administración segura y proporcionar puntos finales de inferencia y explicación.

Para admitir el procesamiento por lotes, TorchServe proporciona una función de procesamiento por lotes dinámico. Agrega las solicitudes recibidas dentro de un marco de tiempo específico, las agrupa y envía el lote para la inferencia. Las solicitudes recibidas son procesadas a través del manipuladores en TorchServe. TorchServe tiene varios controladores predeterminados y puede crear un controlador personalizado si su caso de uso no está cubierto. Cuando utilice un controlador personalizado, asegúrese de que la lógica de inferencia por lotes se haya implementado en el controlador. Un ejemplo de un controlador personalizado con soporte de inferencia por lotes está disponible en GitHub.

Puede configurar el procesamiento por lotes dinámico usando dos configuraciones, batch_size y max_batch_delay, ya sea a través de variables de entorno en SageMaker o a través de la config.properties archivo en TorchServe (si usa un contenedor personalizado). TorchServe usa cualquiera de las configuraciones que vienen primero, ya sea el tamaño máximo de lote (batch_size) o ventana de tiempo especificada para esperar el lote de solicitudes a través de max_batch_delay.

Con las integraciones de TorchServe con SageMaker, ahora puede implementar modelos PyTorch de forma nativa en SageMaker, donde puede definir un modelo SageMaker PyTorch. Puede agregar la carga, la inferencia y la lógica de preprocesamiento y posprocesamiento de modelos personalizados en una secuencia de comandos pasada como punto de entrada a SageMaker PyTorch (consulte el siguiente código de ejemplo). Como alternativa, puede usar un contenedor personalizado para implementar sus modelos. Para más información, ver El servidor de modelos SageMaker PyTorch.

Puede establecer el tamaño del lote para los modelos de PyTorch en SageMaker a través de variables de entorno. Si elige usar un contenedor personalizado, puede agrupar ajustes in config.properties con su modelo al empaquetar su modelo en TorchServe. El siguiente fragmento de código muestra un ejemplo de cómo configurar el tamaño del lote mediante variables de entorno y cómo implementar un modelo de PyTorch en SageMaker:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

En el fragmento de código, model_artifact hace referencia a todos los archivos necesarios para volver a cargar el modelo entrenado, que se archiva en un archivo .tar y se inserta en un Servicio de almacenamiento simple de Amazon (Amazon S3) cubeta. El inference.py es similar al controlador personalizado de TorchServe; tiene varias funciones que puede anular para acomodar la inicialización del modelo, el procesamiento previo y posterior de las solicitudes recibidas y la lógica de inferencia.

Las siguientes cuaderno muestra un ejemplo completo de la implementación de un modelo BERT Hugging Face.

Si necesita un contenedor personalizado, puede crear una imagen de contenedor personalizado y enviarla al Registro de contenedores elásticos de Amazon (Amazon ECR) repositorio. El artefacto del modelo en este caso puede ser un archivo .mar de TorchServe que agrupa los artefactos del modelo junto con el controlador. Demostramos esto en la siguiente sección, donde usamos un trabajo de transformación por lotes de SageMaker.

Trabajo de transformación por lotes de SageMaker

Para los casos de uso sin conexión en los que las solicitudes se procesan por lotes desde una fuente de datos, como un conjunto de datos, SageMaker proporciona trabajos de transformación por lotes. Estos trabajos le permiten leer datos de un depósito de S3 y escribir los resultados en un depósito de S3 de destino. Para más información, ver Utilice la transformación por lotes para obtener inferencias de grandes conjuntos de datos. Un ejemplo completo de inferencia por lotes utilizando trabajos de transformación por lotes se puede encontrar en el siguiente cuaderno, donde utilizamos un modelo de traducción automática del concurso FLORES. En este ejemplo, mostramos cómo usar un contenedor personalizado para calificar nuestro modelo usando SageMaker. El uso de un contenedor de inferencia personalizado le permite personalizar aún más su configuración de TorchServe. En este ejemplo, queremos cambiar y deshabilitar la decodificación JSON, lo que podemos hacer a través de TorchServe config.properties archivo.

Al usar un controlador personalizado para TorchServe, debemos asegurarnos de que el controlador implemente la lógica de inferencia por lotes. Cada controlador puede tener funciones personalizadas para realizar preprocesamiento, inferencia y posprocesamiento. Un ejemplo de un controlador personalizado con soporte de inferencia por lotes está disponible en GitHub.

Usamos nuestro contenedor personalizado para agrupar los artefactos del modelo con el controlador como lo hacemos en TorchServe (hacer un archivo .mar). También necesitamos un punto de entrada al contenedor Docker que inicie TorchServe con el tamaño de lote y la decodificación JSON establecida en config.properties. Lo demostramos en el ejemplo. cuaderno.

El trabajo de transformación por lotes de SageMaker requiere acceso a los archivos de entrada desde un depósito de S3, donde divide los archivos de entrada en mini lotes y los envía para la inferencia. Tenga en cuenta los siguientes puntos al configurar el trabajo de transformación por lotes:

  • Coloque los archivos de entrada (como un conjunto de datos) en un depósito S3 y configúrelo como fuente de datos en la configuración del trabajo.
  • Asigne un depósito de S3 en el que guardar los resultados del trabajo de transformación por lotes.
  • Set Estrategia por lotes a MultiRecord y SplitType a Line si necesita el trabajo de transformación por lotes para hacer mini lotes a partir del archivo de entrada. Si no puede dividir automáticamente el conjunto de datos en mini lotes, puede dividirlo en mini lotes colocando cada lote en un archivo de entrada separado, ubicado en el depósito S3 de la fuente de datos.
  • Asegúrese de que el tamaño del lote se ajuste a la memoria. SageMaker generalmente maneja esto automáticamente; sin embargo, al dividir lotes manualmente, esto debe ajustarse en función de la memoria.

El código siguiente es un ejemplo de un trabajo de transformación por lotes:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

Cuando usamos la configuración anterior e iniciamos nuestro trabajo de transformación, lee los archivos de entrada del depósito S3 de origen en lotes y los envía para la inferencia. Los resultados se vuelven a escribir en el depósito de S3 especificado en las salidas.

El siguiente fragmento de código muestra cómo crear e iniciar un trabajo utilizando la configuración anterior:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

Conclusión

En esta publicación, revisamos los dos modos que ofrece SageMaker para la inferencia en línea y fuera de línea. El primero utiliza el procesamiento por lotes dinámico provisto en TorchServe para procesar por lotes las solicitudes de varios clientes. Este último utiliza un trabajo de transformación de SageMaker para procesar por lotes las solicitudes de los archivos de entrada en un depósito de S3 y ejecutar la inferencia.

También mostramos cómo servir modelos en SageMaker usando imágenes nativas de contenedores del kit de herramientas de inferencia de SageMaker PyTorch y cómo usar contenedores personalizados para casos de uso que requieren ajustes de configuración avanzados de TorchServe.

A medida que TorchServe continúa evolucionando para abordar las necesidades de la comunidad de PyTorch, se integran nuevas funciones en SageMaker para brindar formas eficientes de servir modelos en producción. Para obtener más información, consulte el TorchServe repositorio de GitHub y del Ejemplos de SageMaker.


Acerca de los autores

phi nguyen es un arquitecto de soluciones en AWS que ayuda a los clientes en su viaje a la nube con un enfoque especial en el lago de datos, análisis, tecnologías semánticas y aprendizaje automático. En su tiempo libre, puede encontrarlo yendo en bicicleta al trabajo, entrenando al equipo de fútbol de su hijo o disfrutando de un paseo por la naturaleza con su familia.

Nikhil Kulkarni es un desarrollador de software con AWS Machine Learning, que se enfoca en hacer que las cargas de trabajo de aprendizaje automático tengan más rendimiento en la nube y es cocreador de AWS Deep Learning Containers para capacitación e inferencia. Le apasionan los sistemas de aprendizaje profundo distribuidos. Fuera del trabajo, le gusta leer libros, tocar la guitarra y hacer pizza.

Hamid Shojanazeri es un ingeniero asociado en Pytorch que trabaja en la optimización y el servicio de modelos de alto rendimiento de OSS. Hamid tiene un doctorado en visión por computadora y trabajó como investigador en laboratorios multimedia en Australia, Malasia y líder de PNL en Opus.ai. Le gusta encontrar soluciones más simples a problemas difíciles y es un entusiasta del arte en su tiempo libre.

Geeta Chauhan lidera AI Partner Engineering en Meta AI con experiencia en la construcción de plataformas distribuidas a gran escala resistentes y anti-frágiles para nuevas empresas y Fortune 500. Su equipo trabaja con socios estratégicos, líderes de aprendizaje automático en toda la industria y todos los principales proveedores de servicios en la nube para crear y lanzar nuevos servicios y experiencias de productos de IA; y lleva los modelos de PyTorch de la investigación a la producción. Es ganadora de Women in IT - Silicon Valley - CTO del año 2019, oradora distinguida de ACM y líder de pensamiento en temas que van desde la ética en IA, aprendizaje profundo, Blockchain, IoT. Le apasiona promover el uso de AI for Good.

Fuente: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

Sello de tiempo:

Mas de Blog de aprendizaje automático de AWS