10 Punkte von GN⁺ 2025-02-28 | 2 Kommentare | Auf WhatsApp teilen
  • In den letzten Jahren hat Elixir seine Fähigkeiten im Bereich Machine Learning und Daten durch das Projekt Nx (Numerical Elixir) erweitert
  • Projekte wie Nx, Explorer, Axon, Bumblebee und Scholar sind entstanden und entwickeln sich auf Basis der Lehren aus den Python- und R-Ökosystemen weiter
  • Anfangs fiel die Entscheidung, nicht direkt von Python-Bibliotheken abhängig zu sein, um ein auf Elixir optimiertes Design zu verfolgen und die Komplexität der Python-Umgebungseinrichtung zu vermeiden
  • Doch heute wird die Einführung von Elixir in diesem Bereich von Livebook vorangetrieben
    • Eine Notebook-Plattform, die auf den Stärken von Elixir und Erlang aufbaut und an der Spitze von Reproduzierbarkeit, verteilter Ausführung und App-Entwicklung steht
    • Das Interesse von Teams und Unternehmen, die über Livebook erstmals in das Elixir-Ökosystem einsteigen wollen, wächst stetig
  • Es gibt jedoch ein Hindernis
    • Die meisten Unternehmen, die Elixir und Livebook in ihre Infrastruktur einführen wollen, nutzen bereits Python-basierte Workflows, Pakete und Repositories
    • Das bedeutet, dass sie entweder gleichwertige Pakete in Elixir finden oder sie von Grund auf neu schreiben müssten, was das Risiko und die Kosten erhöht, Elixir in den Daten-Stack aufzunehmen
  • Um dieses Problem zu lösen, wurde Pythonx vorgestellt, das den Python-Interpreter in die Erlang VM einbettet

Pythonx

  • Pythonx bietet automatische Datenkonvertierung zwischen Elixir und Python, Codeausführung sowie Verwaltung virtueller Umgebungen
  • Für Optical Character Recognition (OCR) kann das Paket pytesseract verwendet werden
  • Nachdem ein Bild mit req heruntergeladen wurde, werden über den Aufruf von Pythonx.uv_init/1 Python und die Abhängigkeiten heruntergeladen und initialisiert
  • Mit Pythonx.eval/2 wird Python-Code ausgeführt und das Ergebnis in einen Elixir-String umgewandelt

Interne Struktur

  • Die Referenzimplementierung CPython von Python kann in andere Anwendungen eingebettet werden
  • Die Kernfunktionen des Python-Interpreters werden als C-Bibliothek bereitgestellt
  • C/C++-Anwendungen können diese Bibliothek linken und über die API Code ausführen sowie mit Objekten interagieren
  • Elixir bietet Interoperabilität mit C/C++ über Erlang-NIFs
  • Pythonx bettet Python mithilfe von NIFs ein und läuft im selben OS-Prozess
  • Die Datenübergabe zwischen Python und Elixir erfolgt effizient

Mehrsprachige Unterstützung in Livebook

  • Auf Basis von Pythonx wird derzeit Python-Unterstützung für Livebook hinzugefügt
  • Elixir und Python können dadurch im selben Notebook miteinander interagieren
  • Livebook installiert Python und Abhängigkeiten automatisch und verwaltet die Konvertierung zwischen Elixir- und Python-Variablen
  • So wird eine reproduzierbare Umgebung sichergestellt
  • Aktuell laufen zusätzliche Arbeiten wie Codevervollständigung und Dokumentation; Livebook nightly kann bereits heruntergeladen und genutzt werden

Hinweise zur Nutzung und Alternativen

  • Der Hauptzweck von Pythonx ist die Integration von Python-Workflows in Livebook und in Skripten
  • Wegen des Global Interpreter Lock (GIL) von Python kann es bei Aufrufen von Pythonx aus mehreren Elixir-Prozessen zu Einschränkungen bei der Parallelität kommen
  • Es sollte aus einem einzelnen Elixir-Prozess heraus aufgerufen werden, oder es muss geprüft werden, ob die Python-Bibliothek parallele Aufrufe verarbeiten kann
  • Als Alternative lassen sich mit System.cmd/3 oder Port mehrere Python-Prozesse verwalten
  • Für AI-Workflows können mit Bumblebee vortrainierte Modelle ausgeführt werden
  • Mit Ortex lassen sich ONNX-Modelle ausführen
  • Für LLMs können APIs von Drittanbietern genutzt oder on-premises Llama.cpp-Docker-Container betrieben werden
  • Bei HTTP-basierten Schnittstellen können Werkzeuge wie Instructor und LangChain in Elixir genutzt werden

Das Projekt Fine

  • Pythonx ist mit NIFs implementiert
  • NIFs sind in C implementierte Elixir-Funktionen und erfordern viel Boilerplate-Code
  • Hinzu kommen Komplexität bei Speicherverwaltung und Fehlerbehandlung
  • Um das zu lösen, wurde die C++-basierte Bibliothek Fine entwickelt
  • Fine bietet automatische Verarbeitung bei der Umwandlung von Datenstrukturen, sichere Verwaltung von Ressourcenobjekten und das Auslösen von Ausnahmen
  • Beim Schreiben von NIFs kann dadurch die Code-Menge stark reduziert werden

