关于项目#

JAX 项目由 JAX 核心团队领导。我们在开放环境中开发,并欢迎社区的开源贡献。我们经常收到来自 Google DeepMind、更广泛的 Alphabet、NVIDIA 以及其他方面的贡献。

该项目的核心是 JAX 核心库,该库专注于机器学习和数值计算的基础,并支持大规模应用。

开发 核心时,我们希望保持敏捷性和专注的范围,因此我们大量依赖于周围的 模块化技术堆栈。首先,我们设计了 jax 模块,使其具有 组合性可扩展性,以便各种特定领域的库能够以去中心化的方式在其外部蓬勃发展。其次,我们大量依赖于模块化后端堆栈(编译器和运行时)来针对不同的加速器。无论您是 编写基于 JAX 的新领域特定库,还是希望 支持新硬件,您通常都可以通过对 JAX 核心代码库进行最少甚至零修改来贡献这些。

JAX 的许多核心贡献者都源于开源软件和研究领域,涵盖计算机科学和自然科学。我们努力持续推动机器学习和数值计算的前沿——跨越所有计算平台和加速器——并发现大规模数组编程的真谛。

开放开发#

JAX 的日常开发在 GitHub 上公开进行,使用拉取请求、问题跟踪器、讨论和 JAX 增强提案 (JEPs)。阅读和参与这些是参与其中的好方法。我们还维护 开发者笔记,涵盖 JAX 的内部设计。

JAX 核心团队决定是否接受更改和增强。目前保持简单的决策结构有助于我们在研究前沿的速度下进行开发。开放开发是我们的核心价值观,如果/当它变得有用时,我们可能会随着时间的推移适应更复杂的决策结构(例如,指定区域负责人)。

有关更多信息,请参阅 为 JAX 做贡献

模块化堆栈#

为了支持 (a) 跨数值领域的不断增长的用户社区,以及 (b) 不断发展的硬件格局,我们大量依赖于**模块化**。

基于 JAX 的库#

虽然 JAX 核心库专注于基础知识,但我们希望鼓励在此基础上构建特定领域的库和工具。事实上,许多库已经围绕 JAX 出现,提供了更高级别的功能和扩展。

我们如何鼓励这种去中心化开发?我们通过几项技术选择来指导它。首先,JAX 的主要 API 专注于基本构建块(例如,数值原语、NumPy 操作、数组和转换),鼓励辅助库根据其领域的需求开发实用程序。此外,JAX 还公开了一系列更高级的 API,用于 自定义可扩展性。库可以 利用这些 API,以便将 JAX 用作内部实现手段,更深入地与自动微分等转换集成,等等。

JAX 生态系统中的项目以分布式且通常是开放的方式进行开发。它们不受 JAX 核心团队的管辖,尽管有时团队成员会为它们做出贡献或与其开发者保持联系。

可插拔后端#

我们希望 JAX 能够在 CPU、GPU、TPU 以及未来出现的其他硬件平台上运行。为了鼓励在新平台上无障碍地支持 JAX,JAX 核心在其后端也强调模块化。

为了管理硬件设备和内存,以及编译到这些设备,JAX 会调用开放的 XLA 编译器PJRT 运行时。这两个项目都独立于 JAX 核心,由 OpenXLA 管理和维护(同样,JAX 核心开发者也经常为此贡献并进行讨论)。

XLA 旨在实现跨加速器的互操作性(例如,通过将 StableHLO 作为输入),而 PJRT 通过插件设备 API 提供可扩展性。添加对新设备的支持是通过为 XLA 实现后端下推,以及实现 PJRT 定义的插件设备 API 来完成的。如果您希望为编译或支持新硬件做出贡献,我们鼓励您在 XLA 和 PJRT 层面上贡献。

这些开放的系统组件允许第三方在新加速器平台上支持 JAX,而无需更改 JAX 核心。目前有几个插件正在开发中。例如,苹果公司的一个团队正在开发一个 PJRT 插件,以使 JAX 在 Apple Metal 上运行