Blog de Amazon Web Services (AWS)
Creación de un flujo de trabajo de etiquetado, entrenamiento e implementación de aprendizaje automático con Amazon SageMaker, PyTorch y Amazon SageMaker Ground Truth
Por Evandro Franco, Arquitecto de Soluciones en Startups en AWS
Amazon SageMaker es un servicio de aprendizaje automático (ML) totalmente administrado en el que los científicos y desarrolladores de datos pueden crear y entrenar modelos de aprendizaje automático de forma rápida y sencilla e implementarlos en un ambiente administrado, listo para producción.
Para entrenar un modelo de aprendizaje automático, necesita tener una gran cantidad de datos (conjunto de datos), con una buena definición y etiquetados correctamente. Amazon SageMaker Ground Truth le ayuda con la tarea de crear este conjunto de datos de alta calidad. Le permite utilizar empleados de terceros, de Amazon Mechanical Turk, o la fuerza de trabajo de la propia empresa.
Uno de los framewroks de aprendizaje automático de código abierto más utilizados en el mercado es PyTorch. Le permite acelerar el desarrollo, desde la creación de prototipos hasta la producción. Utilizaremos PyTorch en este ejemplo para mostrar también la flexibilidad y facilidad de integrar este framework con Amazon SageMaker.
Resumen de la solución
Inicialmente, para esta demostración, entrenaremos un modelo para clasificar imágenes de objetos. Estas imágenes fueron seleccionadas del conjunto de datos público de Caltech 256, que consta de más de 30.000 imágenes etiquetadas en 256 categorías distintas (clases). A partir de este conjunto de datos vamos a trabajar con una muestra de las siguientes 4 clases:
- Beer Mug (Taza de cerveza);
- Coffee Mug (taza de café);
- Teapot (tetera);
- Wine Bottle (botella de vino);
Nota : Para demostrar el flujo del desarrollo de modelos deaprendizaje automático, desde el etiquetado en SageMaker Ground Truth, la preparación de datos hasta la implementación del modelo, puede seleccionar 20 imágenes de cada categoría, con un total de 80 imágenes. En un escenario real, probablemente se necesitaría un conjunto de datos más grande para mejorar el rendimiento del modelo.
Creación de los recursos necesarios (requisitos previos)
Para empezar, deberá crear un bucket en Amazon S3 (o utilizar uno existente). El tutorial «Crear un bucket» presenta el paso a paso cómo crear un bucket.
A continuación, seleccione veinte imágenes aleatorias del conjunto de datos citado en el paso anterior, teniendo en cuenta solo las cuatro categorías mencionadas (010.beer-mug, 041.coffee-mug, 212.teapot e 246.wine-bottle) y cargue estas imágenes a S3, utilizando un solo directorio, ya que utilizaremos Amazon SageMaker Ground Truth para etiquetar.
Creación del trabajo de etiquetado en SageMaker Ground Truth
Ahora que hemos creado un bucket en S3 y hemos cargado las imágenes, utilizaremos Amazon SageMaker Ground Truth para que las imágenes sin etiquetar puedan clasificarse antes del proceso de entrenamiento.
Para empezar, vaya a SageMaker desde la consola de AWS y, en el menú izquierdo, haga clic en Etiquetado de trabajos en la sección Ground Truth.
Establezca los siguientes atributos en el fragmento Visión general del trabajo:
- Nombre del trabajo: labeling-demo
- Configuración de datos de entrada: seleccione la opción «Configuración automatizada de datos»
- Configuración de datos:
- Ubicación de S3 para datasets de entrada: Navegue a través de S3 hasta el directorio con las imágenes.
- Ubicación de S3 para datasets de salida: Navegue a través de S3 hasta el directorio vacío o mantenga la misma configuración regional.
- Tipo de datos: Imagen
- Rol de IAM: Especifique un rol con permiso de AmazonsageMakerFullAccess.
- Haga clic en el botón «Completar configuración de datos». Este paso creará un archivo de manifiesto para las imágenes, que será utilizado por Ground Truth.
En el fragmento Tipo de tarea, seleccione:
- Imagen: Porque nuestro conjunto de datos se compone de imágenes.
- Clasificación de imagen (etiqueta única): porque cada imagen tiene un solo objeto o etiqueta.
Haga clic en Siguiente para el siguiente paso.
Nota: En este ejemplo será considerado el primer acceso a Ground Truth. Si este acceso ya se ha realizado, podrá ver los equipos que se crearon previamente.
En el fragmento de los trabajadores:
- Tipos de trabajador: seleccione la opción Privado
- Nombre del equipo: my-private-team
- Invitar a comentadores privados: lista de correo, separada por comas
- Organización: demo-org
- Contacto: Correo electrónico de contacto para los trabajadores
- Tiempo de espera de tarea: 5 minutos (tiempo máximo para una sola tarea. Una sola tarea corresponde a una sola imagen).
- Tiempo de vencimiento de la tarea: 10 días (este tiempo de espera considera el trabajo como un todo, es decir, el conjunto de imágenes).
En el fragmento de la Clasificación de imágenes (etiqueta única) herramienta de etiquetado, puede definir la plantilla que parecerá etiquetar las imágenes:
- Introduzca una descripción para las imágenes para que el anotador sepa como clasificar, por ejemplo:
- Por favor clasifique las imágenes en una de las cuatro clases:
- Rellene las opciones de etiquetado:
- 01.beer-mug
- 02.coffee-mug
- 03.teapot
- 04.wine-bottle
Puede hacer clic en el botón de vista previa para abrir una página de muestra de cómo se mostrará a los trabajadores.
Haga clic en Crear para completar y crear el trabajo.
Después de unos minutos, los usuarios registrados recibirán un correo electrónico con acceso al portal donde podrán empezar a etiquetar.
Una vez finalizado el etiquetado, algunos metadatos estarán disponibles en la carpeta de salida de S3. Dentro de esta estructura, dos son importantes:
- manifiestos: contiene los archivos de manifiesto de salida del trabajo.
- anotaciones:
- worker-response: Contiene la respuesta individual de cada trabajador.
- consolidated-annotation: contiene las anotaciones deseadas.
Para obtener más información, consulte esta documentación sobre los resultados de Ground Truth
Creación de un notebook:
También utilizaremos una instancia de notebook de SageMaker. El tutorial «Crear una instancia de Notebooks» muestra cómo crear un notebook de Jupyter en SageMaker Jupyter. Como el propósito de este blog es para probar, se puede usar una instancia de tipo ml.t3.medium.
Con la instancia de notebook creada, cree un notebook utilizando el kernel conda_pytorch_p36:
A continuación, ejecute el siguiente fragmento de código con las bibliotecas, s3 Bucket y otras referencias que SageMaker utilizará:
Exploración de los datos de Amazon SageMaker Ground Truth
Para explorar los datos generados por Ground Truth, crearemos un nuevo Notebook. En este notebook, importe las dependencias:
En la variable de prefijo, utilice la ruta utilizada para la salida del trabajo Ground Truth.
Utilice el siguiente ejemplo de código para descargar la salida a su notebook y evaluar lo que se generó:
sagemaker_session.download_data('<local_path>', bucket , prefix)
El siguiente extracto leerá el manifiesto generado con los datos de los trabajadores que etiquetaron las imágenes:
Finalmente, el siguiente fragmento reorganizará las imágenes etiquetadas en S3, ya en una estructura de carpetas que utilizaremos en los siguientes pasos:
Nota: El valor <JOB-NAME> debe cambiarse por el nombre del trabajo utilizado en Ground Truth. En este ejemplo hemos utilizado un factor aleatorio para separar el conjunto de datos en entrenamiento y prueba, solo para el propósito de demostración.Entrnando un modelo en SageMaker
Utilizaremos una técnica de aprendizaje automático llamada Transfer Learning. En la práctica, no siempre es necesario entrenar una red neuronal convolucional desde cero, porque es difícil poseer un conjunto de datos de tamaño suficiente, además de demandar un tiempo de entrenamiento muy grande. En su lugar, es común usar un conjunto de datos grande, preentrenar una red con ese conjunto de datos y luego usar este modelo preentrenado como punto de partida para desarrollar el nuevo modelo con el nuevo conjunto de datos para otro dominio específico, en gran medida acelerando el tiempo de entrenamiento y sin necesidad de tantas imágenes. En este ejemplo, utilizamos la red ResNet18, preformada con el dataset ImageNet. A continuación utilizaremos el script transfer_learning.py con el código completo utilizando la técnica de aprendizaje de transferencia y el framework PyTorch. Este script será el punto de entrada para el entrenamiento e implementación de nuestro modelo: En este script, es importante tener en cuenta los siguientes fragmentos-
if __name__
== ‘__main__
‘: el punto de entrada del código, donde se manejan los argumentos y se llama al método de entrenamientotrain ()
;def train (args)
: tiene toda la lógica de entrenamiento modelo;def model_fn (model_dir)
: Ejecutado sólo para inferencia, es responsable de cargar la plantilla al inicio del contenedor de inferencia de SageMaker.
- El script py creado en el paso anterior como entrada;
- Un rol (IAM) con los permisos necesarios;
- El tipo de instancia de entrenamiento (en este caso, como es un ejemplo, se puede usar la instancia m5.large);
- Número de instancias (en este caso, sólo una).
Después de esto, para iniciar el proceso de entrenamiento, simplemente ejecute el siguiente fragmento de código:
Este fragmento toma la ruta a las imágenes de S3 y pasa como parámetro al proceso de formación de SageMaker. Durante este entrenamiento, SageMaker lanzará las instancias requeridas (definidas en el paso anterior), ejecutará el entrenamiento, guardará la plantilla formada en S3 y finalizará las instancias.
Inferir el resultado en SageMaker
Una vez finalizado el proceso de entrenamiento, puede implementar el modelo en una instancia de inferencia de SageMaker. Esta instancia está optimizada y preparada con las dependencias necesarias para reducir la necesidad de administración de infraestructura. Esta instancia ya tiene un endpoint HTTPS para acceder a la plantilla y devuelve una predicción. Para obtener más información, visite la página Implementar una plantilla en los servicios de alojamiento de SageMaker.
A través del siguiente comando es posible crear una instancia de inferencia para probar el modelo:
Como en el entrenamiento, aquí también definimos la cantidad y el tipo de instancia.
Para probar, utilice el siguiente script, que usará cualquier imagen (se puede usar cualquier imagen del conjunto de datos original, preferiblemente una que no se haya utilizado en el proceso de entrenamiento):
El resultado se verá algo así como el resultado a continuación:
Result --> label: 02-coffee-mug | probability: tensor(0.6101, dtype=torch.float64)
Como el propósito aquí es sólo demostrativo, el preprocesamiento para cambiar el tamaño de la imagen y normalizar los canales RGB de la imagen antes de enviarlo al modelo y también post-procesamiento para la conversión a escala entre 0 y 1 de la probabilidad se hizo directamente en el notebook. Sin embargo, esta lógica podría incluirse en las funciones input_fn, predict_fn y output_fn dentro del script python (transfer_learning.py) que se usaría tanto en entrenamiento como en inferencia. Más detalles sobre cómo personalizar la lógica de inferencia se pueden encontrar aquí.
Limpiar recursos
Para evitar costos no deseados, el endpoint creado para la inferencia de plantilla se puede eliminar al finalizar, utilizando el comando:
predictor.delete_endpoint()
Conclusión
En esta publicación, demostramos cómo crear un flujo de trabajo de Machine Learning, desde el etiquetado de imágenes hasta la formación, el uso de un guión PyTorch en SageMaker, y terminando con la creación de una instancia de inferencia para hacer inferencias en tiempo real.
Sobre el autor
Evandro Franco es arquitecto de soluciones para el equipo de Startups de Amazon Web Services. En su puesto, ayuda a las startups a superar los desafíos empresariales aprovechando la plataforma de AWS. Tiene más de 15 años de experiencia en el campo de la tecnología. En su tiempo libre, le gusta correr y pasar tiempo con su familia.
Revisor
Luisa Vesga es arquitecta de soluciones para el equipo de Startups de Amazon Web Services. En su puesto, ayuda a las startups a superar los desafíos empresariales aprovechando la plataforma de AWS. Tiene más de 10 años de experiencia en el campo de la tecnología.