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

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

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

?为什么将飞镖和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]删除
最新教程 更多>
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-01
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-01
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-07-01
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-07-01
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-01
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-01
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-07-01
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-01
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-01
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-01
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。本文深入研究了eval()和ast.literal_eval()之间的差异,突出显示其安全性含义...
    编程 发布于2025-07-01
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-07-01
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-01
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-07-01
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-01

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

Copyright© 2022 湘ICP备2022001581号-3