使用 C FFI 從 Dart 執行 JAX 程序
?為什麼要將 Dart 和 JAX 結合起來進行機器學習?
建立應用程式時,選擇正確的工具至關重要。您需要高效能、輕鬆開發和無縫跨平台部署。流行的框架提供了權衡:
- C 提供速度,但會減慢開發速度。
- Dart(與 Flutter 一起)速度較慢,但簡化了記憶體管理和跨平台開發。
但問題是:大多數框架缺乏強大的原生機器學習 (ML) 支援。這種差距的存在是因為這些框架早於人工智慧繁榮。問題是:
我們如何有效地將機器學習整合到應用程式中?
諸如ONNX Runtime之類的常見解決方案允許導出ML模型以進行應用程式集成,但它們沒有針對CPU進行最佳化,也沒有足夠靈活以適應通用演算法。
輸入JAX,一個Python庫,它:
- 允許編寫最佳化的機器學習和通用演算法。
- 在 CPU、GPU 和 TPU 上提供與平台無關的執行。
- 支援autograd和JIT編譯等尖端功能。
在本文中,我們將向您展示如何:
- 用 Python 寫 JAX 程式。
- 產生 XLA 規格。
- 使用 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 成為性能至關重要的生產環境的理想選擇。
?️ 將 JAX 投入生產
雲端微服務與本地部署
- 雲端:容器化 Python 微服務非常適合基於雲端的運算。
- 本地:發布 Python 解釋器對於本機應用程式來說並不理想。
解:利用 JAX 的 XLA 編譯
JAX 將 Python 程式碼翻譯成 HLO(高階最佳化器)規格,可以使用 C XLA 函式庫編譯和執行。這使得:
- 用 Python 寫演算法。
- 透過 C 庫本地運行它們。
- 透過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); } }
您將在控制台中看到 C 庫的輸出。
?下一步
透過此設置,您可以:
- 使用 JAX 和 XLA 最佳化 ML 模型。
- 在本地運行強大的演算法。
潛在用例包括:
- 搜尋演算法(例如,A*)。
- 組合最佳化(例如調度)。
- 影像處理(例如邊緣偵測)。
JAX 彌合了基於 Python 的開發和生產級效能之間的差距,讓 ML 工程師能夠專注於演算法,而無需擔心低階 C 程式碼。
我們正在建立一個尖端的人工智慧平台,具有無限的聊天令牌和長期記憶,確保隨著時間的推移而不斷發展的無縫、上下文感知互動。
它是完全免費的,您也可以在當前的 IDE 中嘗試它。
以上是使用 C FFI 從 Dart 執行 JAX 程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。
