10 puntos por GN⁺ 2025-02-28 | 2 comentarios | Compartir por WhatsApp
  • 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 pytesseract para realizar Optical Character Recognition (OCR)
  • Tras descargar una imagen con req, se llama a Pythonx.uv_init/1 para descargar e inicializar Python y sus dependencias
  • Se usa Pythonx.eval/2 para 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 Pythonx desde 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/3 o 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

 
aer0700 2025-03-01

Numpy es realmente genial...

 
GN⁺ 2025-02-28
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

    • En servidores de producción, usar Pythonx puede ser algo riesgoso. Como se ejecuta en el mismo proceso del sistema operativo que la app de Elixir, termina eludiendo la sólida capacidad de recuperación ante fallos de la app Elixir/BEAM
    • En general, las apps de Elixir tienen árboles de supervisión que pueden manejar con elegancia las fallas de sus propios procesos BEAM, y esa es una gran ventaja de lenguajes como Elixir, Erlang y Gleam
    • Si usas NIFs, una excepción no manejada en Pythonx puede tumbar todo el proceso del sistema operativo y todos los procesos BEAM
    • Rustler es un wrapper popular de NIFs para Rust en Elixir. Hay casos en los que los NIFs son muy útiles, pero hay que tener en cuenta el riesgo de que puedan derribar toda la app
    • Ejecutar otro código nativo como Python o Rust usando Ports es menos riesgoso en ese sentido
  • Está bueno ver que personas "conocidas" de la comunidad de Elixir apoyen este enfoque y lo desarrollen activamente

    • La VM y el runtime parecen muy adecuados para coordinar otros lenguajes y tecnologías, como si hubiera una vía estándar y una vía de offload
    • La diferencia entre ideas de offload que "se ven peligrosas" y una ejecución segura muchas veces es solo carga de trabajo, pero el runtime lo fomenta
    • Como es un NIF, hay algo de riesgo, pero se puede levantar una instancia BEAM separada y distribuir a través de ella
  • Hubo otros comentarios señalando los problemas de seguridad al usar NIFs

    • El scheduler de la VM de Erlang no puede desalojar un NIF, así que una llamada larga a Python corre el riesgo de bloquear la VM
    • El GIL impide la ejecución concurrente de Python, pero los llamadores de Erlang pueden ejecutar varios intérpretes de Python, así que eso no sería un problema con Ports
  • 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

    • Estaría bueno que agregaran un ejemplo de cómo llamar desde Elixir a una función definida en Python
  • 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

    • Me gusta la decisión inicial de expandir la base de ML de Elixir desde cero, pero también está bueno que ahora exista una forma de aprovechar las bibliotecas de Python, que evolucionan rápido
  • 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

    • Me pregunto si han experimentado con free-threading respecto al problema del GIL en Python
  • Elixir tiene varias cosas que me gustaría que existieran en Python

    • átomos, que casi todo sea macros, el pipe |>, inmutabilidad real, paralelismo y concurrencia reales gracias a los árboles de supervisión, hot code reloading, tolerancia a fallos
  • Como alguien muy metido en Elixir y que ha usado bastante Python, me parece algo muy práctico

    • Me interesa aún más la biblioteca Fine, que facilita crear NIFs de C++
  • Siento que este proyecto y la publicación del blog fueron hechos para mí. Quiero probarlo, gracias