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

?機械学習に 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);  
  }  
}  
</foocfunc>

コンソールに 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 までご連絡ください。
JavaScriptの文字列文字を交換しますJavaScriptの文字列文字を交換しますMar 11, 2025 am 12:07 AM

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

jQuery日付が有効かどうかを確認しますjQuery日付が有効かどうかを確認しますMar 01, 2025 am 08:51 AM

単純なJavaScript関数は、日付が有効かどうかを確認するために使用されます。 関数isvaliddate(s){ var bits = s.split( '/'); var d = new Date(bits [2] '/' bits [1] '/'ビット[0]); return !!(d &&(d.getmonth()1)== bits [1] && d.getdate()== number(bits [0])); } //テスト var

jQueryは要素のパディング/マージンを取得しますjQueryは要素のパディング/マージンを取得しますMar 01, 2025 am 08:53 AM

この記事では、jQueryを使用して、DOM要素の内側のマージン値とマージン値、特に外側の縁と要素の内側の縁の特定の位置を取得して設定する方法について説明します。 CSSを使用して要素の内側と外側の縁を設定することは可能ですが、正確な値を取得するのは難しい場合があります。 // 設定 $( "div.header")。css( "margin"、 "10px"); $( "div.header")。css( "padding"、 "10px"); このコードはそうだと思うかもしれません

10 jQuery Accordionsタブ10 jQuery AccordionsタブMar 01, 2025 am 01:34 AM

この記事では、10個の例外的なjQueryタブとアコーディオンについて説明します。 タブとアコーディオンの重要な違いは、コンテンツパネルの表示方法と非表示にあります。これらの10の例を掘り下げましょう。 関連記事:10 jQueryタブプラグイン

10 jqueryプラグインをチェックする価値があります10 jqueryプラグインをチェックする価値がありますMar 01, 2025 am 01:29 AM

ウェブサイトのダイナミズムと視覚的な魅力を高めるために、10の例外的なjQueryプラグインを発見してください!このキュレーションされたコレクションは、画像アニメーションからインタラクティブなギャラリーまで、多様な機能を提供します。これらの強力なツールを探りましょう。 関連投稿: 1

ノードとHTTPコンソールを使用したHTTPデバッグノードとHTTPコンソールを使用したHTTPデバッグMar 01, 2025 am 01:37 AM

HTTP-Consoleは、HTTPコマンドを実行するためのコマンドラインインターフェイスを提供するノードモジュールです。 Webサーバー、Web Servに対して作成されているかどうかに関係なく、HTTPリクエストで何が起こっているかをデバッグして正確に確認するのに最適です

カスタムGoogle検索APIセットアップチュートリアルカスタムGoogle検索APIセットアップチュートリアルMar 04, 2025 am 01:06 AM

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

jQueryはscrollbarをdivに追加しますjQueryはscrollbarをdivに追加しますMar 01, 2025 am 01:30 AM

次のjQueryコードスニペットを使用して、Divコンテンツがコンテナ要素領域を超えたときにスクロールバーを追加できます。 (デモンストレーションはありません、それを直接firebugにコピーしてください) // d =ドキュメント // w =ウィンドウ // $ = jQuery var contentarea = $(this)、 wintop = contentarea.scrolltop()、 docheight = $(d).height()、 winheight = $(w).height()、 divheight = $( '#c

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。