jax-js

GitHub
773 42 非常简单 1 次阅读 2天前MIT开发框架
AI 解读 由 AI 自动生成,仅供参考

jax-js 是一款专为浏览器打造的机器学习框架,旨在让开发者直接在网页端运行高性能的数值计算与 AI 模型。它成功解决了传统机器学习依赖后端服务器或复杂环境配置的痛点,无需安装任何外部依赖,即可利用用户的本地 CPU 和 GPU 资源进行高效运算。

这款工具非常适合前端开发者、算法研究人员以及希望构建交互式 AI 演示的教育工作者。其核心亮点在于完美复刻了 Python 生态中 JAX 和 NumPy 的 API 风格,让熟悉科学计算的开发者能无缝迁移技能。在技术底层,jax-js 从零构建,能将数组操作自动编译为 WebAssembly 和 WebGPU 内核,从而在浏览器中实现极致的执行速度。它不仅支持自动微分、JIT 即时编译等高级特性,还具备极高的便携性——只要有现代浏览器(包括移动端),就能流畅运行神经网络训练、语音克隆甚至流体模拟等复杂任务。凭借小巧的体积和对最新图形标准的广泛支持,jax-js 正成为推动“浏览器即算力平台”的重要力量。

使用场景

一家教育科技团队希望在浏览器中构建一个无需后端支持的交互式神经网络教学平台,让学生能实时调整参数并立刻看到模型训练效果。

没有 jax-js 时

  • 依赖沉重后端:所有矩阵运算和梯度计算必须发送到服务器,导致高延迟,学生操作后需等待数秒才能看到反馈,打断学习心流。
  • 部署复杂昂贵:需要维护昂贵的 GPU 集群来处理并发推理请求,且必须为不同设备适配多套后端接口,运维成本极高。
  • 功能受限:由于 TensorFlow.js 缺乏完整的 Hessian(海森矩阵)等高级微分功能,无法演示复杂的二阶优化算法,教学内容被迫简化。
  • 包体积过大:引入完整的深度学习框架导致首屏加载超过 2MB,在弱网环境下学生几乎无法打开页面。

使用 jax-js 后

  • 纯前端实时响应:利用 WebGPU 直接在学生浏览器中进行高性能并行计算,参数调整后毫秒级重绘训练曲线,实现真正的“所见即所得”。
  • 零后端成本:计算压力完全转移至客户端,服务器仅需托管静态网页,彻底消除了 GPU 集群开销,支持无限并发访问。
  • 完整科研级能力:借助与 JAX/NumPy 高度兼容的 API,轻松实现自动微分、雅可比矩阵及海森矩阵计算,完整复现大学教材中的高级优化案例。
  • 极致轻量便携:核心库压缩后仅 80KB,无外部依赖,无论是老旧笔记本还是新款 iPad,只要打开浏览器即可流畅运行复杂模型。

jax-js 将原本需要云端算力支撑的科研级机器学习能力,变成了任何浏览器都能即时运行的轻量级交互体验。

运行环境要求

操作系统
  • 未说明 (基于浏览器运行,支持 Windows
  • macOS
  • Linux
  • iOS
  • Android 等任何现代浏览器平台)
GPU
  • 非必需
  • 可选 WebGPU 后端 (需 Chrome/Edge, Firefox/Safari macOS 26+, iOS 26+ 等最新浏览器) 或 WebGL 后端
  • 无需特定显卡型号、显存大小或 CUDA 版本
内存

未说明 (取决于浏览器环境和具体模型大小)

依赖
notes该工具为纯 JavaScript 编写,零外部依赖,可直接在浏览器 (通过 CDN) 或 Node.js/Deno 环境中运行。核心特性包括自动微分 (grad)、JIT 编译和向量化 (vmap)。由于 JavaScript 内存管理机制限制,使用时需手动管理数组的引用计数 (使用 .ref 或 .dispose()) 以防止内存泄漏。支持 Float64, Float32, Float16 等多种精度。
python不需要 (纯 JavaScript/TypeScript 库)
jax-js hero image

快速开始

jax-js:纯 JavaScript 中的 JAX

官网 | API 参考文档 | 兼容性表格 | Discord 社区

jax-js 是一个面向浏览器的机器学习框架。它的目标是将 JAX 风格的高性能 CPU 和 GPU 内核引入 JavaScript,从而让你能够在网页上运行数值计算应用。

npm i @jax-js/jax

