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

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

Nov 23, 2024 pm 01:50 PM

?機械学習に 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptエンジン:実装の比較 JavaScriptエンジン:実装の比較 Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへ:すべてがどのように機能するか C/CからJavaScriptへ:すべてがどのように機能するか Apr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

See all articles