」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用C ++ FFI從DART運行JAX程序

使用C ++ FFI從DART運行JAX程序

發佈於2025-03-23
瀏覽:857

?为什么将飞镖和JAX结合起来进行机器学习?

构建应用程序时,选择正确的工具至关重要。您需要高性能,易于开发和无缝的跨平台部署。流行框架提供权衡:

  • C 提供了速度,但可以减慢开发的速度。
  • dart (带有flutter)的速度较慢,但​​简化了内存管理和跨平台开发。

,但这是捕获:大多数框架缺乏强大的本机机器学习(ML)支持。之所以存在此差距,是因为这些框架早于AI繁荣。问题是:

我们如何有效地将ML集成到应用程序中? (例如

onnx runtime

)允许导出ML模型以进行应用程序集成,但它们对CPU的优化尚未优化,也没有足够灵活地用于广义算法。 [2

启用编写优化的ML和通用算法。

在CPU,GPU和TPU上提供平台 - 无关执行。

支持
  • 之类的尖端功能。
  • 在本文中,我们将向您展示:
  • 在Python中编写JAX程序。 生成XLA规格。

?什么是JAX?
  1. JAX
  2. 就像类固醇上的numpy。它是由Google开发的,是一个低级,高性能的库,使ML易于访问但功能强大。
  3. platform agnostic :代码在CPU,GPU和TPU上运行而无需修改。

:由XLA编译器提供动力,JAX优化并加速执行。

灵活性:非常适合ML模型和一般算法。

    这是一个比较numpy和jax的示例:
  • #numpy版本 导入numpy作为NP def tays_numpy(): a = np.empty(1000000) a [:] = 1 返回 #JAX版本 导入jax.numpy作为jnp 导入JAX @jax.jit def tays_jax(): a = jnp.empty(1000000) 返回a.at [:]。集(1)
  • :jax比numpy快。
  • tpu
  • :由于数据传输成本,大型模型的加速变得明显。


这种灵活性和速度使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)  

    ?将Jax带入生产
  • 云微服务与本地部署
  • :容器Python微服务非常适合基于云的计算。
local

:运送Python解释器对于本地应用程序不是理想的选择。


解决方案:利用JAX的XLA汇编 Running a JAX Program from Dart Using C   FFI

hlo(高级优化器)规范
,可以使用

在Python中编写算法。

    通过C库在本地运行它们。
  • 通过 ffi(erution function界面)
  • 集成。
  • ✍️逐步集成

1。产生HLO原型

编写您的JAX函数并导出其HLO表示。例如: 导入jax.numpy作为jnp def fn(x,y,z): 返回jnp.dot(x,y) / z

要生成hlo,请使用jax存储库中的
  1. ”),(“ Y”,“ F32 [2,2“)”'\ -contants'{“ z”:2.0}'\ -ir_format hlo \ -ir_human_dest /tmp/fn_hlo.txt \ -ir_dest /tmp/fn_hlo.pb
  2. 将结果文件(fn_hlo.txt和fn_hlo.pb)放入您的应用程序的资产目录中。
  3. 2。构建C动态库 修改JAX的C示例代码
克隆JAX存储库,并导航到
jax/umexpess/jax_cpp

添加一个main.h头文件:


#ifndef main_h #define main_h 外部“ c” { int bar(int foo); } #endif
import jax.numpy as jnp  

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

更新构建文件以创​​建共享库:

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


Bazel构建示例/jax_cpp:jax

您会在输出目录中找到编译的libjax.dylib。

3。使用FFI与C连接DART

使用DART的 FFI软件包

与C库进行通信。创建一个jax.dart文件:
  • 导入'dart:ffi'; 导入'软件包:dynamic_library/dynamic_library.dart'; typedef foocfunc = int32函数(int32 bar); typedef foodArtFunc = int函数(int bar); jax类{ 最终动态dylib晚期; jax(){ dylib = loaddynamiclibrary(库名:'jax'); } 函数获取_bar => dylib.lookupfunction ('bar'); int bar(int foo){ 返回_bar(foo); } }
#ifndef MAIN_H  
#define MAIN_H  

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

#endif  
  • final jax = jax(); 打印(jax.bar(42)); 您将在控制台中查看C库中的输出。
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  

在此设置中,您可以:

bazel build examples/jax_cpp:jax  

本地运行强大的算法。


潜在用例包括:

搜索算法
(例如,a*)。

# 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)  
组合优化

(例如,调度)。

final jax = JAX();  
print(jax.bar(42));  
(例如,边缘检测)。


我们正在建立一个具有无限聊天令牌和长期内存的尖端AI平台,以确保随着时间的流逝而发展的无缝,上下文感知的互动。

它是完全免费的,您也可以在当前的IDE中尝试。

版本聲明 本文轉載於:https://dev.to/nikl/running-a-jax-program-from-dart-using-c-ffi-45po?1如有侵犯,請聯繫[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3