搜索
首页web前端js教程使用 C FFI 从 Dart 运行 JAX 程序

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

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

  • C 提供速度,但会减慢开发速度。
  • Dart(与 Flutter 一起)速度较慢,但​​简化了内存管理和跨平台开发。

但问题是:大多数框架缺乏强大的原生机器学习 (ML) 支持。这种差距的存在是因为这些框架早于人工智能繁荣。问题是:

我们如何有效地将机器学习集成到应用程序中? ​​

诸如ONNX Runtime之类的常见解决方案允许导出ML模型以进行应用程序集成,但它们没有针对CPU进行优化,也没有足够灵活以适应通用算法。

输入JAX,一个Python库,它:

  • 允许编写优化的机器学习和通用算法。
  • 在 CPU、GPU 和 TPU 上提供与平台无关的执行。
  • 支持诸如autogradJIT编译等尖端功能。

在本文中,我们将向您展示如何:

  1. 用 Python 编写 JAX 程序。
  2. 生成 XLA 规格。
  3. 使用 C FFI 在 Dart 中部署优化的 JAX 代码。

?什么是JAX?

JAX 就像类固醇上的 NumPy。它由 Google 开发,是一个低级高性能库,使 ML 易于访问且功能强大。

  • 与平台无关:代码无需修改即可在 CPU、GPU 和 TPU 上运行。
  • 速度:JAX 由 XLA 编译器提供支持,优化并加速执行。
  • 灵活性:非常适合机器学习模型和通用算法。

这是一个比较 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 投入生产

云微服务与本地部署

  • :容器化 Python 微服务非常适合基于云的计算。
  • 本地:发布 Python 解释器对于本地应用程序来说并不理想。

解决方案:利用 JAX 的 XLA 编译

JAX 将 Python 代码翻译成 HLO(高级优化器)规范,可以使用 C XLA 库编译和执行。这使得:

  1. 用 Python 编写算法。
  2. 通过 C 库本地运行它们。
  3. 通过FFI(外部函数接口) 与 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 连接

使用 Dart 的 FFI 包 与 C 库通信。创建一个 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 代码。


我们正在构建一个尖端的人工智能平台,具有无限的聊天令牌和长期记忆,确保随着时间的推移而不断发展的无缝、上下文感知交互。

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


Running a JAX Program from Dart Using C   FFI

以上是使用 C FFI 从 Dart 运行 JAX 程序的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在JavaScript中替换字符串字符在JavaScript中替换字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

自定义Google搜索API设置教程自定义Google搜索API设置教程Mar 04, 2025 am 01:06 AM

本教程向您展示了如何将自定义的Google搜索API集成到您的博客或网站中,提供了比标准WordPress主题搜索功能更精致的搜索体验。 令人惊讶的是简单!您将能够将搜索限制为Y

示例颜色json文件示例颜色json文件Mar 03, 2025 am 12:35 AM

本文系列在2017年中期进行了最新信息和新示例。 在此JSON示例中,我们将研究如何使用JSON格式将简单值存储在文件中。 使用键值对符号,我们可以存储任何类型的

构建您自己的Ajax Web应用程序构建您自己的Ajax Web应用程序Mar 09, 2025 am 12:11 AM

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

8令人惊叹的jQuery页面布局插件8令人惊叹的jQuery页面布局插件Mar 06, 2025 am 12:48 AM

利用轻松的网页布局:8个基本插件 jQuery大大简化了网页布局。 本文重点介绍了简化该过程的八个功能强大的JQuery插件,对于手动网站创建特别有用

什么是这个&#x27;在JavaScript?什么是这个&#x27;在JavaScript?Mar 04, 2025 am 01:15 AM

核心要点 JavaScript 中的 this 通常指代“拥有”该方法的对象,但具体取决于函数的调用方式。 没有当前对象时,this 指代全局对象。在 Web 浏览器中,它由 window 表示。 调用函数时,this 保持全局对象;但调用对象构造函数或其任何方法时,this 指代对象的实例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。这些方法使用给定的 this 值和参数调用函数。 JavaScript 是一门优秀的编程语言。几年前,这句话可

通过来源查看器提高您的jQuery知识通过来源查看器提高您的jQuery知识Mar 05, 2025 am 12:54 AM

jQuery是一个很棒的JavaScript框架。但是,与任何图书馆一样,有时有必要在引擎盖下发现发生了什么。也许是因为您正在追踪一个错误,或者只是对jQuery如何实现特定UI感到好奇

10张移动秘籍用于移动开发10张移动秘籍用于移动开发Mar 05, 2025 am 12:43 AM

该帖子编写了有用的作弊表,参考指南,快速食谱以及用于Android,BlackBerry和iPhone应用程序开发的代码片段。 没有开发人员应该没有他们! 触摸手势参考指南(PDF) Desig的宝贵资源

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用