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

PyTorch 设计理念

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

设计原则

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

这条原则可能令人惊讶!正如一位 Hacker News 用户所写:*PyTorch 太棒了![…] 虽然我很困惑。一个机器学习框架怎么可能不痴迷于速度/性能?* 请参阅 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 打造成为今天这样可调试、可修改和灵活的框架。 随着我们拥有越来越多的贡献者和维护者,我们期待着与您一起在我们的库和生态系统中应用这些核心原则。 我们也乐于随着我们学习新事物和人工智能领域的发展而不断发展,因为我们知道它会发展。

文档

访问 PyTorch 全面的开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源