Docker: Modelos de aprendizaje automático como micro servicios

0

Uno de los mayores desafíos subestimados en el desarrollo del aprendizaje automático es el despliegue de los modelos entrenados en la producción que también de forma escalable.

Una de las bromas que he leído es “La forma más común en que se implementa Machine Learning hoy es en diapositivas de powerpoint :)”.

¿Por qué Docker?

Docker es una plataforma de contenedorización que empaqueta una aplicación y todas sus dependencias. en un contenedor.

La activación de este contenedor hace que la aplicación esté activa .

Docker se usa cuando tiene un lote de servicios que funcionan de forma aislada y sirven como datos Proveedor a una aplicación web. Dependiendo de la carga, las instancias se pueden separar a pedido según las reglas establecidas.

¿Por qué Docker para modelos de aprendizaje automático?

La ​​implementación de aplicaciones de software regulares es difícil. Si ese software es un canal de Aprendizaje automático, ¡es peor! Y en el escenario actual, no puede alejarse del aprendizaje automático, ya que es la ventaja más competitiva que puede obtener en el negocio.

En producción, una aplicación con tecnología de Aprendizaje automático estaría usando varios modelos para varios propósitos. Algunos de los principales desafíos prácticos en la implementación de modelos de Machine Learning que se pueden manejar a través de la ventana acoplable son:

Entornos no uniformes en todos los modelos.

Puede haber casos en los que, para un modelo, necesite LANG_LEVEL configurado en ‘c’ mientras que para otro LANG_LEVEL debería ser ‘en_us.UTF-8’. Coloque diferentes modelos en diferentes contenedores de modo que se obtengan ambientes aislados para diferentes modelos.

Requisitos de la biblioteca ununiformes entre los modelos.

Usted ha desarrollado un resumen de texto usando tensor de flujo 1.10 . Ahora queremos tener un análisis de sentimiento utilizando el aprendizaje por transferencia que es compatible con tensorflow2.0 (supongamos). Ponerlos en diferentes contenedores no romperá la aplicación.

Otro caso de uso importante es el desarrollo de modelos ML en python. Pero la aplicación que desea realizar en el lenguaje Go (por algunas ventajas técnicas), luego expondrá el modelo ml a través de la ventana acoplable a la aplicación.

Requisitos de recursos no uniformes en todos los modelos.

tiene un modelo de detección de objetos muy complejo que requiere GPU, y tiene 5 redes neuronales diferentes para otros fines que son buenas para ejecutar en la CPU. Luego, al implementar los modelos en contenedores, obtiene la flexibilidad de asignar recursos según el requisito.

Tráficos no uniformes entre modelos.

Supongamos que tiene un modelo identificador de pregunta y un modo de generación de respuesta.w ex se llama frecuentemente mientras que el segundo no se llama así de frecuente. Entonces necesitas más instancias de identificador de pregunta que generador de respuestas.

Otro escenario es que, a las 10 am, tiene 10000 solicitudes para su modelo, mientras que a las 8 pm es solo 100. Por lo tanto, necesita escindir más instancias de servicio según sus requisitos, que es

Escala a nivel de modelo

Supongamos que tiene un modelo estadístico que atiende a 100000 solicitudes por segundo, mientras que un modelo de aprendizaje profundo es capaz de atender 100 solicitudes por segundo. Luego, para 10000 solicitudes, necesita escalar solo el modelo de aprendizaje profundo. Esto se puede hacer por la ventana acoplable.

Ahora veamos cómo crear un contenedor de un modelo de aprendizaje profundo. Aquí, el modelo que he construido es un identificador de tema de pregunta en el conjunto de datos del clasificador de pregunta disponible en http://cogcomp.org/Data/QA/QC/ . El Codificador Universal de Oraciones de Google se utiliza para incrustar palabras.

Al crear un contenedor para un modelo, el flujo de trabajo que normalmente se debe seguir es:

  1. Cree y entrene el modelo.
  2. Cree una API del modelo. (Aquí lo hemos puesto en un API de matraz).
  3. Cree el archivo de requisitos que contiene todas las bibliotecas requeridas.
  4. Cree el archivo de ventana acoplable con la configuración de entorno y las operaciones de inicio necesarias.
  5. Cree la imagen de la ventana acoplable.
  6. Ahora ejecuta el contenedor y baila cuando hayas terminado:)

sambit9238 / QuestionTopicAnalysis

Construye y entrena el modelo.

Para construir y entrenar el modelo, a el flujo de trabajo básico consiste en obtener los datos, realizar la limpieza y el procesamiento de los datos y luego enviarlos a la arquitectura del modelo para obtener un modelo capacitado.