在底层实现中,它会将数组操作转换为编译器中间表示,然后利用 WebAssembly 和 WebGPU 合成内核代码。

该库完全从零开始编写,没有任何外部依赖。它与 NumPy/JAX 保持高度的 API 兼容性。由于所有计算都在客户端进行,jax-js 很可能是目前最便携的 GPU 机器学习框架,因为它可以在任何支持浏览器的环境中运行。

快速入门

import { numpy as np } from "@jax-js/jax";

// 数组操作,与 JAX/NumPy 兼容。
const x = np.array([1, 2, 3]);
const y = x.mul(4); // [4, 8, 12]

在网页中使用(CDN)

在原生 JavaScript 环境中(无需打包工具),只需通过 <script type="module"> 标签导入即可。这是在空白 HTML 页面上快速上手的最简单方式。

<script type="module">
  import { numpy as np } from "https://esm.sh/@jax-js/jax";
</script>

平台支持情况

本表格基于各浏览器的最新版本。截至 2025 年底,WebGPU 已在大多数主流浏览器中得到广泛支持。

平台 CPU (Wasm) GPU (WebGPU) GPU (WebGL)
Chrome / Edge
Firefox ✅ - macOS 26+
Safari ✅ - macOS 26+
iOS ✅ - iOS 26+
Chrome for Android
Firefox for Android
Node.js
Deno ✅ - 异步

示例

社区使用案例:

jax-js 官网上的一些演示:

功能对比

以下是 jax-js 与其他流行 Web ML 运行时的简要对比:

特性 jax-js TensorFlow.js onnxruntime-web
概述
API 风格 JAX/NumPy 类 TensorFlow 静态 ONNX 图
最新版本 2026 ⚠️ 2024 2026
速度 最快 较快 最快
打包大小(gzip) 80 KB 269 KB 90 KB + 24 MB Wasm
自动微分与 JIT
梯度
雅可比矩阵和海森矩阵
jvp() 正向微分
jit() 内核融合
vmap() 自动向量化
图捕获
后端与数据
WebGPU 后端 🟡 预览
WebGL 后端
Wasm(CPU)后端
勇于执行的数组 API
运行 ONNX 模型 🟡 部分
读取 safetensors 文件
Float64
Float32
Float16
BFloat16
压缩 Uint8 🟡 部分
混合精度
多设备混合使用
操作与数值计算
算术函数
矩阵乘法
通用 einsum 🟡 部分 🟡 部分
排序
激活函数
NaN/Inf 数值计算
基础卷积
n 维卷积
步进/空洞卷积
Cholesky 分解、最小二乘问题
LU 分解、线性方程求解、行列式
奇异值分解
FFT
基础随机数生成(均匀分布、正态分布)
高级随机数生成

教程

jax-js 中进行编程看起来与 JAX 非常相似,只是使用 JavaScript 而已。

数组

使用 np.array() 创建一个数组:

import { numpy as np } from "@jax-js/jax";

const ar = np.array([1, 2, 3]);

默认情况下,这是一个 float32 类型的数组,但你可以指定不同的数据类型:

const ar = np.array([1, 2, 3], { dtype: np.int32 });

为了更高效地构建数组,可以从 JavaScript 的 TypedArray 缓冲区创建数组:

const buf = new Float32Array([10, 20, 30, 100, 200, 300]);
const ar = np.array(buf).reshape([2, 3]);

当你完成操作后,可以将 jax.Array 解包回 JavaScript。这也会应用任何待处理的操作或惰性更新:

// 1) 返回可能嵌套的 JavaScript 数组。
ar.js();
await ar.jsAsync(); // 更快,非阻塞

// 2) 返回扁平的 TypedArray 数据缓冲区。
ar.dataSync();
await ar.data(); // 最快,非阻塞

数组可以应用数学运算。例如:

import { numpy as np, scipySpecial as special } from "@jax-js/jax";

const x = np.arange(100).astype(np.float32); // 整数数组 [0..99]

const y1 = x.ref.add(x.ref); // x + x
const y2 = np.sin(x.ref); // sin(x)
const y3 = np.tanh(x.ref).mul(5); // 5 * tanh(x)
const y4 = special.erfc(x.ref); // erfc(x)

请注意,在上述代码中,我们使用了 x.ref。这是因为 jax-js 使用引用计数的“所有权”模型来跟踪数组内存何时可以释放。关于这一点将在下文详细说明。

引用计数

