Integrar Python en Elixir, sin problema
(dashbit.co)- En los últimos años, Elixir ha estado ampliando sus capacidades en machine learning y datos a través del proyecto Nx (Numerical Elixir)
- Han surgido proyectos como Nx, Explorer, Axon, Bumblebee y Scholar, que están evolucionando con base en lecciones aprendidas de los ecosistemas de Python y R
- Al principio, se decidió no depender directamente de librerías de Python, para perseguir un diseño optimizado para Elixir y evitar la complejidad de configurar entornos de Python
- Sin embargo, hoy en día quien está impulsando la adopción de Elixir en esta área es Livebook
- Una plataforma de notebooks, basada en las fortalezas de Elixir y Erlang, que está a la vanguardia en reproducibilidad, ejecución distribuida y desarrollo de aplicaciones
- El interés de equipos y empresas que quieren dar sus primeros pasos en el ecosistema de Elixir a través de Livebook sigue creciendo
- Pero hay un obstáculo
- La mayoría de las empresas que quieren incorporar Elixir y Livebook en su infraestructura ya usan flujos de trabajo, paquetes y repositorios basados en Python
- Esto significa que, para tomar esta decisión, tendrían que encontrar paquetes equivalentes en Elixir o reescribirlos desde cero, lo que incrementa el riesgo y el costo de sumar Elixir al stack de datos
- Para resolver esto, se presentó Pythonx, que integra el intérprete de Python dentro de la Erlang VM
Pythonx
- Pythonx ofrece conversión automática de datos entre Elixir y Python, evaluación de código y gestión de entornos virtuales
- Se puede usar el paquete
pytesseractpara realizar Optical Character Recognition (OCR) - Tras descargar una imagen con
req, se llama aPythonx.uv_init/1para descargar e inicializar Python y sus dependencias - Se usa
Pythonx.eval/2para ejecutar código Python y convertir el resultado en una cadena de Elixir
Estructura interna
- La implementación de referencia CPython de Python puede integrarse en otras aplicaciones
- Las funciones principales del intérprete de Python se ofrecen como una librería en C
- Las aplicaciones en C/C++ pueden enlazar esa librería y usar su API para ejecutar código e interactuar con objetos
- Elixir ofrece interoperabilidad con C/C++ a través de los NIFs de Erlang
- Pythonx integra Python usando NIFs y se ejecuta dentro del mismo proceso del sistema operativo
- El intercambio de datos entre Python y Elixir se realiza de forma eficiente
Soporte multilenguaje en Livebook
- Basado en Pythonx, se está avanzando en agregar soporte para Python en Livebook
- Elixir y Python podrán interactuar dentro del mismo notebook
- Livebook instalará automáticamente Python y sus dependencias, y gestionará la conversión entre variables de Elixir y Python
- Esto garantiza entornos reproducibles
- Actualmente siguen en marcha trabajos adicionales como autocompletado y documentación, y ya se puede descargar y usar Livebook nightly
Consideraciones de uso y alternativas
- El objetivo principal de Pythonx es integrar flujos de trabajo en Python dentro de Livebook y scripts
- Debido al Global Interpreter Lock (GIL) de Python, puede haber limitaciones de concurrencia al llamar a
Pythonxdesde varios procesos de Elixir - Conviene llamarlo desde un solo proceso de Elixir o verificar si la librería de Python puede manejar llamadas concurrentes
- Como alternativa, se pueden administrar varios procesos de Python usando
System.cmd/3o Port - Para flujos de trabajo de IA, se pueden ejecutar modelos preentrenados mediante Bumblebee
- También se pueden ejecutar modelos ONNX con Ortex
- En el caso de los LLM, se puede usar una API de terceros o ejecutar un contenedor Docker de Llama.cpp on-premises
- Si se usan interfaces basadas en HTTP, pueden aprovecharse herramientas de Elixir como Instructor y LangChain
Proyecto Fine
- Pythonx está implementado usando NIFs
- Los NIFs son funciones de Elixir implementadas en C y requieren mucho código boilerplate
- Existe complejidad en la gestión de memoria y el manejo de errores
- Para resolver esto, se desarrolló la librería Fine basada en C++
- Fine ofrece conversión automática de estructuras de datos, gestión segura de objetos de recurso y capacidad para lanzar excepciones
- Esto puede reducir considerablemente la cantidad de código al escribir NIFs
Conclusión
- El objetivo del proyecto Numerical Elixir es que Elixir tenga una identidad propia dentro del ecosistema de datos y machine learning
- Ahora también está poniendo la interoperabilidad como un objetivo central
- Pythonx integra Python en Elixir y permite una interoperabilidad transparente entre ambos lenguajes
2 comentarios
Numpy es realmente genial...
Opiniones en Hacker News
La funcionalidad de Livebook está muy buena. Es elegante que desde Elixir se llame directamente a CPython mediante NIFs de C++ y se devuelvan estructuras de datos nativas de Elixir
Está bueno ver que personas "conocidas" de la comunidad de Elixir apoyen este enfoque y lo desarrollen activamente
Hubo otros comentarios señalando los problemas de seguridad al usar NIFs
Es un artículo muy informativo. Me gustó que dejara claro que Pythonx no es simplemente una llamada a un subproceso, sino que corre dentro del mismo proceso
Me alegra ver que Elixir esté alcanzando terreno, aunque va detrás de JavaScript y Python, pese a que encaja mejor para la guerra de la IA
Siempre sentí que entrar al ecosistema de Elixir/Erlang desde Python era demasiado difícil, pero con Pythonx el aprendizaje gradual parece mucho más posible
Elixir tiene varias cosas que me gustaría que existieran en Python
Como alguien muy metido en Elixir y que ha usado bastante Python, me parece algo muy práctico
Siento que este proyecto y la publicación del blog fueron hechos para mí. Quiero probarlo, gracias