• 文档 >
  • PyTorch 设计理念
快捷方式

PyTorch 设计理念

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

设计原则

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

这个原则可能令人惊讶!正如一位 Hacker News 用户所写:PyTorch 太棒了![…] 虽然我感到困惑。一个 ML 框架怎么可能不痴迷于速度/性能呢? 请参阅 Hacker News 上关于 PyTorch 的讨论

Soumith 关于 发展 PyTorch 社区 的博客文章对此进行了深入探讨,但从高层次来看

  • PyTorch 的首要目标是可用性

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

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

更具体地说,我们以可用性优先的方式运作,并尽量避免在没有明确权衡的情况下就转向限制优先的模式(例如,静态形状、仅图模式)。通常,人们会倾向于预先施加严格的用户限制,因为这可以简化实现,但这会带来风险

  • 性能可能不值得用户为此付出的摩擦成本,原因可能是性能提升不够显著,或者仅适用于相对狭窄的子问题集。

  • 即使性能提升非常显著,限制也可能使生态系统分裂成不同的限制集合,这些集合很快就会变得让用户难以理解。

我们希望用户能够将其 PyTorch 代码无缝迁移到不同的硬件和软件平台,与不同的库和框架互操作,并体验 PyTorch 用户体验的完整丰富性,而不是最不常见的子集。

原则 2:简单胜过容易

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

  • 显式优于隐式

  • 简单胜于复杂

描述这两个目标更简洁的方式是 简单胜过容易。让我们从一个例子开始,因为在日常英语中,简单容易经常互换使用。考虑一下在 PyTorch 中如何对设备进行建模

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

  • 容易/隐式(易于使用):用户无需担心设备;系统会计算出全局最优的设备放置。

在这种特定情况下,并且作为一般的设计理念,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,使其成为当今可调试、可 hack 和灵活的框架。随着我们拥有更多的贡献者和维护者,我们期待与您一起在我们的库和生态系统中应用这些核心原则。我们也对随着我们学习新事物和 AI 领域的发展而不断改进它们持开放态度,因为我们知道它会不断发展。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题解答

查看资源