Aprendizaje automático industrial: 10 principios de diseño

Aprendizaje automático industrial: 10 principios de diseño



Hoy en día, todos los días se crean nuevos servicios, aplicaciones y otros programas importantes que te permiten crear cosas increíbles: desde software para controlar un cohete SpaceX hasta interactuar con un hervidor en la habitación contigua a través de un teléfono inteligente.



Y, a veces, todo programador novato, ya sea una startup apasionada o un Full Stack ordinario o un Data Scientist, tarde o temprano se da cuenta de que existen ciertas reglas para programar y crear software que simplifican enormemente la vida.



En este artículo, describiré brevemente 10 principios de cómo programar el aprendizaje automático industrial para que se pueda integrar fácilmente en una aplicación / servicio, basado en la metodología App de 12 factores propuesta por el equipo de Heroku.... Mi iniciativa es aumentar el conocimiento de esta técnica, que puede ayudar a muchos desarrolladores y personas de Data Science.



Este artículo es el prólogo de una serie de artículos sobre aprendizaje automático industrial. En ellos, continuaré hablando sobre cómo, de hecho, hacer un modelo y ejecutarlo en producción, crear una API para él, así como ejemplos de diversas áreas y empresas que tienen ML integrado en sus sistemas.



Principio 1. Una base de código



Algunos programadores se olvidan de Git en las primeras etapas debido a la pereza para resolverlo (o por alguna razón). Se olvidan de la palabra en absoluto, es decir, se lanzan archivos entre sí en la unidad / simplemente arrojan texto / envían palomas, o no piensan en su flujo de trabajo y hacen una confirmación de cada uno en su propia rama y luego en el maestro.



Este principio dice: tenga una base de código y muchas implementaciones.



Git se puede utilizar tanto en producción como en investigación y desarrollo (I + D), donde se utiliza con menos frecuencia.



Por ejemplo, en la fase de I + D, puede dejar confirmaciones con diferentes métodos y modelos de procesamiento de datos, para luego elegir el mejor y seguir trabajando con él fácilmente.



En segundo lugar, en producción esto es algo insustituible: deberá observar constantemente cómo cambia su código y saber qué modelo dio los mejores resultados, qué código funcionó al final y qué sucedió, debido a lo que dejó de funcionar o comenzó a emitir. resultados incorrectos. ¡Para eso están las confirmaciones!



Y también puede crear un paquete de su proyecto colocándolo, por ejemplo, en Gemfury, y luego simplemente importando funciones de él para otros proyectos, para no reescribirlos 1000 veces, pero más sobre eso más adelante.



Principio 2. Declarar y aislar las dependencias con claridad



Cada proyecto tiene diferentes bibliotecas que se importan desde el exterior para poder aplicarlas en algún lugar. Ya se trate de bibliotecas de Python, bibliotecas de otros lenguajes de diferentes propósitos o herramientas del sistema, su tarea es:





Así, los desarrolladores que se unirán a tu equipo en el futuro podrán familiarizarse rápidamente con las bibliotecas y sus versiones que se utilizan en tu proyecto, así como también podrás controlar las versiones y las propias bibliotecas instaladas para un proyecto específico, lo que te ayudará a evitar incompatibilidad de bibliotecas o sus versiones.



Su aplicación tampoco tiene que depender de las herramientas del sistema que podrían estar instaladas en un sistema operativo en particular. Estas herramientas también deben declararse en el manifiesto de dependencias. Esto es necesario para evitar situaciones en las que la versión de las herramientas (así como su disponibilidad) no coincida con las herramientas del sistema de un sistema operativo en particular.



Por lo tanto, incluso si puede usar curl en casi todas las computadoras, aún debe declararlo en dependencias, ya que al migrar a otra plataforma puede no estar allí o la versión no será la que originalmente necesitaba.



Por ejemplo, su requirements.txt podría verse así:



# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0


Principio 3. Configuraciones



