Uso necesario de bibliotecas solo disponibles en Python.
Recientemente tuve que implementar una incrustación de Python en C ++. Tuve un gran proyecto de investigación usando scikit-learn. Se compone de dos componentes; uno consumió una transmisión de datos en vivo para entrenar y administrar una serie de modelos predictivos (clasificadores), que se serializaron y almacenaron como archivos en el disco. Desarrollamos nuestro propio tipo de archivo para admitir versiones e incrustación de metadatos; El segundo componente era un servidor REST en línea que ofrecía predicciones en tiempo real. Cargaría los modelos desde el disco, capturaría previamente según fuera necesario y ejecutaría múltiples predicciones por solicitud. Los resultados se ordenaron, recortaron y serializaron en JSON.
El proyecto completo se implementó en Python y dependía en gran medida de scikit-learn. Rápidamente se hizo evidente que el servidor basado en Python no podía cumplir con nuestros requisitos de rendimiento; migrar a una implementación de C ++ se convirtió en la única opción.
- ¿Se pueden combinar blockchain y machine learning?
- ¿Cuáles fueron los algoritmos utilizados para los chatbots antes de que surgiera el aprendizaje profundo?
- ¿Existe alguna relación entre el aprendizaje automático y el campo de la electrónica analógica o digital?
- ¿Cuál es la diferencia entre tagger, chunker y NER?
- He implementado con éxito el Descenso de gradiente estocástico y el Descenso de gradiente más pronunciado en C ++. ¿Qué puedo hacer a continuación?
Sin embargo, después de 6 meses en el proyecto, tuve que entregar lo antes posible; migrar a una biblioteca de C ++ no era factible en el tiempo. Requeriría no solo reescribir el código completo, sino también volver a evaluar la nueva biblioteca desde cero; afina los parámetros de entrenamiento y reescribe desde cero un protocolo de serialización y un tipo de archivo modelo.
Finalmente elegí incrustar Python en un servidor basado en C ++; la parte de C ++ haría casi todo (todo el procesamiento de solicitudes, datos y resultados) mientras que la parte de Python tenía solo 30 líneas para ejecutar una predicción (y configurar el entorno).
La implementación híbrida final empleó multiprocesamiento para evitar las deficiencias del paralelismo GIL; terminó siendo (10 * CPU #) veces más rápido que la versión solo para Python y se escala superlinealmente debido al costo fijo de procesamiento previo y posterior, independientemente del tamaño de entrada.
El proceso de migración duró 3 semanas y cumplí el plazo con bastante facilidad.