Google 的函数式数值计算库,靠自动微分和 XLA 编译把 NumPy 代码直接跑上 TPU/GPU。
JAX 是什么,谁该用它
如果你写过 NumPy,又想把这些代码直接丢到 GPU 或 TPU 上跑,还想顺手拿到自动微分——JAX 就是干这个的。它由 Google 维护,文档在 docs.jax.dev,定位很明确:一个函数式数值计算库,把 NumPy 风格的数组运算、自动求导(autodiff)和 XLA 编译三者焊在一起。
它不是 NumPy 的替代品,也不是又一个深度学习框架。你写的还是 jnp.array、jnp.dot 这类熟悉的接口,但执行路径完全不同:代码先被追踪成计算图,交给 XLA 编译成针对具体硬件(CPU/GPU/TPU)的机器码,再跑。同一个函数,换个设备就是另一份编译产物。
它到底解决了什么问题
写 NumPy 的人都有体会:循环慢,向量化难写,梯度得手推。JAX 用几个核心变换把这三件事拆开了。
jax.grad:对任意纯函数求导,不用改函数本身jax.jit:把函数编译成 XLA 可执行体,循环和逐元素操作都能被融合优化jax.vmap:自动向量化,你写单样本逻辑,它帮你批处理jax.pmap/shard_map:多设备并行,TPU 集群上尤其顺手
这几个变换可以任意组合。比如 jit(vmap(grad(f))),一行套出「批量求梯度并编译」的行为,这在 NumPy 里得手写一大堆。
代价是函数式约束。JAX 要求被变换的函数尽量是纯的——不能有随机的副作用,随机数得显式传 PRNG key,状态更新要靠函数返回值。这套写法一开始别扭,习惯了反而清晰,尤其是调试梯度问题时。
谁适合上手
做研究的人最该看它。需要频繁改模型结构、试新算子、算高阶导数的场景,JAX 的函数式组合比命令式框架灵活得多。物理模拟、贝叶斯推断、强化学习这类「数学公式即代码」的领域,它是主力工具之一。
已经熟悉 NumPy 的工程师迁移成本不高,接口几乎一致。但如果你要的是开箱即用的训练循环、现成的层和优化器,JAX 生态里的 Flax、Equinox、Optax 能补上,只是拼装感比 PyTorch 强一些。
不太适合的:需要大量动态控制流、频繁 host-device 同步、或者依赖 Python 副作用的老代码。JIT 编译有预热开销,小规模计算反而可能变慢。
上手路径
官方文档结构清楚,从「JAX 基础」到「自动微分」「并行计算」逐层展开,示例都能直接跑。建议顺序是先拿 jnp 改写一段 NumPy 代码感受接口,再试 grad 和 jit 的组合,最后碰 vmap 和多设备。文档里对「纯函数」「静态形状」「PRNG」这几个坑讲得比较实在,遇到报错先回去翻对应章节,多半能找到原因。
一句话:想把数值代码写得像数学、跑得像编译产物,JAX 值得花一个下午试试。
常见问题
JAX 是什么?
Google 的函数式数值计算库,靠自动微分和 XLA 编译把 NumPy 代码直接跑上 TPU/GPU。
JAX 的官方网站是什么?
JAX 的官方网站是 https://docs.jax.dev/,可直接在浏览器中打开使用。
