Implementación de un modelo de aprendizaje automático con Docker - Parte 1

La traducción del artículo se preparó antes del inicio de los cursos básicos y avanzados de aprendizaje automático.







. OTUS Machine Learning: . , -, — (Senior Data Scientist Oura) , .



Como científicos de datos, nuestro enfoque principal es procesar datos y desarrollar y mejorar modelos de aprendizaje automático. Existe la opinión de que el procesamiento de datos es la etapa que lleva más tiempo en todo el proyecto y la precisión del modelo determina el éxito del producto de información. Sin embargo, la industria se encuentra ahora en una etapa de transición "de la era del descubrimiento a la era de la implementación" (Superpoderes en el campo de la inteligencia artificial: China, Silicon Valley y el nuevo orden mundial en esta área lo dicta Li Kaifu). El panorama se está ampliando ahora, y el enfoque está cambiando de construir el modelo a proporcionar el modelo a los usuarios como un servicio y del desempeño del modelo a su valor comercial. El ejemplo más famoso aquí es Netflix, que nunca ha utilizado los modelos ganadores de su algoritmo de $ 1 millón debido a costos de ingeniería: WIRED .





De la comprensión a la realidad (diapositivas de la conferencia Strata Data - Explicó Kubeflow: aprendizaje automático portátil en Kubernetes ) La



implementación del modelo es extremadamente importante y los productos de información ahora pueden considerarse productos de software, porque tienen una estructura de proyecto, una gestión y un ciclo de vida similares. Por lo tanto, tenemos derecho a utilizar todas las técnicas conocidas del campo del desarrollo de software para implementar modelos de aprendizaje automático en producción.



La contenedorización es un método que se usa ampliamente para implementar productos de software tanto en una plataforma en la nube como en un servidor local. Básicamente, estamos hablando de código de empaquetado y dependencias en una caja llamada contenedor. A continuación se muestra la definición de contenedor en el contexto del desarrollo de software:



Desde el sitio de Docker , un



contenedor es una unidad estándar de software que empaqueta el código y todas sus dependencias para que una aplicación pueda ejecutarse de manera rápida y confiable en diferentes entornos informáticos.



Docker es una plataforma que puede ayudarlo a acelerar su desarrollo, contenedorización e implementación de nuestro modelo de aprendizaje automático en otros entornos. En esta serie de artículos, le mostraré cómo almacenar un modelo, usarlo como un punto final de API, contener su aplicación ML y ejecutarla en el motor Docker.



Pregunta uno "¿Por qué Docker?"



Antes de comenzar, deberá registrarse con una ID de Docker si no tiene una, y luego usar esa ID para descargar e instalar Docker en su máquina.



Cuando comencé mi trabajo en el banco, me asignaron un proyecto que involucraba el procesamiento de datos y el primer MVP (producto mínimo viable) debía entregarse en un mes. Suena estresante, pero nosotros en el equipo usamos la metodología Agile en el desarrollo de todos los productos principales, y el objetivo principal de este MVP era probar la hipótesis sobre la practicidad y la efectividad del producto (para obtener más información sobre la metodología Agile, consulte el libro de Eric Ries "Lean Startup" ). Mi gerente quería que implementara mi modelo en su computadora portátil, es decir, que lo ejecutara y lo usara para la predicción.



Si imaginaba todos los pasos que debía seguir para preparar la computadora portátil del gerente para ejecutar mi proyecto, es posible que tenga muchas preguntas, como:



  • ¿En qué sistema operativo deberá ejecutarse el modelo, ya que usa una Macbook y ThinkPad? Podría, por supuesto, preguntarle sobre esto, pero suponga que en ese momento de mi vida mi jefe era muy desagradable y no quería que yo supiera esta información. (Este pensamiento está aquí para informarle sobre el problema de la dependencia del sistema operativo, y mi jefe es una muy buena persona).
  • Segunda pregunta: "¿Tiene Python instalado?" Si es así, ¿qué versión, 2 o 3? ¿Cuál: 2.6, 2.7 o 3.7?
  • ¿Qué pasa con los paquetes obligatorios como scikit-learn, pandas y numpy? ¿Tiene las mismas versiones que tengo en mi máquina?


Con todas estas preguntas en mente, esto es lo que tuve que hacer con su computadora para que mi modelo se ejecutara en ella.



  1. Instala Python.
  2. Instale todos los paquetes.
  3. Configure las variables de entorno.
  4. Transfiere el código al auto.
  5. Ejecute el código con los parámetros necesarios.


Todos estos pasos requieren mucho esfuerzo y existe el riesgo de incompatibilidades al ejecutar el código en diferentes entornos.



Entonces, si ya tiene Docker instalado y en ejecución, puede abrir una terminal y ejecutar el siguiente comando:



docker run --rm -p 5000:5000 datascienceexplorer/classifier


Después de un par de minutos, debería ver algo similar en su terminal:



* Serving Flask app "main" (lazy loading)
* Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)


Ahora abra su navegador favorito y vaya a esta dirección:



http://localhost:5000/apidocs/


Haga clic en la línea de predicción de la API, y luego en el botón de prueba a la derecha, la interfaz se ve así:





Página Swagger para la API en el backend ¿



Recuerda el conjunto de datos estándar de Iris Flowers con el que jugó? Esta pequeña aplicación te ayudará a predecir el tipo de flor en base a información sobre algunas medidas basadas en un modelo de clasificación. De hecho, ya está usando mi modelo de aprendizaje automático como servicio, y todo lo que instaló es solo Docker, y no necesitaba instalar Python ni ningún paquete en su máquina.