大型数组会占用大量内存。Python 的机器学习库会重写 __del__() 方法来释放内存,但 JavaScript 并没有这样的 API 来运行对象的析构函数(参考)。这意味着你必须手动跟踪引用。jax-js 尝试使这一过程尽可能地便捷,以避免在循环中意外泄漏内存。

每个 jax.Array 都有一个引用计数。它遵循以下规则:

  • 每当你创建一个数组时,它的引用计数从 1 开始。
  • 当数组的引用计数达到 0 时,它会被释放,且不能再被使用。
  • 对于一个数组 a
    • 访问 a.ref 会返回 a,并将其引用计数加 1
    • a 作为参数传递给任何函数时,其引用计数会减 1
    • 调用 a.dispose() 也会使其引用计数减 1

这意味着 jax-js 中的所有函数都必须以引用的方式“接管”它们的参数。每当你想将一个数组作为参数传递时,可以直接传递它以释放其所有权,或者使用 .ref 如果你希望稍后再使用它。

你也必须在自己的函数中遵守这些规则! 所有组合函数如 jvpgradjit 都假定你按照这些约定传递参数,并且会尊重这些约定。

// 不好:两次使用 `x`,导致其引用计数两次递减。
function foo_bad(x: np.Array, y: np.Array) {
  return x.add(x.mul(y));
}

// 好:第一次使用 `x` 是通过 `x.ref`,引用计数加 `1`。
function foo_good(x: np.Array, y: np.Array) {
  return x.ref.add(x.mul(y));
}

再看一个例子:

// 不好:在 `if` 分支中没有消耗 `x`。
function bar_bad(x: np.Array, skip: boolean) {
  if (skip) return np.zeros(x.shape);
  return x;
}

// 好:在每个分支中只消耗一次 `x`。
function bar_good(x: np.Array, skip: boolean) {
  if (skip) {
    const ret = np.zeros(x.shape);
    x.dispose();
    return ret;
  }
  return x;
}

你可以假设 jax-js 中的每一个函数都会正确地接管所有权,除了少数极罕见且已记录的情况。

grad()、vmap() 和 jit()

JAX 的可组合变换签名也在 jax-js 中得到支持。下面是一个使用 gradvmap 计算函数导数的简单示例:

import { numpy as np, grad, vmap } from "@jax-js/jax";

const x = np.linspace(-10, 10, 1000);

const y1 = vmap(grad(np.sin))(x.ref); // d/dx sin(x) = cos(x)
const y2 = np.cos(x);

np.allclose(y1, y2); // => true

jit 函数在 GPU 上执行长时间的基本操作序列时尤其有用,因为它会将多个操作融合为一次内核调度。这提高了硬件加速器上的内存带宽利用率,而 GPU 上的瓶颈往往不是浮点运算能力,而是内存带宽。例如:

export const hypot = jit(function hypot(x1: np.Array, x2: np.Array) {
  return np.sqrt(np.square(x1).add(np.square(x2)));
});

如果没有 JIT,hypot() 函数需要四次内核调度:两次乘法、一次加法和一次平方根。而 JIT 会将这些操作融合为一个内核,一次性完成所有计算。

所有函数式变换都可以接受输入和输出的类型化 JsTree。它们类似于 JAX 的 pytrees(文档),基本上就是由嵌套的 JavaScript 对象和数组组成的结构。例如:

import { grad, numpy as np } from "@jax-js/jax";

type Params = {
  foo: np.Array;
  bar: np.Array[];
};

function getSums(p: Params) {
  const fooSum = p.foo.sum();
  const barSum = p.bar.map((x) => x.sum()).reduce(np.add);
  return fooSum.add(barSum);
}

grad(getSums)({
  foo: np.array([1, 2, 3]),
  bar: [np.array([10]), np.array([11, 12])],
});
// => { foo: [1, 1, 1], bar: [[1], [1, 1]] }

请注意,你需要使用 type 别名语法而不是 interface 来定义细粒度的 JsTree 类型。

设备

与 JAX 类似,jax-js 也引入了“设备”的概念。设备是后端,用于在内存中存储数组,并决定如何在其上执行编译后的操作。

目前 jax-js 中有 4 种设备:

  • cpu:速度较慢的解释型 JavaScript 实现,仅用于调试。
  • wasm:WebAssembly,在支持 SharedArrayBuffer 的情况下可实现多线程。
  • webgpu:WebGPU,在支持的浏览器(Chrome、Firefox、Safari、iOS)上可用。
  • webgl:基于片段着色器的 WebGL2。这是一种较旧的图形 API,几乎可在所有浏览器上运行,但性能远低于 WebGPU。该选项以尽力而为的方式提供,支持程度较低。

