Python in Elixir einbetten? Kein Problem
(dashbit.co)- 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
pytesseractverwendet werden - Nachdem ein Bild mit
reqheruntergeladen wurde, werden über den Aufruf vonPythonx.uv_init/1Python und die Abhängigkeiten heruntergeladen und initialisiert - Mit
Pythonx.eval/2wird 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
Pythonxaus 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/3oder 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
Numpy ist wirklich großartig...
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
Es ist gut zu sehen, dass in der Elixir-Community "bekannte" Leute diesen Ansatz unterstützen und aktiv weiterentwickeln
Andere Kommentare weisen auf Sicherheitsprobleme bei der Nutzung von NIFs hin
Sehr informativer Artikel. Gut, dass klar erwähnt wurde, dass Pythonx nicht einfach nur einen Subprozess aufruft, sondern im selben Prozess läuft
Es freut mich zu sehen, dass Elixir im AI-Wettbewerb gegenüber JavaScript und Python zurückliegt, obwohl es eigentlich besser geeignet ist
Der Einstieg aus Python in das Elixir/Erlang-Ökosystem wirkte immer zu schwierig, aber mit Pythonx scheint schrittweises Lernen viel machbarer
Elixir hat einige Funktionen, die ich mir in Python wünschen würde
|>, echte Immutability, echte Parallelität und Concurrency dank Supervisor Trees, Hot Code Reloading, FehlertoleranzAls jemand, der tief in Elixir involviert ist und Python viel genutzt hat, halte ich das für sehr praktisch
Dieses Projekt und der Blogbeitrag fühlen sich an, als wären sie genau für mich gemacht. Ich möchte es ausprobieren, danke