跳到主内容
快讯直播
AI智模界
AI 词典

JAX:把模型当函数,交给编译器去跑

一句话定义:JAX 是 Google 开源的数值计算库,语法长得像 NumPy,但它能给普通 Python 函数加上自动求导、自动编译、自动批量和自动并行这几项“外挂”。

它到底特殊在哪

JAX 的核心是函数式编程(functional programming)思路:函数没有隐藏状态,同样的输入永远给同样的输出,数组一旦创建就不可修改(immutable)。正因为函数是“干净”的,JAX 才能提供几个高阶变换(transform):

  • jit:把函数整体编译成机器码,用 XLA 编译器融合算子、减少 Python 开销;
  • grad:对函数求导,写 grad(f) 就得到导函数;
  • vmap:把只处理单条样本的函数自动变成处理一批的函数,不用手写 batch 维度;
  • 分片/并行相关接口:把一个函数自动切到多设备、多卡上跑。

一个生活化的比方:PyTorch 像开放式厨房,边做边尝、随时改配方,灵活直观;JAX 像把菜谱写成一份标准化配方,然后交给中央厨房的统一流水线——流水线可以一次性把这道菜同时做 1000 份、同时算好“如果盐放多了会怎样”。代价是:配方必须写得很规范,中途不能偷偷往锅里加东西。

和 PyTorch 的关键差异

维度PyTorchJAX
执行方式即时执行(eager),逐行运行可即时,也可 jit 整体编译
状态张量可变,nn.Module 持有参数数组不可变,参数靠显式传入(pytree)
求导反向传播图按运行轨迹记录对纯函数做变换式求导
随机数全局随机状态必须显式传 PRNG key,并手动 split
生态训练/部署工具链完整成熟研究味更浓,Flax、Optax 等库各自成篇

新手最容易踩的坑是随机数:JAX 里没有“全局随机种子”,你要自己 split 出子 key 传给每个需要随机性的函数,否则循环里每次采样都一样。这不是设计失误,而是纯函数约束的必然结果——只有这样才能保证编译、并行、重放都可靠。

它在业界的真实位置

JAX 主要产自 Google Research 和 DeepMind,是 TPU 上的一等公民,也支持 GPU/CPU。它在两类场景里格外顺手:一是需要自定义求导、高阶导数、物理仿真等“数学味重”的研究;二是超大规模训练——Google 用 XLA 加自动分片(sharding)的思路,让同一份代码从小机器平滑扩到成千上万加速器,Gemini 系列模型的训练栈就大量使用 JAX(具体细节以官方技术报告为准)。AlphaFold 这类科学计算项目也是 JAX 的知名用户。

对普通从业者:如果你只是做常规业务模型,PyTorch 仍是默认选项,招聘和资料都更多;但如果你想读懂 Google 系的大模型论文、做需要精细控制并行和编译的活儿,或者想理解“函数式 + 编译器”这套思路,JAX 值得花一个周末把它的四个变换玩一遍——它改变的是你写代码的思维方式,而不只是换了个 API。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。