评价此页

PyTorch 设计理念#

创建日期:2022 年 6 月 10 日 | 最后更新日期:2025 年 4 月 16 日

本文档旨在帮助贡献者和模块维护者理解 PyTorch 随着时间推移而形成的高级别设计原则。这些原则并非硬性规定,而是作为指导,帮助权衡不同的考量,并在开发 PyTorch 时解决可能出现的意见分歧。有关贡献、模块维护以及如何将分歧升级给核心维护者,请参阅 PyTorch 治理

设计原则#

原则 1:可用性优先于性能#

这个原则可能令人惊讶!正如一位 Hacker News 用户所写:“PyTorch 太棒了!……不过我感到困惑。一个机器学习框架怎么会不痴迷于速度/性能呢?” 请参阅 Hacker News 关于 PyTorch 的讨论

Soumith 关于 壮大 PyTorch 社区 的博文对此进行了深入探讨,但总体而言,

  • PyTorch 的首要目标是可用性

  • 次要目标是拥有*合理的*性能

我们相信,能够保持灵活性以支持在其抽象之上进行构建的研究人员仍然至关重要。我们无法预见未来的工作负载是什么样的,但我们知道我们希望它们首先建立在 PyTorch 之上,这需要灵活性。

更具体地说,我们采取*可用性优先*的方式,并努力避免在没有清晰权衡视图的情况下,过早地进入*限制优先*的模式(例如,静态形状、仅图模式)。通常,人们会倾向于强加严格的用户限制,因为这可以简化实现,但这会带来风险:

  • 性能可能不值得付出用户阻力,因为性能提升不够吸引人,或者它只适用于相对狭窄的一组子问题。

  • 即使性能提升很吸引人,这些限制也会导致生态系统碎片化,形成不同的限制集,这些限制集很快就会让用户难以理解。

我们希望用户能够无缝地将他们的 PyTorch 代码迁移到不同的硬件和软件平台,与不同的库和框架进行互操作,并体验到 PyTorch 的全部丰富性,而不是一个最低公分母的子集。

原则 2:简单而非容易#

在这里,我们借鉴了 Python 之禅

  • 显式优于隐式

  • 简单优于复杂

更简洁地描述这两个目标是 简单而非容易。让我们从一个例子开始,因为在日常英语中,“*简单*”和“*容易*”经常被互换使用。考虑一下如何建模 PyTorch 中的*设备*(devices)。

  • 简单/显式(易于理解、调试): 每个张量都与一个设备相关联。用户显式指定张量设备移动。需要跨设备移动的操作会导致错误。

  • 容易/隐式(易于使用): 用户不必担心设备;系统会确定全局最优的设备放置。

在这种特定情况下,并且作为一般设计理念,PyTorch 倾向于公开简单而显式的构建块,而不是对实践者来说易于使用的 API。简单版本可以立即被新的 PyTorch 用户理解和调试:如果您在一个需要跨设备移动的操作符处调用它,它会在程序实际调用操作符的那个点上给出清晰的错误。简单的解决方案可能让新用户一开始移动得更快,但调试这样的系统可能会很复杂:系统是如何做出决定的?插入此类系统的 API 是什么?它在 IR 中如何表示对象?

支持此类设计的经典论据包括 分布式计算注意事项(TLDR:不要统一建模性能特征差异很大的资源,细节会暴露)以及 端到端原则(TLDR:在堆栈的较低层构建智能功能可能会阻止在高层构建高性能功能,而且通常也行不通)。例如,我们可以构建操作符级别或全局设备移动规则,但精确的选择并不明显,而且构建一个可扩展的机制会带来不可避免的复杂性和延迟成本。

需要注意的是,这并不意味着更高级别的“容易”API 没有价值;例如,在堆栈的更高级别支持跨大型集群异构计算的高效张量计算肯定是有价值的。相反,我们的意思是,专注于简单的低级构建块有助于为易于使用的 API 提供信息,同时在用户需要脱离常规路径时仍能保持良好的体验。它还为我们无法在 PyTorch 核心库中支持的,但最终有益的,更具观点性的工具的创新和增长留下了空间,这正如我们 丰富的生态系统 所证明的那样。换句话说,一开始不自动化,可以让我们有可能更快地达到良好的自动化水平。

原则 3:Python 优先,兼具一流的语言互操作性#

这一原则最初是“**Python 优先**”

PyTorch 不是一个单体的 C++ 框架的 Python 绑定。它是为了深度集成到 Python 中而构建的。您可以像使用 NumPySciPyscikit-learn 或其他 Python 库一样自然地使用它。您可以使用自己喜欢的库在 Python 中编写新的神经网络层,并使用 CythonNumba 等包。我们的目标是在适当的时候不重复造轮子。

多年来,PyTorch 需要处理的一个问题是 Python 的开销:我们首先用 C++ 重写了 autograd 引擎,然后是大部分操作符定义,然后开发了 TorchScript 和 C++ 前端。

尽管如此,在 Python 中工作为我们的用户提供了最佳的体验:它灵活、熟悉,而且最重要的是,它拥有大量的科学计算库和扩展生态系统可供使用。这一事实促使我们最近的一些贡献,这些贡献试图在曲线的 Python 可用性端附近达到帕累托最优点。

这些设计原则并非硬性规定,而是来之不易的选择,它们奠定了 PyTorch 成为如今可调试、易于修改和灵活的框架的基础。随着我们有更多的贡献者和维护者,我们期待与您一起在我们所有的库和生态系统中应用这些核心原则。我们也很乐意在学习新知识和人工智能领域不断发展时,不断演进它们。