Menyematkan Python di Elixir, tanpa masalah
(dashbit.co)- Dalam beberapa tahun terakhir, Elixir sedang memperluas kemampuannya di bidang machine learning dan data melalui proyek Nx (Numerical Elixir)
- Berbagai proyek seperti Nx, Explorer, Axon, Bumblebee, dan Scholar telah muncul dan terus berkembang berdasarkan pelajaran yang dipetik dari ekosistem Python dan R
- Pada awalnya, diputuskan untuk tidak bergantung langsung pada library Python, demi mengejar desain yang dioptimalkan untuk Elixir dan menghindari kerumitan konfigurasi lingkungan Python
- Namun, belakangan ini yang mendorong adopsi Elixir di bidang ini adalah Livebook
- Platform notebook yang berada di garis depan dalam hal reproduksibilitas, eksekusi terdistribusi, dan pengembangan aplikasi, dengan berlandaskan kekuatan Elixir dan Erlang
- Minat dari tim dan perusahaan yang ingin pertama kali masuk ke ekosistem Elixir melalui Livebook terus meningkat
- Tetapi ada hambatan
- Sebagian besar perusahaan yang ingin mengadopsi Elixir dan Livebook ke infrastruktur mereka sudah menggunakan workflow, package, dan repository berbasis Python
- Ini berarti mereka harus mencari package yang setara di Elixir atau menulis ulang dari nol, yang meningkatkan risiko dan biaya dalam menambahkan Elixir ke data stack
- Untuk mengatasi hal ini, diperkenalkan Pythonx yang menyematkan interpreter Python di dalam Erlang VM
Pythonx
- Pythonx menyediakan konversi data otomatis antara Elixir dan Python, evaluasi kode, serta pengelolaan virtual environment
- Paket
pytesseractdapat digunakan untuk melakukan Optical Character Recognition (OCR) - Setelah mengunduh gambar dengan
req, Python dan dependensinya diunduh serta diinisialisasi melalui pemanggilanPythonx.uv_init/1 Pythonx.eval/2digunakan untuk menjalankan kode Python dan mengubah hasilnya menjadi string Elixir
Struktur internal
- Implementasi referensi Python, CPython, dapat disematkan ke aplikasi lain
- Fungsi inti interpreter Python disediakan sebagai library C
- Aplikasi C/C++ dapat menautkan library tersebut dan memakai API-nya untuk menjalankan kode serta berinteraksi dengan objek
- Elixir menyediakan interoperabilitas dengan C/C++ melalui Erlang NIFs
- Pythonx menyematkan Python dengan memanfaatkan NIFs, dan berjalan dalam proses OS yang sama
- Pengiriman data antara Python dan Elixir dapat dilakukan secara efisien
Dukungan multi-bahasa di Livebook
- Berdasarkan Pythonx, dukungan Python sedang ditambahkan ke Livebook
- Elixir dan Python menjadi dapat saling berinteraksi dalam notebook yang sama
- Livebook secara otomatis memasang Python dan dependensinya, serta mengelola konversi antara variabel Elixir dan Python
- Menjamin lingkungan yang reproducible
- Saat ini pekerjaan tambahan seperti code completion dan dokumentasi masih berlangsung, dan Livebook nightly sudah dapat diunduh dan digunakan
Hal yang perlu dipertimbangkan saat penggunaan dan alternatif
- Tujuan utama Pythonx adalah mengintegrasikan workflow Python di dalam Livebook dan script
- Karena adanya Global Interpreter Lock (GIL) di Python, ada kemungkinan pembatasan konkurensi saat
Pythonxdipanggil dari beberapa proses Elixir - Sebaiknya dipanggil dari satu proses Elixir saja, atau pastikan library Python yang digunakan dapat menangani pemanggilan serentak
- Sebagai alternatif, beberapa proses Python dapat dikelola dengan
System.cmd/3atau Port - Untuk workflow AI, model pralatih dapat dijalankan melalui Bumblebee
- Model ONNX dapat dijalankan menggunakan Ortex
- Untuk LLM, dapat menggunakan API pihak ketiga atau menjalankan kontainer Docker Llama.cpp secara on-premise
- Jika menggunakan antarmuka berbasis HTTP, dapat memanfaatkan alat seperti Instructor dan LangChain milik Elixir
Proyek Fine
- Pythonx diimplementasikan dengan menggunakan NIFs
- NIFs adalah fungsi Elixir yang diimplementasikan dalam C, dan membutuhkan banyak kode boilerplate
- Ada kompleksitas dalam pengelolaan memori dan penanganan error
- Untuk mengatasi hal ini, dikembangkan library berbasis C++ bernama Fine
- Fine menyediakan penanganan otomatis untuk konversi struktur data, pengelolaan aman objek resource, serta kemampuan melempar exception
- Ini dapat sangat mengurangi jumlah kode saat menulis NIF
Kesimpulan
- Tujuan proyek Numerical Elixir adalah agar Elixir memiliki identitasnya sendiri dalam ekosistem data dan machine learning
- Kini interoperabilitas juga dijadikan tujuan utama
- Pythonx menyematkan Python ke dalam Elixir, sehingga memungkinkan interoperabilitas yang transparan antara kedua bahasa
2 komentar
Numpy memang sangat bagus...
Komentar Hacker News
Fitur Livebook sangat keren. Rapi sekali bahwa dari Elixir bisa memanggil CPython secara langsung lewat C++ NIFs dan mengembalikan struktur data native Elixir
Senang melihat orang-orang yang "terkenal" di komunitas Elixir mendukung pendekatan seperti ini dan aktif mengembangkannya
Ada komentar lain yang menyoroti masalah keamanan penggunaan NIFs
Artikelnya sangat informatif. Bagus karena dijelaskan dengan jelas bahwa Pythonx bukan sekadar pemanggilan subprocess, melainkan berjalan di proses yang sama
Senang melihat Elixir mulai mengejar ketertinggalan, meskipun sebenarnya lebih cocok untuk perang AI dibanding JavaScript dan Python
Masuk dari Python ke ekosistem Elixir/Erlang selalu terasa terlalu sulit, tetapi dengan Pythonx pembelajaran bertahap tampak jauh lebih memungkinkan
Elixir punya beberapa fitur yang saya harap ada di Python
|>, immutability sejati, paralelisme dan konkurensi sejati berkat supervision tree, hot code reloading, dan fault toleranceSebagai seseorang yang sangat terlibat dengan Elixir dan banyak menggunakan Python, ini terasa sangat praktis
Proyek dan posting blog ini terasa seperti dibuat khusus untuk saya. Ingin segera mencobanya, terima kasih