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

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

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

?为什么将飞镖和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]删除
最新教程 更多>
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-05-12
  • input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It?

output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It? output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    mysqli_query()期望参数1是mysqli,resource给定的,尝试使用mysql Query进行执行MySQLI_QUERY_QUERY formation,be be yessqli:sqli:sqli:sqli:sqli:sqli:sqli: mysqli,给定的资源“可能发...
    编程 发布于2025-05-12
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-12
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-05-12
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-12
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-05-12
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-05-12
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php PHP陷入困境。使用simplexmlelement :: attributes()函数提供了简单的解决方案。此函数可访问对XML元素作为关联数组的属性: - > attributes()为$ attributeName => $ attributeValue){ echo ...
    编程 发布于2025-05-12
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-05-12
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-12
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-05-12
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-05-12
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_rename() runkit_function_redefine() //重新定义'this'以返回“新和改...
    编程 发布于2025-05-12
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-05-12
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-05-12

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

Copyright© 2022 湘ICP备2022001581号-3