10 poin oleh GN⁺ 2025-02-28 | 2 komentar | Bagikan ke WhatsApp
  • 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 pytesseract dapat digunakan untuk melakukan Optical Character Recognition (OCR)
  • Setelah mengunduh gambar dengan req, Python dan dependensinya diunduh serta diinisialisasi melalui pemanggilan Pythonx.uv_init/1
  • Pythonx.eval/2 digunakan 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 Pythonx dipanggil 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/3 atau 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

 
aer0700 2025-03-01

Numpy memang sangat bagus...

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

    • Di server produksi, penggunaan Pythonx bisa agak berisiko. Karena berjalan di proses OS yang sama dengan aplikasi Elixir, ini melewati kemampuan pemulihan kegagalan yang kuat dari aplikasi Elixir/BEAM
    • Secara umum, aplikasi Elixir memiliki supervision tree yang dapat menangani kegagalan proses BEAM-nya sendiri dengan anggun, dan ini adalah keunggulan besar bahasa seperti Elixir, Erlang, dan Gleam
    • Saat menggunakan NIFs, jika terjadi exception yang tidak tertangani di Pythonx, seluruh proses OS dan semua proses BEAM bisa berhenti
    • Rustler adalah wrapper NIF yang populer untuk Rust di Elixir, dan meskipun ada kasus di mana NIFs sangat berguna, risikonya bisa menghentikan seluruh aplikasi tetap perlu dipertimbangkan
    • Menjalankan kode native lain seperti Python atau Rust dengan menggunakan Ports lebih rendah risikonya dalam hal ini
  • Senang melihat orang-orang yang "terkenal" di komunitas Elixir mendukung pendekatan seperti ini dan aktif mengembangkannya

    • VM dan runtime sangat cocok untuk mengoordinasikan bahasa dan teknologi dengan runtime lain, sehingga terasa seperti ada jalur standar dan jalur offload
    • Perbedaan antara ide offload yang "terlihat berbahaya" dan eksekusi yang aman sering kali hanya soal beban kerja, tetapi runtime mendorong hal ini
    • Karena ini adalah NIF, memang ada sedikit risiko, tetapi bisa didistribusikan dengan membuat instance BEAM terpisah dan menjalankannya lewat sana
  • Ada komentar lain yang menyoroti masalah keamanan penggunaan NIFs

    • Scheduler Erlang VM tidak bisa melakukan preemption terhadap NIF, sehingga pemanggilan Python yang berjalan lama berisiko menghentikan VM
    • GIL mencegah eksekusi Python secara bersamaan, tetapi pemanggil Erlang bisa menjalankan beberapa interpreter Python, jadi ini bukan masalah pada Ports
  • Artikelnya sangat informatif. Bagus karena dijelaskan dengan jelas bahwa Pythonx bukan sekadar pemanggilan subprocess, melainkan berjalan di proses yang sama

    • Akan lebih baik jika ditambahkan contoh pemanggilan fungsi yang didefinisikan di Python dari Elixir
  • Senang melihat Elixir mulai mengejar ketertinggalan, meskipun sebenarnya lebih cocok untuk perang AI dibanding JavaScript dan Python

    • Saya suka keputusan awal untuk membangun fondasi ML Elixir dari nol, tetapi bagus juga sekarang ada cara untuk memanfaatkan library Python yang berkembang sangat cepat
  • Masuk dari Python ke ekosistem Elixir/Erlang selalu terasa terlalu sulit, tetapi dengan Pythonx pembelajaran bertahap tampak jauh lebih memungkinkan

    • Saya penasaran apakah mereka sudah bereksperimen dengan free-threading untuk masalah GIL di Python
  • Elixir punya beberapa fitur yang saya harap ada di Python

    • atom, hampir semua hal berupa macro, pipe |>, immutability sejati, paralelisme dan konkurensi sejati berkat supervision tree, hot code reloading, dan fault tolerance
  • Sebagai seseorang yang sangat terlibat dengan Elixir dan banyak menggunakan Python, ini terasa sangat praktis

    • Saya malah lebih tertarik pada library Fine yang memudahkan pembuatan C++ NIFs
  • Proyek dan posting blog ini terasa seperti dibuat khusus untuk saya. Ingin segera mencobanya, terima kasih