JAX
在瞬息万变的机器学习和科学计算领域,运行速度和灵活性是最需要的两大要素。来自谷歌研究团队的名为 JAX 的程序是一款广为人知的工具,在追求数值计算和深度学习领域的速度方面一直名列前茅。JAX 具有 NumPy 的所有基本功能,除此之外,它还引入了一种非常熟悉的语言,并具有一些最先进的功能,如自动微分,使人们能够运行机器学习工作负载和针对现代 GPU/TPU 进行优化的代码,还能进行即时编译。本文将对 JAX 进行研究,以寻找最适合的使用方法,并将实际功能与宣称的功能进行比较,同时提供适合该学科新生的简单教程。
什么是 JAX?
JAX 是一个功能强大的数值计算库,它扩展了 NumPy 的功能,纳入了各种可提高现代机器学习和科学计算效率的函数。与旧版库不同,JAX 以组织函数转移为中心,这有助于使研究人员和工程师编写的代码既简短又强大。JAX 的主要特点是支持自动区分、硬件加速以及易于与现有的 Python 工作流程集成。
JAX 的主要属性
JAX 与其他数字计算工具包不同,它有以下独特之处:
NumPy 兼容性:JAX 支持 NumPy 提供的大多数数组操作。因此,用户在使用 Numpy 操作时不必丢弃旧代码,还能享受 GPU/TPU 加速带来的好处。
自动微分:通过将反向和正向模式自动微分作为库的一部分,JAX 降低了机器学习和优化应用中梯度计算的入门门槛。
即时编译(JIT):JIT 装饰器的功能之一是将 Python 函数直接编译成高效的机器代码,从而大大提高性能。
硬件加速:无需对代码进行任何修改,JAX 就能在 CPU、GPU 和 TPU 上流畅地运行,无论是简单的还是超大规模的研究任务。
函数变换:像 grad、vmap 和 pmap 这样的高效工具不仅可以通过矢量化、并行化和自动批处理来转换(进而优化)函数,还可以轻松快速地完成转换。
JAX 入门:基础教程
我们的目标是提供一个简短的示例,介绍 JAX 的自动区分和 JIT 编译功能。
首先,应通过 pip 安装 JAX:
pip install jax jaxlib
然后,应导入所需的模块:
导入 jax
将 jax.numpy 导入 jnp
从 jax 导入 grad、jit
在求某个函数的梯度之前,最好先选择一个易于理解和解释的函数:
def f(x):
返回 3 * x ** 2 + 2 * x + 1
df_dx = grad(f)
print(df_dx(2.0)) # 输出:14.0
现在可以通过 JIT 编译来加快执行速度:
@jit
def fast_f(x):
返回 3 * x ** 2 + 2 * x + 1
print(fast_f(2.0)) # 输出:17.0
本教程展示的不仅仅是 JAX 在查找梯度方面的优势。JAX 将此类操作融入核心,并提供 vmap 和 pmap,用于批处理或设备并行化工作。
结论
JAX 将 NumPy 的易用性与最新的性能优化相结合,是数组计算领域的一大进步。虽然学习如何处理函数式编程是一个需要克服的小障碍,但由此带来的速度和适应性方面的好处却让人受益匪浅。无论是训练机器学习模型、科学模拟,还是数学函数优化,JAX 都是帮助提升 Python 极限的工具。
