Después de haber entrenado y exportado un modelo TensorFlow puede usar Amazon SageMaker para realizar inferencias usando su modelo.
Puede:
- Implementar su modelo en un punto final para obtener inferencias en tiempo real de su modelo.
- Use la transformación por lotes para obtener inferencias en un conjunto de datos completo almacenado en Amazon S3 .
En el caso de la transformación por lotes, cada vez es más necesario realizar una inferencia por lotes rápida y optimizada en grandes conjuntos de datos.
En esta publicación, aprenderá cómo usar la transformación por lotes de Amazon SageMaker para realizar inferencias en grandes conjuntos de datos.
El ejemplo en esta publicación utiliza un contenedor TensorFlow Serving (TFS) para hacer inferencia por lotes en un gran conjunto de datos de imágenes.
También puede ver cómo usar la nueva función de procesamiento previo y posterior del contenedor TFS de Amazon SageMaker. Esta característica permite que su modelo TensorFlow haga inferencias directamente en datos en S3 y también guarde inferencias procesadas posteriormente en S3.
Descripción general
El conjunto de datos en este ejemplo es el “ Desafío 2018/2019 ” subconjunto del Open Images V5 Dataset . Este subconjunto consta de 100.000 imágenes en formato JPG para un total de 10 GB.
El modelo que utiliza es un modelo de clasificación de imágenes basado en la arquitectura ResNet-50 que ha sido entrenado en el conjunto de datos de ImageNet y exportado como un TensorFlow SavedModel .
Use este modelo para predecir la clase de cada imagen (por ejemplo, barco, automóvil, pájaro). Usted escribe una secuencia de comandos de procesamiento previo y posterior y la empaqueta con el Modelo Guardado para realizar inferencias de manera rápida, eficiente y a escala.
Tutorial
Cuando ejecuta un trabajo de transformación por lotes, especifique:
- Donde los datos de entrada se almacenan
- Qué objeto de modelo de Amazon SageMaker (denominado “Modelo”) se usará para transformar sus datos
- El número de instancias de clúster que se usarán para su trabajo de transformación por lotes
En nuestro caso de uso, un objeto Modelo es un servidor HTTP que sirve un artefacto modelo entrenado, un modelo guardado de TensorFlow, a través del contenedor TFS de Amazon SageMaker. La transformación por lotes de Amazon SageMaker distribuye sus datos de entrada entre las instancias.
Para cada instancia en el clúster, la transformación por lotes de Amazon SageMaker envía solicitudes HTTP para inferencias que contienen datos de entrada de S3 al Modelo. La transformación por lotes de Amazon SageMaker guarda estas inferencias nuevamente en S3.
Los datos a menudo deben convertirse de un formato a otro antes de que puedan pasar a un modelo para predicciones.
Por ejemplo, las imágenes pueden estar en formato PNG o JPG, pero deben convertirse a un formato que el modelo pueda aceptar. Además, a veces se debe realizar otro preprocesamiento de los datos, como el cambio de tamaño de las imágenes.
Usando la nueva función de procesamiento previo y posterior del contenedor Amazon SageMaker TFS, puede convertir fácilmente los datos que tiene en S3 (como datos de imagen sin procesar) en una solicitud TFS. Su TensorFlow SavedModel puede usar esta solicitud de inferencia.
Esto es lo que sucede:
- Su código de procesamiento previo se ejecuta en un servidor HTTP dentro del contenedor TFS y procesa las solicitudes entrantes antes de enviarlas a una instancia de TFS dentro del mismo contenedor.
- Su código de procesamiento posterior procesa las respuestas de TFS antes se guardan en S3.
El siguiente diagrama ilustra esta solución.
Realización de inferencias en datos de imágenes en bruto con una transformación por lotes de Amazon SageMaker
Estos son los tres pasos necesarios para la implementación: [19659017] Escriba una secuencia de comandos de procesamiento previo y posterior para datos de entrada JPEG.
- Empaquete un modelo para datos de entrada JPEG.
- Ejecute un trabajo de transformación por lotes de Amazon SageMaker para datos de entrada JPEG.
Para escribir un pre– y secuencia de comandos de procesamiento posterior para datos de entrada JPEG
Para hacer inferencias, primero debe procesar previamente los datos de su imagen en S3 para que coincidan con la firma de publicación de su TensorFlow SavedModel que puede inspeccionar utilizando el saved_model_c li
. La siguiente es la firma de publicación del modelo ResNet-50 v2 (NCHW, JPEG) :
El contenedor TFS de Amazon SageMaker utiliza el SignatureDef del modelo llamado serving_default
que se declara cuando se exporta el TensorFlow SavedModel.
Este SignatureDef dice que el modelo acepta una cadena de longitud arbitraria como entrada y responde con clases y sus probabilidades.
Con su modelo de clasificación de imágenes, la cadena de entrada es una cadena codificada en base64 que representa una imagen JPEG, que decodifica su modelo guardado.
El script de Python que utiliza para el procesamiento previo y posterior, inference.py
se reproduce de la siguiente manera:
El input_handler
intercepta las solicitudes de inferencia, base64 codifica el cuerpo de la solicitud y formatea el cuerpo de la solicitud para conforme a la TFS REST API .
El valor de retorno de la función input_handler
se utiliza como el cuerpo de la solicitud en la solicitud de TensorFlow Serving. Los datos binarios deben usar la clave “b64”, de acuerdo con la TFS REST API .
Debido a que el tensor de entrada de su firma de servicio tiene el sufijo “_bytes”, los datos de imagen codificados bajo la clave “b64” se pasan a el tensor “image_bytes”.
Algunas firmas de servicio pueden aceptar un tensor de flotantes o enteros en lugar de una cadena codificada en base64.
Sin embargo, para datos binarios (incluidos datos de imagen), su modelo debe aceptar una cadena codificada en base64 para datos binarios porque las representaciones JSON de datos binarios pueden ser grandes.
Cada solicitud entrante originalmente contiene una imagen JPEG serializada en su cuerpo de solicitud. Después de pasar por el input_handler
el cuerpo de la solicitud contiene lo siguiente, que TFS acepta para inferencia:
El primer campo en el valor de retorno de output_handler
es lo que la transformación por lotes de Amazon SageMaker guarda en S3 como la predicción de este ejemplo. En este caso, output_handler
pasa el contenido a S3 sin modificar.
Pre y postprocesamiento las funciones le permiten realizar inferencias con TFS en cualquier formato de datos, no solo en imágenes. Para obtener más información sobre input_handler
y output_handler
consulte Amazon SageMaker TFS Container README
Empaquetando un modelo para datos de entrada JPEG
Después de escribir una secuencia de comandos de procesamiento previo y posterior, empaquete su modelo guardado TensorFlow junto con su secuencia de comandos en un archivo model.tar.gz
.
Luego, cargue el archivo en S3 para que lo use el contenedor TFS de Amazon SageMaker.
El siguiente es un ejemplo de un modelo empaquetado:
El número 1538687370
se refiere al número de versión del modelo de SavedModel, y este directorio contiene sus artefactos SavedModel.
El directorio del código contiene su script de pre y postprocesamiento, que debe llamarse inference.py
.
También contiene un archivo opcional require.txt
que se utiliza para instalar dependencias (con pip
) desde el índice del paquete Python antes de que comience el trabajo de transformación por lotes. En este caso de uso, no necesita dependencias adicionales.
Para empaquetar su modelo guardado y su código, cree un archivo tar GZIP llamado model.tar.gz
ejecutando el siguiente comando:
tar -czvf model.tar.gz código –directory = resnet_v2_fp32_savedmodel_NCHW_jpg 1538687370
Utilice este model.tar.gz
cuando cree un objeto Modelo para ejecutar trabajos de transformación por lotes. Para obtener más información sobre cómo empaquetar un modelo, consulte el README del Contenedor TFS de Amazon SageMaker .
Después de crear un paquete de artefactos modelo, cargue su model.tar.gz
y cree un objeto Modelo que se refiere a su artefacto modelo empaquetado y al contenedor Amazon SageMaker TFS. Especifique que está ejecutando en la Región us-west-2
utilizando instancias TFS 1.13.1 y GPU.
Los siguientes ejemplos de código utilizan la CLI de AWS, que es útil para crear scripts de canalizaciones automáticas y Amazon SageMaker Python SDK .
Sin embargo, puede crear modelos y trabajos de transformación por lotes de Amazon SageMaker utilizando cualquier SDK de AWS.
AWS CLI
Amazon SageMaker Python SDK
Ejecutando un trabajo de transformación de Amazon SageMaker para datos de entrada JPEG
Ahora, use el objeto Modelo que creó para ejecutar predicciones por lotes con la transformación por lotes de Amazon SageMaker. Especifique los datos de entrada S3, el tipo de contenido de los datos de entrada, el depósito S3 de salida y el tipo de instancia y el recuento.
Debe especificar dos parámetros adicionales que afectan el rendimiento: max-payload-in-mb
y max-concurrent-transforms
.
El parámetro max-payload-in-mb
determina cuán grandes pueden ser las cargas útiles de solicitud al enviar solicitudes a su modelo. Debido a que el objeto más grande en su entrada S3 es menor a un megabyte, establezca este parámetro en 1.
El parámetro max-concurrent-transforms
determina cuántas solicitudes concurrentes enviar a su modelo. El valor que maximiza el rendimiento varía según su modelo y datos de entrada. Para esta publicación, se estableció en 64 después de experimentar con potencias de dos.
AWS CLI
Amazon SageMaker Python SDK
Sus datos de entrada consisten en 100,000 imágenes JPEG. La ruta de datos de entrada S3 se ve así:
En las pruebas, el trabajo de transformación por lotes terminó de transformar las 100.000 imágenes en 12 minutos en dos ml.p3.2xlarge
instancias. Puede escalar fácilmente sus trabajos de transformación por lotes para manejar conjuntos de datos más grandes o ejecutarlos más rápido aumentando el recuento de instancias.
Después de que se complete el trabajo de transformación por lotes, inspeccione la salida. En su ruta de salida, encontrará un objeto S3 por objeto en la entrada:
Al inspeccionar uno de los objetos de salida, puede ver la predicción del modelo:
Entonces, así es como obtener inferencias en un conjunto de datos que consiste en imágenes JPEG. En algunos casos, es posible que haya convertido sus datos a TFRecords para capacitación o para codificar múltiples vectores de características en un solo registro. La siguiente sección muestra cómo realizar inferencia por lotes con TFRecords.
Realización de inferencias en un conjunto de datos TFRecord con una transformación por lotes de Amazon SageMaker
TFRecord es un formato de ajuste de registros comúnmente utilizado con TensorFlow para almacenar múltiples instancias de tf. Ejemplo
. Con TFRecord, puede almacenar múltiples imágenes (u otros datos binarios) en un solo objeto S3, junto con anotaciones y otros metadatos.
La transformación por lotes de Amazon SageMaker puede dividir un objeto S3 por el delimitador TFRecord, permitiéndole realizar inferencias en un ejemplo a la vez o en lotes de ejemplos.
Usar la transformación por lotes de Amazon SageMaker para realizar inferencia en datos TFRecord es similar a realizar inferencia directamente en datos de imagen, según el ejemplo anterior en esta publicación.
Para escribir un script de procesamiento previo y posterior para datos TFRecord
Suponga que Usted convirtió los datos de imagen utilizados anteriormente al formato TFRecord. En lugar de realizar inferencia en 100,000 objetos de imagen S3 separados.
Realice inferencia en 100 objetos S3, cada uno con 1000 imágenes agrupadas como un archivo TFRecord. Las imágenes se almacenan en la clave “imagen / codificada” en un tf. Ejemplo
y estos tf.
Los ejemplos se envuelven en el formato TFRecord. Podemos realizar inferencias en estos TFRecords y emitirlos en cualquier formato de datos, como JSON o CSV.
Ahora, dígale a Amazon SageMaker transformación por lotes que divida cada objeto por un encabezado TFRecord y haga inferencia en un solo registro a la vez, de modo que cada solicitud contenga un tf.Ejemplo serializado
. Utilice el siguiente script de preprocesamiento y posprocesamiento para realizar la inferencia:
Su manejador de entrada extrae los datos de la imagen del valor almacenado en la clave “imagen / codificada” del ejemplo. Luego, base64 codifica los datos de la imagen para inferencia en TFS, tal como en el ejemplo anterior para los datos de entrada JPEG.
Cada objeto de salida contiene 1000 predicciones (una por imagen en el objeto de entrada). Estas predicciones se ordenan de la misma manera que en el objeto de entrada.
Su output_handler
elimina el espacio en blanco de la cadena con formato JSON de salida que representa cada predicción TFS. De esta manera, el objeto S3 de salida puede adherirse al formato JSONLines, lo que facilita su análisis. Más tarde, configure su trabajo de transformación por lotes para unir cada registro con un carácter de nueva línea.
El script de preprocesamiento requiere dependencias adicionales para analizar los datos de entrada. Agregue una dependencia de TensorFlow al archivo require.txt
en el ejemplo anterior para que pueda analizar las instancias serializadas de tf. Ejemplo
:
Para empaquetar un modelo para datos de entrada TFRecord
Vuelva a crear su model.tar.gz
para contener su nuevo script de preprocesamiento y luego cree un nuevo objeto Modelo que apunte al nuevo model.tar.gz
. Este paso es idéntico al ejemplo anterior para los datos de entrada JPEG, así que consulte esa sección para obtener más detalles.
Para ejecutar un trabajo de transformación por lotes de Amazon SageMaker para datos de entrada TFRecord
Ahora ejecute un trabajo de transformación por lotes contra archivos TFRecord que contengan las imágenes:
AWS CLI
Amazon SDK Python SageMaker “16” “50000”
El comando es casi idéntico al del ejemplo anterior para datos de entrada JPEG, con algunas diferencias notables:
- Usted especifica SplitType como ” TFRecord “. Este es el delimitador que utiliza la transformación por lotes de Amazon SageMaker. Otros delimitadores compatibles son “Línea” para los caracteres de nueva línea y “RecordIO” para el formato de datos RecordIO .
- Usted especifica BatchStrategy como “SingleRecord” (en lugar de “MultiRecord”). Esto significa que se envía un registro a la vez al modelo después de dividirlo por el delimitador TFRecord. En este caso, elija “SingleRecord” para evitar tener que quitar los registros del encabezado TFRecord en su script de preprocesamiento. Si elige “MultiRecord”, cada solicitud enviada a su modelo contiene hasta 1 MB de registros (ya que eligió MaxPayloadInMB para que sea 1 MB).
- Usted especifica AssembleWith como “Line”. Esto le indica a su trabajo de transformación por lotes que reúna las predicciones individuales en cada objeto mediante caracteres de nueva línea en lugar de concatenarlos.
- Usted especifica las variables de entorno que se pasarán al contenedor de Amazon SageMaker TFS. Estas variables de entorno particulares permiten el procesamiento por lotes de solicitudes, una función TFS que permite agrupar registros de múltiples solicitudes. El parámetro MaxConcurrentTransforms se incrementa a 100, ya que TFS pone en cola lotes de solicitudes. El procesamiento por lotes de solicitudes es una característica avanzada que, cuando se configura correctamente, puede mejorar significativamente el rendimiento, especialmente en instancias habilitadas para GPU. Para obtener más información sobre cómo configurar el procesamiento por lotes de solicitudes, consulte Contenedor TFS de Amazon SageMaker
Sus datos de entrada S3 constaban de 100 objetos correspondientes a archivos TFRecord:
Su trabajo de transformación por lotes en las imágenes en formato TFRecord debería finalizar en aproximadamente 8 minutos en dos ml.p3.2xlarge
instancias con el procesamiento por lotes de solicitudes habilitado. Ahora, su ruta de datos de salida S3 consta de un objeto de salida para cada uno de los 100 objetos de entrada:
Cada objeto en la salida sigue el formato JSONLines y contiene 1000 líneas, con cada línea que contiene la salida TFS para una imagen:
Para cada archivo, el orden de las imágenes en la salida sigue siendo el mismo que en la entrada. En otras palabras, la primera imagen de cada archivo de entrada corresponde a la primera línea del archivo de salida correspondiente, la segunda imagen a la segunda línea, etc.
Conclusión
La transformación por lotes de Amazon SageMaker puede transformar grandes conjuntos de datos rápidamente y a escala. Viste cómo usar el contenedor Amazon SageMaker TFS para realizar inferencias con instancias aceleradas por GPU en datos de imagen y archivos TFRecord.
Mientras que el contenedor Amazon SageMaker TFS admite datos CSV y JSON listos para usar, su La nueva función de procesamiento previo y posterior también le permite ejecutar trabajos de transformación por lotes en datos de cualquier formato.
El mismo contenedor también se puede utilizar para la inferencia en tiempo real, utilizando un punto final del modelo alojado en Amazon SageMaker.
Nuestro ejemplo en el texto de la publicación de blog anterior utiliza el conjunto de datos Open Images.
Sin embargo, hemos puesto a disposición varios ejemplos para satisfacer sus limitaciones de tiempo, caso de uso y flujo de trabajo preferido.
Están disponibles en GitHub (haga clic en los enlaces a continuación) y en las instancias del cuaderno SageMaker.
- Ejemplo CIFAR-10 : el conjunto de datos CIFAR-10 es mucho más pequeño que Open Images, por lo que este ejemplo está destinado a un demostración rápida de las características anteriores.
- Ejemplo de imágenes abiertas, datos de imagen : este ejemplo utiliza el conjunto de datos de imágenes abiertas y realiza inferencia en archivos de imágenes sin procesar. Hay dos versiones disponibles: una usa el SDK de SageMaker Python, mientras que la otra usa la CLI de AWS.
- Ejemplo de Open Images, TFRecord data : este ejemplo usa el conjunto de datos Open Images y realiza inferencia sobre los datos almacenados en el formato binario TensorFlow, TFRecord. Hay dos versiones disponibles: una usa el SDK de SageMaker Python, mientras que la otra usa la CLI de AWS.
Para comenzar con estos ejemplos, vaya a Consola Amazon SageMaker y cree una instancia de computadora portátil SageMaker o abrir uno existente. Luego vaya a la pestaña Ejemplos de SageMaker y seleccione los ejemplos relevantes del menú desplegable Transformación por lotes de SageMaker .