快捷方式

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 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源