Por ejemplo, he creado un modelo clasificador de preguntas y respuestas en el conjunto de datos TREC disponible en http://cogcomp.org/Data/QA/QC/ . Los datos de entrenamiento tienen 6 intentos, y el número de instancias de cada uno es el siguiente:

 Contador ({& # 039; DESC & # 039 ;: 1162, 
 & # 039; ENTY & # 039 ;: 1250, 
 & # 039; ABBR & # 039 ;: 86, 
 & # 039; HUM & # 039 ;: 1223, 
 & # 039; NUM & # 039 ;: 896, 
 & # 039; LOC & # 039 ;: 835})

La creación del modelo se puede ver en https://github.com/sambit9238/QuestionTopicAnalysis/blob/master/question_topic.ipynb

Los siguientes pasos de proceso son:

  1. Cómo lidiar con las contracciones, como yo, yo, etc.
  2. Tratar con hipervínculos, direcciones de correo, etc.
  3. Tratar con números e identificaciones.
  4. Tratar con puntuaciones.

Para incrustar, El codificador universal de oraciones de Google se usa desde tensorflow-hub.

La arquitectura del modelo que se sigue es una red neuronal con 2 capas ocultas, cada una con 256 neuronas. Para evitar el ajuste excesivo, se utiliza la regularización L2.

 Capa (tipo) Parámetro de forma de salida # 
 =========================== ====================================== 
 input_1 (InputLayer) (Ninguno, 1) 0 
 _________________________________________________________________ 
 lambda_1 (Lambda) (Ninguno, 512) 0 
 _________________________________________________________________ 
 dense_1 (Densa) (Densa) (Densa) (____________________________________________________________________________________________________________________________________________________________________________________________) ) 65792 
 _________________________________________________________________ 
 dense_3 (Denso) (Ninguno, 6) 1542 
 ============================= ======================================19459021] Parámetros totales: 198,662 
 Trainable params: 198,662 
 Parámetros no entrenables: 0 
 _________________________________

El modelo se almacena en un archivo .h5 para su reutilización. El codificador de etiquetas se almacena en el archivo pickle para su reutilización.

Cree una API del modelo. (Aquí lo hemos puesto en un API de matraz).

El modelo almacenado se coloca en Flask api para que se pueda usar en producción ( https://github.com/sambit9238/QuestionTopicAnalysis/ blob / master / docker_question_topic / app.py .)

La API espera una lista de textos, ya que varias oraciones aparecerán mientras se usan en tiempo real. Pasa por la limpieza y el procesamiento para alimentar para la predicción. Los resultados predichos se escalan para representar el porcentaje de confianza de cada intento. Los resultados a escala se envían luego en formato JSON.

Por ejemplo,

entrada: [ “What is your salary?”]

salida: {‘ABBR’: 0.0012655753, ‘DESC’: 0.0079659065, ‘ENTY’: 0.011016952, ‘HUM ‘: 0.028764706,’ LOC ‘: 0.013653239,’ NUM ‘: 0.93733364}

Eso significa que el modelo está seguro al 93% de que la respuesta debe ser un número para esta pregunta.

Cree el archivo de requisitos que contiene todas las bibliotecas requeridas.

Para crear una imagen de Docker para servir a nuestra API, necesitamos crear un archivo de requisitos con todas las bibliotecas usadas junto con sus versiones.

Crear el Dockerfile con la configuración de entorno necesaria y las operaciones de inicio.

A Dockerfile es un documento de texto que contiene todos los comandos que un usuario puede llamar en la línea de comandos para ensamblar una imagen. [19659005] Para nuestro ejemplo, la imagen de Python-3.6 preconstruida se toma como una imagen base. A continuación, se descargaron los archivos de modelo de Universal Sentance Proder formados y luego se instalaron las bibliotecas necesarias. El puerto 5000 de la ventana acoplable está expuesto, este es el puerto donde se ejecutará la aplicación del matraz tal como está en la configuración predeterminada.

Cree la imagen de la ventana acoplable. y ejecute el contenedor

Ahora tenemos el Dockerfile, el matraz API y los archivos de modelo entrenados en un directorio. Por lo tanto, necesitamos crear la imagen docker fuera de ella. El comando para eso puede ser:

 docker build -t question_topic. 
 # la última opción es la ubicación del directorio. Ya que estoy en el directorio, & # 039;. & # 039; se pone, que representa el directorio actual en Unix.

Ahora se crea la imagen de la ventana acoplable, necesitamos ejecutar la imagen en una ventana acoplable de contenedores ejecutada -p 8888: 5000 – name question_topic question_topic

Hará la ventana acoplable creada imagen correr El puerto 5000 en la ventana acoplable se asigna al puerto 8888 de la máquina host. Por lo tanto, la API recibirá y responderá a las solicitudes en el puerto 8888. Si desea ejecutar la ventana acoplable en segundo plano y separarla del símbolo del sistema (que será el caso en tiempo real), ejecútela con la opción ‘-d’.

Para verificar las salidas de la ventana acoplable, enviemos una solicitud posterior usando curl.

entrada:

Para suministrar la entrada, curl – request POST
– url http://0.0.0.0 : 8888 / predict_topic
– header ‘content-type: application / json’
– data ‘{“rawtext_list”: [“Where do you work now?”, “What is your salary?”]}’

output:

{

“input”: “[‘Where do you work now?’, ‘What is your salary?’]”,

“salida”: “[{‘ABBR’:00033528977’DESC’:00013749895’ENTY’:00068545835’HUM’:07283039’LOC’:025804028’NUM’:00020733867}

{‘ABBR’: 0.0012655753, ‘DESC’: 0.0079659065, ‘ENTY’: 0.011016952, ‘HUM’: 0.028764706, ‘LOC’: 0.013653239, ‘NUM’: 0.93733364}]]

]] 19659005] Se ve ms. la ventana acoplable funciona bien:)

Notas:

El ejemplo mencionado no está listo para producción. Pero puede estar listo para la producción siguiendo algunas cosas como:

  1. A nivel de Modelo, se puede hacer más procesamiento y ajuste de los parámetros de los parámetros para mejorar el modelo.
  2. A nivel de API, la inicialización de la sesión y las variables necesitan No debe hacerse en cada solicitud. Se puede hacer una vez en el inicio de la aplicación reduciendo drásticamente el tiempo de respuesta de la API.
  3. En el nivel de Docker, el archivo Docker no está optimizado, por lo que la imagen de la ventana acoplable puede ser más grande de lo requerido en términos de tamaño.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *