”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用C ++ FFI从DART运行JAX程序

使用C ++ FFI从DART运行JAX程序

发布于2025-03-23
浏览:429

?为什么将飞镖和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]删除
最新教程 更多>
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-03-26
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-03-26
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-03-26
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-03-26
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-03-26
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-03-26
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-03-26
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-03-26
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-03-26
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-03-26
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-26
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-03-26
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-03-26
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-03-26
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-03-26

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3