ElixirにPythonを組み込むのは、問題ありません
(dashbit.co)- ここ数年、Elixirは Nx (Numerical Elixir) プロジェクトを通じて、機械学習とデータ分野での能力を拡張してきた
- Nx、Explorer、Axon、Bumblebee、Scholar などのプロジェクトが登場し、Python や R のエコシステムで得られた教訓をもとに発展している
- 当初は Python ライブラリに直接依存しない方針を採っていたが、それは Elixir に最適化された設計を追求し、Python 環境設定の複雑さを避けるためだった
- ところが、最近この分野で Elixir 導入 を主導しているのは Livebook である
- Elixir と Erlang の強みを基盤 に、再現性、分散実行、アプリ開発の最前線にあるノートブックプラットフォーム
- Livebook を通じて Elixir エコシステムに初めて足を踏み入れようとするチームや企業の関心が、ますます高まっている
- しかし障害もある
- Elixir と Livebook をインフラに導入しようとする企業の多くは、すでに Python ベースのワークフロー、パッケージ、リポジトリを利用している
- これは、この選択のために Elixir で同等のパッケージを探すか最初から書き直す必要があることを意味し、データスタックに Elixir を追加する際のリスクとコストを高めることになる
- これを解決するために、Erlang VM 内に Python インタプリタを組み込む Pythonx を発表した
Pythonx
- Pythonx は、Elixir と Python 間の自動データ変換、コード評価、仮想環境管理機能を提供する
- Optical Character Recognition(OCR)を実行するために
pytesseractパッケージを利用できる reqを使って画像をダウンロードした後、Pythonx.uv_init/1を呼び出して Python と依存関係をダウンロードして初期化するPythonx.eval/2を使って Python コードを実行し、その結果を Elixir の文字列に変換する
内部構造
- Python の CPython 参照実装は、他のアプリケーションに組み込むことができる
- Python インタプリタの中核機能は C ライブラリとして提供されている
- C/C++ アプリケーションはそのライブラリをリンクし、API を使ってコードを実行したりオブジェクトと相互作用したりできる
- Elixir は Erlang NIFs を通じて C/C++ との相互運用性を提供する
- Pythonx は NIFs を活用して Python を組み込み、同一の OS プロセスで動作する
- Python と Elixir の間のデータ受け渡しは効率的に行われる
Livebook の多言語サポート
- Pythonx をベースに、Livebook での Python サポート追加が進められている
- 同じノートブック内で Elixir と Python が相互にやり取りできるようになる
- Livebook は Python と依存関係を自動でインストールし、Elixir と Python の変数間の変換を管理する
- 再現可能な環境を保証する
- 現在はコード補完やドキュメント化などの追加作業が進められており、Livebook nightly をダウンロードして利用できる
利用時の考慮事項と代替手段
- Pythonx の主な目的は、Livebook やスクリプト内で Python ワークフローを統合することにある
- Python のグローバルインタプリタロック(GIL)により、複数の Elixir プロセスから
Pythonxを呼び出す場合に並行性が制限される可能性がある - 単一の Elixir プロセスから呼び出すか、Python ライブラリが同時呼び出しを処理できるかを確認する必要がある
- 代替として、
System.cmd/3または Port を使って複数の Python プロセスを管理できる - AI ワークフローでは、Bumblebee を通じて事前学習済みモデルを実行できる
- Ortex を活用して ONNX モデルを実行できる
- LLM については、サードパーティ API を使うか、オンプレミスで Llama.cpp の Docker コンテナを実行できる
- HTTP ベースのインターフェースを使う場合は、Elixir の Instructor や LangChain などのツールを活用できる
Fine プロジェクト
- Pythonx は NIFs を使って実装されている
- NIFs は C で実装された Elixir 関数であり、多くのボイラープレートコードを必要とする
- メモリ管理やエラー処理には複雑さがある
- これを解決するため、C++ ベースの Fine ライブラリが開発された
- Fine はデータ構造変換の自動処理、リソースオブジェクトの安全な管理、例外発生機能を提供する
- NIF 作成時のコード量を大幅に減らすことができる
結論
- Numerical Elixir プロジェクトの目標は、Elixir がデータおよび機械学習エコシステムの中で独自のアイデンティティを持つようにすることにある
- 現在は相互運用性を主要な目標としている
- Pythonx は Elixir に Python を組み込み、両言語間の透過的な相互変換を可能にする
2件のコメント
NumPyは本当に最高です…
Hacker Newsの意見
Livebook の機能は非常にすばらしい。Elixir から C++ NIFs を通じて CPython を直接呼び出し、Elixir ネイティブのデータ構造を返す点がクリーン
Elixir コミュニティの「よく知られた」人たちがこのアプローチを支持し、積極的に開発しているのを見るのは良いこと
NIFs 使用の安全性の問題を指摘した別のコメントもある
とても有益な記事。Pythonx が単なるサブプロセス呼び出しではなく、同一プロセス内で動作することを明確に書いているのが良い
Elixir が AI 戦争において JavaScript や Python より適しているにもかかわらず、出遅れているのを見るのはうれしい
Python から Elixir/Erlang エコシステムへ入るのは難しすぎると感じていたが、Pythonx によって段階的な学習がずっと現実的に見える
Elixir には、Python にもあってほしい機能がいくつかある
|>、真の不変性、監督ツリーによる真の並列性と並行性、ホットコードリロード、耐障害性Elixir に深く関わり、Python を多用してきた人間として、非常に実用的だと思う
このプロジェクトとブログ記事は、自分のために作られたかのように感じる。試してみたい、ありがとう