Cómo migrar modelos de aprendizaje automático que están escritos en diferentes lenguajes de programación

Gracias por A2A.

Básicamente, existen tres estrategias “clásicas” para integrar múltiples aplicaciones de software (no limitadas a aplicaciones específicas de ML).

  1. Transferencia de archivos: en un nivel muy amplio, consiste en crear exportaciones de datos desde la aplicación A, colocarla en una ubicación disponible para la aplicación B y leerla desde allí para usar los datos.
  2. Base de datos compartida: haga que todas sus aplicaciones utilicen el mismo almacenamiento. No tiene que ser una base de datos clásica, dependiendo de varios factores puede ser un almacenamiento NoSQL, HDFS, lo que sea …
  3. Paso de mensajes: esto es interesante si necesita una transferencia de datos casi en tiempo real entre sus aplicaciones. Es un enfoque muy elegante, pero las cosas pueden complicarse mucho :). Puede consultar Patrones de integración empresarial para obtener más detalles.

Ahora, en su caso, optaría por la segunda estrategia, a saber, la base de datos compartida. En realidad, Shared Storage parece un mejor nombre. Si puede hacer que sus aplicaciones utilicen el mismo espacio de almacenamiento, combinar los resultados es fácil. He implementado un RS en Python y Scala, uso Python para preprocesar los datos, escribirlos en una ubicación HDFS accesible para la aplicación Scala y leerlos desde allí. Funciona muy bien, es simple y fácil de mantener.

Si no puede hacer que sus aplicaciones accedan a la misma ubicación, al menos tendrá que hacer que usen el mismo formato de datos y poner en juego una cuarta aplicación; su propósito sería agregar datos de las tres fuentes de datos. Si ni siquiera puede tener el mismo formato de datos para sus aplicaciones, entonces esta cuarta aplicación (el agregador) también tendrá que estar a cargo de la transformación de datos para llevarla a un terreno común.

Scala, Python y Go. Caja de herramientas increíble! 🙂

Veo al menos tres dimensiones ortogonales en el espacio que está moviendo:

  • cuánto tiempo tiene para implementar su solución y cuál es su conjunto de habilidades actual
  • qué tan importante es el rendimiento
  • cuánto te importa la escalabilidad

Necesitará una forma de intercambiar datos entre sus módulos. Elija un estándar (XML, JSON, texto, binario), menos análisis, más rápido funcionará. Los tres modelos tendrán que volcar datos en el formato elegido.

Deberá diseñar una forma de comunicación entre la implementación del conjunto y los tres recomendadores. Una forma simple será colocar cada uno de ellos dentro de un servidor WEB y usar HTTP para la comunicación interna. Si se trata de un problema de rendimiento, puede implementar sockets, canalizaciones o memoria compartida. Los dos últimos requerirán que los dos componentes de comunicación estén en la misma máquina, pero esto introducirá menos latencia en su código, pero afectará la escalabilidad. También hay arquitecturas dedicadas para pasar mensajes, como CORBA e IIOP; aunque configurar esto desde tres idiomas es realmente un desafío.

REST es solo un aspecto arquitectónico. ¿Mantiene una sesión con su cliente o cada recomendación es independiente? Si es independiente, el REST vendrá de sí mismo. Si no, no hay forma de implementarlo de una manera RESTANTE, excepto que hará mucho almacenamiento y consultas detrás de escena.

De todos modos, ¿qué tan grandes son sus modelos y qué tan difícil es moverlos en el idioma que elija? Si habla de portar unos cientos de líneas, el esfuerzo para “moverlas todas bajo un mismo techo” es más corto en comparación con la pluralidad de dependencias que debe mantener ahora y la implementación de la comunicación, en tres idiomas. Si tiene bibliotecas dependientes, es probable que las encuentre en el idioma de su elección.

Microsoft IDE (creo que significa entorno de desarrollo integrado) es compatible con varios idiomas. Por lo general, uso C #, C ++ y algunos lenguajes de secuencias de comandos (VJ, VB, etc.) y la biblioteca estándar para desarrollar un software. No uso Python, pero creo que es compatible, sin embargo, no estoy seguro acerca de Scala and Go.

Si puede crear un par de bibliotecas administradas a partir de esos programas escritos por idiomas no compatibles, y agregar una interfaz o propiedad para “Obtener” cada resultado. Puede usar C # o Python para ejecutar cada programa y obtener los resultados, y combinarlos. Si tiene suerte con esta forma, no necesitaría volver a escribir ningún código.

Si IDE no funciona para usted, aún trataría de evitar reescribir nada. En el peor de los casos, puede escribir un script para ejecutar cada programa y usar el sistema de archivos para comunicar los resultados.

¡Buena suerte!