Ésta es la fuerza de Docker. Me ayuda a resolver problemas de dependencia para poder implementar rápidamente mi código en diferentes entornos o, en este caso, en su máquina.



Ciencia de datos de DevOps



Ahora, espero haberlo motivado lo suficiente como para seguir leyendo, y si solo desea omitir estas partes e ir directamente al código, está bien, ya que eso significa que desea contener su modelo de aprendizaje automático con Docker y exponerlo como Servicio. Sin embargo, por ahora tendremos que detenernos un poco y dejar a un lado todos los materiales sobre el aprendizaje automático y Docker para pensar en DevOps en la ciencia de datos y por qué es necesario allí.



¿Qué es DevOps?



De Wikipedia,

DevOps es una colección de prácticas que combinan el desarrollo de software y los servicios de tecnología de la información, cuyo objetivo es acortar el ciclo de vida del desarrollo del sistema y garantizar una entrega continua de software de alta calidad.
El objetivo de los desarrolladores de software es la entrega oportuna de código con toda la funcionalidad necesaria, a la vez que facilidad de uso, confiabilidad, escalabilidad, parte de red, firewall, infraestructura, etc. a menudo siguen siendo problemas operativos. Debido a los diferentes objetivos finales y probables KPI, estos equipos generalmente no se llevan bien bajo el mismo techo. Por lo tanto, un especialista en DevOps podría actuar como enlace y ayudar a estos equipos a trabajar juntos, o incluso asumir la responsabilidad de ambas partes, de modo que el resultado final sea un equipo, liderando el desarrollo de principio a fin. Después de todo, no puede simplemente darle su computadora al cliente, porque el código funciona como debería en ella.

Pero con el cuaderno Jupyter estoy feliz !!!
Los científicos de datos tienen una historia similar, porque una vez más, no puede simplemente recoger y entregar su computadora portátil con Jupyter Notebook para que el cliente simplemente la use. Necesitamos una forma de usar el modelo de tal manera que pueda servir a una gran cantidad de usuarios en cualquier momento y en cualquier lugar y levantarse con un tiempo de inactividad mínimo (usabilidad, confiabilidad, escalabilidad).



Por esta razón, las empresas buscan científicos de datos con habilidades de DevOps que puedan implementar e implementar sus modelos de aprendizaje automático en producción y brindar valor comercial a la empresa, en lugar de simplemente probar conceptos y centrarse en mejorar la precisión del modelo. A esas personas se les llama unicornios.



Hay muchas formas de implementar un modelo de aprendizaje automático, pero Docker es una herramienta poderosa que le brinda la flexibilidad que necesita mientras mantiene la solidez y encapsulación de su código. Por supuesto, no les pediremos a nuestros clientes que instalen Docker y abran una terminal para ejecutarlo. Pero esta fase de contenedorización eventualmente se convertirá en la base cuando comience a trabajar con proyectos reales en los que tenga que implementar sus modelos en plataformas en la nube o servidores locales.



Almacenamiento del modelo entrenado



De vuelta en la universidad, supimos que el proyecto de ciencia de datos consta de seis etapas, como se muestra en la imagen siguiente. Si automatizar e implementar el modelo en producción es nuestro objetivo final, ¿cómo podemos “llevar” el modelo a la fase de implementación?





Seis etapas de un proyecto de ciencia de datos



La forma más fácil que se te ocurre es copiar todo de nuestro cuaderno, pegarlo en un archivo .py y ejecutarlo. Sin embargo, cada vez que necesitemos hacer una predicción, ejecutaremos este archivo y entrenaremos el modelo nuevamente con los mismos datos. Si este enfoque es aplicable de alguna manera para modelos simples con un pequeño conjunto de datos de entrenamiento, no será efectivo para modelos complejos con muchos datos de entrenamiento (piense en cuánto tiempo le llevará entrenar un modelo ANN o CNN). Esto significa que cuando un usuario envía una solicitud de modelo para la predicción, tendrá que esperar desde varios minutos hasta varias horas para obtener el resultado, ya que llevará mucho tiempo completar la etapa de entrenamiento del modelo.



¿Cómo almacenar el modelo inmediatamente después de haber sido entrenado?



En la mayoría de los casos, un modelo de aprendizaje automático en Python se almacenará en la memoria como un objeto de Python durante la ejecución del código y luego se eliminará una vez que finalice el programa. Si pudiéramos guardar este objeto en el disco duro inmediatamente después de que se entrena el modelo, entonces la próxima vez que necesitemos hacer una predicción, simplemente podemos cargar el modelo terminado en la memoria y no pasar por las etapas de inicialización y entrenamiento. En informática, el proceso de convertir un objeto en una secuencia de bytes para su almacenamiento se denomina serialización . En Python, esto se puede hacer fácilmente con un paquete llamado pickle , que tiene soporte nativo para Python listo para usar . Los desarrolladores de Python también llaman "decapado" al proceso de serializar un objeto usando pickle....



En el cuaderno Jupyter, puede guardar fácilmente el objeto modelo (en mi caso, "knn") en un archivo pkl , que se encuentra en el mismo directorio que el código:



import pickle

with open('./model.pkl', 'wb') as model_pkl:
  pickle.dump(knn, model_pkl)


Guardando el modelo en el directorio actual



Mi cuaderno, recomiendo tomar de aquí , para que más adelante tengamos resultados similares. Alternativamente, puede utilizar su propio modelo, pero asegúrese de tener todos los paquetes necesarios, así como las entradas correctas del modelo.



Completado el primer paso, ha guardado el modelo entrenado. Además, reutilizaremos el modelo para la previsión, pero más sobre eso en la segunda parte del artículo.






Aprender más acerca de:








Lee mas






All Articles