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

PyTorch 设计理念

本文档旨在帮助贡献者和模块维护人员了解 PyTorch 随着时间的推移发展而来的高级设计原则。这些不是硬性规定,而是作为指导,帮助权衡不同的考虑因素,并解决在开发 PyTorch 时可能出现的争议。有关贡献、模块维护以及如何将争议升级到核心维护人员的更多信息,请参阅 PyTorch 治理

设计原则

原则 1:可用性重于性能

这个原则可能令人惊讶!正如一位 Hacker News 帖子作者所写:PyTorch 太棒了![…] 虽然我很困惑。一个 ML 框架怎么会不痴迷于速度/性能呢? 参见 关于 PyTorch 的 Hacker News 讨论

Soumith 关于 发展 PyTorch 社区 的博客文章深入探讨了这个问题,但概括地说

  • PyTorch 的主要目标是可用性

  • 第二个目标是具有合理的性能

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

更具体地说,我们以可用性优先的方式运作,并试图避免在没有对权衡进行明智考虑的情况下,过早地跳到限制优先的方案(例如,静态形状、仅限图模式)。通常会有一种诱惑,即在早期强加严格的用户限制,因为这可以简化实现,但这会带来风险

  • 性能可能不值得用户摩擦,无论是由于性能优势不够引人注目,还是它只适用于相对狭窄的一组子问题。

  • 即使性能优势引人注目,限制也会将生态系统分裂成不同的限制集,这些限制集很快就会变得难以理解。

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

原则 2:简单胜于易用

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

  • 显式优于隐式

  • 简单优于复杂

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

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

  • 易用/隐式(易于使用):用户不必担心设备;系统会找出全局最佳设备放置。

在本例中,以及作为一般设计理念,PyTorch 更倾向于公开简单且显式的构建块,而不是对实践者友好的 API。简单版本对于新的 PyTorch 用户来说是立即可以理解和调试的:如果您在程序中实际调用运算符的地方调用了需要跨设备移动的运算符,您会得到一个明确的错误。简单的解决方案可能让新用户在最初阶段更快地移动,但调试这样的系统可能很复杂:系统是如何做出决定的?与这样的系统交互的 API 是什么,以及对象如何在它的 IR 中表示?

一些支持这种设计的经典论据来自 关于分布式计算的说明(TL;DR:不要用性能特征完全不同的资源对资源进行建模,细节会泄露)和 端到端原则(TL;DR:在堆栈的较低层构建智能可能会阻止在堆栈的较高层构建高效的功能,而且通常不起作用)。例如,我们可以构建运算符级或全局设备移动规则,但是确切的选择并不明显,构建可扩展机制不可避免地会导致复杂性和延迟成本。

需要注意的是,这并不意味着更高级的“简单”API 没有价值;当然,在堆栈中更高层级上支持大型集群中异构计算的有效张量计算是有价值的。相反,我们的意思是专注于简单的低级构建块有助于告知简单 API,同时在用户需要离开传统路径时仍然保持良好的体验。它也为创新和发展更具主见工具留下了空间,这些工具的增长速度是我们无法在 PyTorch 核心库中支持的,但最终会从中受益,正如我们的 丰富生态系统 所证明的那样。换句话说,不在一开始就自动化可以让我们更快地达到良好的自动化水平。

原则 3:以 Python 为先,并提供一流的语言互操作性

这一原则最初是 以 Python 为先

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

多年来,PyTorch 需要处理 Python 开销:我们首先用 C++ 重写了 autograd 引擎,然后重写了大多数运算符定义,然后开发了 TorchScript 和 C++ 前端。

尽管如此,在 Python 中工作仍然为我们的用户提供了最好的体验:它灵活、熟悉,也许最重要的是,它拥有庞大的科学计算库和扩展生态系统,可供使用。这一事实促使我们最近做出了一些贡献,这些贡献试图在曲线中接近 Python 易用性端的帕累托最优解。

这些设计原则不是硬性规定,而是来之不易的选择,它们是 PyTorch 成为今天可调试、可黑客攻击和灵活的框架的基础。随着我们拥有更多贡献者和维护者,我们期待与大家一起在我们的库和生态系统中应用这些核心原则。我们也愿意随着我们学习新事物和 AI 空间的演变而不断发展这些原则,因为我们知道它会不断发展。

文档

访问 PyTorch 的全面的开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源