我们推荐使用 webgpu 以获得最佳性能,尤其是在运行神经网络时。 默认设备是 wasm,但您可以在启动时更改它:

import { defaultDevice, init } from "@jax-js/jax";

const devices = await init(); // 启动所有可用的后端。

if (devices.includes("webgpu")) {
  defaultDevice("webgpu");
} else {
  console.warn("WebGPU 不受支持,将回退到 Wasm。");
}

您还可以将单个数组放置在特定设备上:

import { devicePut, numpy as np } from "@jax-js/jax";

const ar = np.array([1, 2, 3]); // 默认设备为 "wasm"
await devicePut(ar, "webgpu"); // 现在设备变为 "webgpu"

辅助库

@jax-js 命名空间下还有其他库,既可以与 jax-js 配合使用,也可以在其他项目中独立使用。

  • @jax-js/loaders 可从 Safetensors 等多种格式加载张量,包含快速且符合标准的 BPE 实现,并通过 OPFS 缓存大型资产(如模型权重)的 HTTP 请求。
  • @jax-js/onnx 是一个将 ONNX 格式模型转换为原生 jax-js 函数的模型加载器。
  • @jax-js/optax 提供 Adam 和 SGD 等优化器的实现。

性能

要在浏览器开发者工具中查看每个内核的跟踪信息,请调用 jax.profiler.startTrace()

WebGPU 运行时包含一个面向 ML 的编译器,具备分块感知优化功能,并针对不同浏览器进行了调优。此外,该库还独有 jit() 功能,可以将多个操作融合在一起并记录执行图。在 Apple M4 Max 芯片上,jax-js 在矩阵乘法运算中可达到 超过 7000 GFLOP/s 的性能(试一试)。

就该示例而言,其速度显著高于使用手写自定义内核库的 TensorFlow.js 和 ONNX Runtime Web。

不过目前仍处于早期阶段,仍有大量易于实现的优化点可供挖掘,同时也有诸如 FlashAttention 变体等独特的优化方向。

API 参考

本次简短教程到此结束。有关详细文档,请参阅生成的API 参考

开发

以下技术细节适用于参与 jax-js 的贡献以及对其内部进行修改。

本仓库由 pnpm 管理。您可以通过以下命令以监听模式编译和构建所有包:

pnpm install
pnpm run build:watch

随后,您可以使用 Vitest 在无头浏览器中运行测试:

pnpm exec playwright install
pnpm test

目前我们使用的是较旧版本的 Playwright,该版本支持在无头模式下使用 WebGPU;较新版本则会跳过 WebGPU 测试。

要启动运行网站、演示和 REPL 的 Vite 开发服务器:

pnpm -C website dev

您还可以通过以下命令运行代码检查工具、代码格式化工具和类型检查工具:

pnpm lint          # 运行 ESLint
pnpm format        # 使用 Prettier 格式化所有文件
pnpm format:check  # 检查格式而不进行修改
pnpm check         # 运行 TypeScript 类型检查

未来工作 / 招募帮助

欢迎各位贡献!以下是一些值得探索的方向:

  • 添加对更多 JAX 函数和操作的支持,详见 兼容性表
  • 提升 WebGPU 和 Wasm 运行时的性能,生成更优的内核,并利用 SIMD 和多线程技术。(即使是单线程的 Wasm,性能也可能提升约 20 倍。)
  • 帮助 JIT 编译器在更多场景下融合操作,例如 tanh 分支。
  • 构建高效的 Transformer 推理引擎,与 onnxruntime-web 进行对比。

您也可以加入我们的 Discord 社区,与社区成员交流讨论。

版本历史

jax/v0.1.102026/03/16
jax/v0.1.92026/02/08
jax/v0.1.82026/02/06
jax/v0.1.72026/01/23
loaders/v0.1.12026/01/23
jax/v0.1.62026/01/18
jax/v0.1.52026/01/08
optax/v0.1.22026/01/02
jax/v0.1.42026/01/02
optax/v0.1.12025/12/27
jax/v0.1.32025/12/25
jax/v0.1.22025/12/23
jax/v0.1.12025/12/20
jax/v0.1.02025/12/20

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架