ホームページ >ウェブフロントエンド >jsチュートリアル >C FFI を使用して Dart から JAX プログラムを実行する

C FFI を使用して Dart から JAX プログラムを実行する

Barbara Streisand
Barbara Streisandオリジナル
2024-11-23 13:50:101044ブラウズ

?機械学習に Dart と JAX を組み合わせる理由

アプリケーションを構築するときは、適切なツールを選択することが重要です。高いパフォーマンス、簡単な開発、シームレスなクロスプラットフォーム展開が必要です。一般的なフレームワークにはトレードオフがあります:

  • C は速度を提供しますが、開発が遅くなる可能性があります。
  • Dart (Flutter を使用) は遅いですが、メモリ管理とクロスプラットフォーム開発が簡素化されます。

しかし、ここに問題があります。ほとんどのフレームワークには、堅牢な ネイティブ機械学習 (ML) サポートが欠けています。このギャップが存在するのは、これらのフレームワークが AI ブームよりも前から存在しているためです。質問は次のとおりです:

ML をアプリケーションに効率的に統合するにはどうすればよいですか?

ONNX ランタイム などの一般的なソリューションでは、アプリケーション統合用に ML モデルをエクスポートできますが、CPU 向けに最適化されておらず、一般化されたアルゴリズムに対して十分な柔軟性もありません。

JAX と入力します。これは、次のような Python ライブラリです。

  • 最適化された ML および汎用アルゴリズムを作成できるようにします。
  • CPU、GPU、TPU 上でプラットフォームに依存しない実行を提供します。
  • autogradJIT コンパイル などの最先端の機能をサポートします。

この記事では、次の方法を説明します。

  1. Python で JAX プログラムを作成します。
  2. XLA 仕様を生成します。
  3. C FFI を使用して最適化された JAX コードを Dart にデプロイします。

?ジャックスとは何ですか?

JAX はステロイドを強化した NumPy のようなものです。 Google によって開発された、ML を使いやすく強力にする低レベルの高性能ライブラリです。

  • プラットフォームに依存しない: コードは変更せずに CPU、GPU、TPU 上で実行されます。
  • 速度: XLA コンパイラーを利用して、JAX は実行を最適化し、高速化します。
  • 柔軟性: ML モデルと一般的なアルゴリズムの両方に最適です。

これは NumPy と JAX を比較する例です:

# NumPy version
import numpy as np  
def assign_numpy():  
  a = np.empty(1000000)  
  a[:] = 1  
  return a  

# JAX version
import jax.numpy as jnp  
import jax  

@jax.jit  
def assign_jax():  
  a = jnp.empty(1000000)  
  return a.at[:].set(1)  

Google Colab でのベンチマークにより、JAX のパフォーマンスの優位性が明らかになります:

  • CPU と GPU: JAX は NumPy よりも高速です。
  • TPU: データ転送コストのため、大規模なモデルでは速度の向上が顕著になります。

この柔軟性と速度により、JAX はパフォーマンスが重要な運用環境に最適です。


Running a JAX Program from Dart Using C   FFI


⁉️ JAX を本番環境に導入する

クラウド マイクロサービス vs. ローカル デプロイメント

  • クラウド: コンテナ化された Python マイクロサービスは、クラウドベースのコンピューティングに最適です。
  • ローカル: Python インタープリターの配布は、ローカル アプリには理想的ではありません。

解決策: JAX の XLA コンパイルを活用する

JAX は、Python コードを HLO (高レベル オプティマイザー) 仕様 に変換します。これは、C XLA ライブラリ を使用してコンパイルおよび実行できます。これにより以下が可能になります:

  1. Python でアルゴリズムを作成します。
  2. C ライブラリを介してネイティブに実行します。
  3. FFI (Foreign Function Interface) を介して Dart と統合します。

✍️ 段階的な統合

1. HLO プロトを生成する

JAX 関数を作成し、その HLO 表現をエクスポートします。例:

# NumPy version
import numpy as np  
def assign_numpy():  
  a = np.empty(1000000)  
  a[:] = 1  
  return a  

# JAX version
import jax.numpy as jnp  
import jax  

@jax.jit  
def assign_jax():  
  a = jnp.empty(1000000)  
  return a.at[:].set(1)  

HLO を生成するには、JAX リポジトリの jax_to_ir.py スクリプトを使用します。

import jax.numpy as jnp  

def fn(x, y, z):  
  return jnp.dot(x, y) / z  

結果のファイル (fn_hlo.txt および fn_hlo.pb) をアプリのアセット ディレクトリに配置します。


2. C ダイナミック ライブラリを構築する

JAX の C サンプル コードを変更する

JAX リポジトリのクローンを作成し、jax/examples/jax_cpp に移動します。

  • main.h ヘッダー ファイルを追加します。
python jax_to_ir.py \
  --fn jax_example.prog.fn \
  --input_shapes '[("x", "f32[2,2]"), ("y", "f32[2,2")]' \
  --constants '{"z": 2.0}' \
  --ir_format HLO \
  --ir_human_dest /tmp/fn_hlo.txt \
  --ir_dest /tmp/fn_hlo.pb
  • BUILD ファイルを更新して、共有ライブラリを作成します。
#ifndef MAIN_H  
#define MAIN_H  

extern "C" {  
  int bar(int foo);  
}  

#endif  

Bazel でコンパイルします:

cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  

コンパイルされた libjax.dylib が出力ディレクトリにあります。


3. FFIを使用してDartとCを接続する

C ライブラリと通信するには、Dart の FFI パッケージ を使用します。 jax.dart ファイルを作成します:

bazel build examples/jax_cpp:jax  

プロジェクト ディレクトリにダイナミック ライブラリを含めます。次のコマンドでテストしてください:

import 'dart:ffi';  
import 'package:dynamic_library/dynamic_library.dart';  

typedef FooCFunc = Int32 Function(Int32 bar);  
typedef FooDartFunc = int Function(int bar);  

class JAX {  
  late final DynamicLibrary dylib;  

  JAX() {  
    dylib = loadDynamicLibrary(libraryName: 'jax');  
  }  

  Function get _bar => dylib.lookupFunction<FooCFunc, FooDartFunc>('bar');  

  int bar(int foo) {  
    return _bar(foo);  
  }  
}  

コンソールに C ライブラリからの出力が表示されます。


?次のステップ

この設定により、次のことが可能になります:

  • JAX と XLA を使用して ML モデルを最適化します。
  • 強力なアルゴリズムをローカルで実行します。

考えられる使用例は次のとおりです:

  • 検索アルゴリズム (例: A*)。
  • 組み合わせ最適化 (例: スケジューリング)。
  • 画像処理 (エッジ検出など)。

JAX は、Python ベースの開発と運用レベルのパフォーマンスの間のギャップを埋め、ML エンジニアが低レベルの C コードを気にせずにアルゴリズムに集中できるようにします。


私たちは、無制限のチャット トークンと長期記憶を備えた最先端の AI プラットフォームを構築し、時間の経過とともに進化するシームレスでコンテキストを認識した対話を保証します。

完全に無料で、現在の IDE 内でも試すことができます。


Running a JAX Program from Dart Using C   FFI

以上がC FFI を使用して Dart から JAX プログラムを実行するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。