Fazit

  • Das Ziel des Numerical-Elixir-Projekts ist es, dass Elixir im Daten- und Machine-Learning-Ökosystem eine eigenständige Identität erhält
  • Nun steht Interoperabilität als zentrales Ziel im Vordergrund
  • Pythonx bettet Python in Elixir ein und ermöglicht transparente wechselseitige Umwandlung zwischen den beiden Sprachen

2 Kommentare

 
aer0700 2025-03-01

Numpy ist wirklich großartig...

 
GN⁺ 2025-02-28
Hacker-News-Kommentare
  • Die Funktionalität von Livebook ist sehr cool. Es ist elegant, dass CPython in Elixir direkt über C++-NIFs aufgerufen wird und Elixir-native Datenstrukturen zurückgibt

    • Auf Produktionsservern kann der Einsatz von Pythonx etwas riskant sein. Da es im selben OS-Prozess wie die Elixir-App läuft, umgeht es die starken Fehlertoleranz- und Recovery-Mechanismen von Elixir/BEAM
    • Normalerweise haben Elixir-Apps Supervisor Trees, die Fehler in ihren eigenen BEAM-Prozessen elegant behandeln können, was ein großer Vorteil von Sprachen wie Elixir, Erlang und Gleam ist
    • Wenn NIFs verwendet werden, kann eine in Pythonx nicht behandelte Ausnahme den gesamten OS-Prozess und alle BEAM-Prozesse beenden
    • Rustler ist ein populärer NIF-Wrapper für Rust in Elixir. NIFs können zwar sehr nützlich sein, aber man sollte das Risiko berücksichtigen, dass die gesamte App abstürzen kann
    • Native Code wie Python oder Rust über Ports auszuführen ist in dieser Hinsicht weniger riskant
  • Es ist gut zu sehen, dass in der Elixir-Community "bekannte" Leute diesen Ansatz unterstützen und aktiv weiterentwickeln

    • Die VM und die Runtime eignen sich sehr gut dafür, andere Sprachen und Technologien zu orchestrieren, sodass es sich anfühlt, als gäbe es einen Standard-Track und einen Offload-Track
    • Der Unterschied zwischen ausgelagerten "riskant wirkenden" Ideen und sicherer Ausführung besteht oft nur im Arbeitsaufwand, aber die Runtime fördert genau das
    • Weil es sich um ein NIF handelt, gibt es ein gewisses Risiko, aber man kann eine separate BEAM-Instanz starten und darüber verteilen
  • Andere Kommentare weisen auf Sicherheitsprobleme bei der Nutzung von NIFs hin

    • Der Scheduler der Erlang-VM kann NIFs nicht präemptiv unterbrechen, daher besteht das Risiko, dass lang laufende Python-Aufrufe die VM blockieren
    • Das GIL verhindert gleichzeitige Python-Ausführung, aber da Erlang-Aufrufer mehrere Python-Interpreter starten können, ist das bei Ports kein Problem
  • Sehr informativer Artikel. Gut, dass klar erwähnt wurde, dass Pythonx nicht einfach nur einen Subprozess aufruft, sondern im selben Prozess läuft

    • Es wäre schön gewesen, wenn noch ein Beispiel ergänzt worden wäre, das zeigt, wie man in Python definierte Funktionen aus Elixir aufruft
  • Es freut mich zu sehen, dass Elixir im AI-Wettbewerb gegenüber JavaScript und Python zurückliegt, obwohl es eigentlich besser geeignet ist

    • Ich mag die frühe Entscheidung, die ML-Basis von Elixir von Grund auf auszubauen, aber es ist auch gut, dass es nun einen Weg gibt, schnell weiterentwickelte Python-Bibliotheken zu nutzen
  • Der Einstieg aus Python in das Elixir/Erlang-Ökosystem wirkte immer zu schwierig, aber mit Pythonx scheint schrittweises Lernen viel machbarer

    • Ich frage mich, ob mit freiem Threading experimentiert wurde, um das GIL-Problem in Python anzugehen
  • Elixir hat einige Funktionen, die ich mir in Python wünschen würde

    • Atoms, dass fast alles Makros sind, Pipes |>, echte Immutability, echte Parallelität und Concurrency dank Supervisor Trees, Hot Code Reloading, Fehlertoleranz
  • Als jemand, der tief in Elixir involviert ist und Python viel genutzt hat, halte ich das für sehr praktisch

    • Ich bin noch mehr an der Fine-Bibliothek interessiert, mit der sich C++-NIFs einfach erstellen lassen
  • Dieses Projekt und der Blogbeitrag fühlen sich an, als wären sie genau für mich gemacht. Ich möchte es ausprobieren, danke