Muchos han oído hablar de historias en las que varios desarrolladores cargaron accidentalmente código en GitHub en repositorios abiertos con contraseñas y otras claves de AWS, despertando al día siguiente con una deuda de $ 6,000 o incluso con todos los $ 50,000.







Por supuesto, estos casos son extremos, pero muy reveladores. Si almacena sus credenciales u otros datos necesarios para la configuración dentro del código, está cometiendo un error y creo que no vale la pena explicar por qué.



Una alternativa a esto es almacenar configuraciones en variables de entorno. Puede leer más sobre las variables de entorno aquí .



Ejemplos de datos que normalmente se almacenan en variables de entorno:



  • Nombres de dominio
  • API URL / URI
  • Claves públicas y privadas
  • Contactos (correo, teléfonos, etc.)


De esta manera, no tiene que cambiar constantemente el código si cambian sus variables de configuración. Esto le ahorrará tiempo, esfuerzo y dinero.



Por ejemplo, si usa la API de Kaggle para realizar pruebas (por ejemplo, descarga y ejecuta el modelo a través de ella para probar que el modelo funciona bien al inicio), las claves privadas de Kaggle, como KAGGLE_USERNAME y KAGGLE_KEY, deben almacenarse en variables de entorno.



Principio 4: Servicios de terceros



La idea aquí es diseñar el programa de tal manera que no haya distinción entre recursos locales y de terceros en términos de código. Por ejemplo, puede conectar MySQL local y de terceros. Lo mismo ocurre con varias API como Google Maps o Twitter API.



Para deshabilitar un servicio de terceros o conectar otro, solo necesita cambiar las claves en la configuración en las variables de entorno, de las que hablé en el párrafo anterior.



Entonces, por ejemplo, en lugar de especificar cada vez la ruta a los archivos con conjuntos de datos dentro del código, es mejor usar la biblioteca pathlib y declarar la ruta a los conjuntos de datos en config.py, de modo que no importa qué servicio use (por ejemplo, CircleCI), el programa Pude averiguar la ruta a los conjuntos de datos, teniendo en cuenta la estructura del nuevo sistema de archivos en el nuevo servicio.



Principio 5. Construir, lanzar, tiempo de ejecución



Muchas personas en Data Science encuentran útil aprender habilidades de escritura de software. Si queremos que nuestro programa se bloquee lo menos posible y que se ejecute sin problemas durante el mayor tiempo posible, debemos dividir el proceso de lanzamiento de la nueva versión en 3 etapas:



  1. . , . .
  2. — config, . .
  3. . .


Un sistema de este tipo para el lanzamiento de nuevas versiones del modelo o todo el pipeline permite la división de roles entre administradores y desarrolladores, permite rastrear versiones y previene paradas no deseadas del programa.



Para la tarea de lanzamiento, se han creado muchos servicios diferentes en los que puede escribir procesos para ejecutarlos usted mismo en un archivo .yml (por ejemplo, en CircleCI, este es config.yml para respaldar el proceso en sí). Wheely es excelente para crear paquetes para proyectos.



Podrá crear paquetes con diferentes versiones de su modelo de aprendizaje automático, y luego empaquetarlos y consultar los paquetes necesarios y sus versiones para usar las funciones que escribió desde allí. Esto le ayudará a crear una API para su modelo, y su paquete se puede colocar en Gemfury, por ejemplo.



Principio 6. Ejecutamos su modelo como uno o varios procesos



Además, los procesos no deben tener datos compartidos. Es decir, los procesos deben existir por separado, y todo tipo de datos deben existir por separado, por ejemplo, en servicios de terceros como MySQL u otros, según lo que necesites.



Es decir, definitivamente no vale la pena almacenar datos dentro del sistema de archivos del proceso, de lo contrario puede llevar a borrar estos datos en la próxima versión / cambio de configuraciones o transferencia del sistema en el que se está ejecutando el programa.



Pero hay una excepción: para los proyectos de aprendizaje automático, puede almacenar la memoria caché de la biblioteca para que no vuelva a instalarlos cada vez que lance una nueva versión, si no se han realizado bibliotecas adicionales o cambios en sus versiones. Así acortarás el tiempo de lanzamiento de tu modelo en la industria.



Para ejecutar el modelo como varios procesos, puede crear un archivo .yml en el que solo especifica los procesos necesarios y su secuencia.



Principio 7. Reciclabilidad



Los procesos que se ejecutan en el modelo en su aplicación deben ser fáciles de iniciar y detener. Por lo tanto, le permitirá implementar rápidamente cambios de código, cambios de configuración, escalar de manera rápida y flexible y evitar posibles fallas de la versión de trabajo.



Es decir, su proceso con un modelo debería:



  • . ( , , ) . , — .
  • . , , , . DevOps , , (, , , , !)


Principio 8: Implementación / Integración continuas



Muchas empresas utilizan la separación entre los equipos de implementación y desarrollo de aplicaciones (haciendo que la aplicación esté disponible para los usuarios finales). Esto puede ralentizar enormemente el desarrollo de software y el progreso hacia su mejora. También estropea la cultura DevOps, donde el desarrollo y la integración se combinan a grandes rasgos.



Por lo tanto, este principio establece que su entorno de desarrollo debe estar lo más cerca posible de su entorno de producción.



Esto permitira:



  1. Reducir diez veces el tiempo de liberación
  2. Reducir el número de errores debidos a incompatibilidad de código.
  3. También reduce la carga sobre el personal, ya que los desarrolladores y las personas que implementan la aplicación ahora son un solo equipo.


Las herramientas que le permiten trabajar con esto son CircleCI, Travis CI, GitLab CI y otras.



Puede hacer adiciones rápidamente al modelo, actualizarlo e iniciarlo inmediatamente, mientras que será fácil, en caso de fallas, volver muy rápidamente a la versión de trabajo sin que el usuario final se dé cuenta. Esto se puede hacer de forma especialmente rápida y sencilla si tiene buenas pruebas.



Minimiza las diferencias !!!



Principio 9. Tus registros



Los registros (o "registros") son eventos registrados, generalmente en formato de texto, que ocurren dentro de la aplicación (flujo de eventos). Ejemplo simple: "2020-02-02 - nivel del sistema - nombre del proceso". Están diseñados para que el desarrollador pueda ver literalmente lo que sucede cuando el programa se está ejecutando. Ve el progreso de los procesos y comprende si es como lo pretendía el desarrollador.



Este principio dice que no debe almacenar sus registros dentro de su sistema de archivos; solo necesita "mostrarlos", por ejemplo, hacerlo en la salida estándar de la salida estándar del sistema. Y de esta manera, el flujo se puede monitorear en la terminal durante el desarrollo.



¿Significa esto que no es necesario guardar los registros en absoluto? Por supuesto no. Es solo que su aplicación no debería hacer esto, déjelo en manos de servicios de terceros. Su aplicación solo puede redirigir los registros a un archivo o terminal específico para visualización en vivo, o redirigirlo a un sistema de almacenamiento de uso general (como Hadoop). Su propia aplicación no debe almacenar registros ni interactuar con ellos.



Principio 10. ¡Prueba!



Para el aprendizaje automático industrial, esta fase es extremadamente importante, ya que debe comprender que el modelo funciona correctamente y brinda lo que desea.



Las pruebas se pueden crear con pytest y probar con un pequeño conjunto de datos si tiene una tarea de regresión / clasificación.



No olvide establecer la misma semilla para los modelos de aprendizaje profundo para que no produzcan resultados diferentes constantemente.



Esta fue una breve descripción de 10 principios y, por supuesto, es difícil usarlos sin probar y ver cómo funcionan, por lo que este artículo es solo un prólogo de una serie de artículos interesantes en los que revelaré cómo crear modelos industriales de aprendizaje automático. cómo integrarlos en los sistemas y cómo estos principios pueden facilitarnos la vida a todos.



También intentaré usar algunas pautas interesantes que alguien puede dejar en los comentarios si lo desea.



All Articles