目录

PyTorch 设计理念

本文档旨在帮助贡献者和模块维护者 了解已发展起来的高级设计原则 time 的 PyTorch 中。这些并不是硬性规定,而是 作为指南,帮助权衡不同的问题并解决 开发 PyTorch 时可能出现的分歧。了解更多 有关贡献、模块维护以及如何升级 与核心维护者有分歧,请参阅 PyTorch 治理

设计原则

原则 1:可用性胜于性能

这个原则可能会让人感到惊讶!正如一位 Hacker News 海报所写的那样:PyTorch 太棒了![…]虽然我很困惑。ML 框架如何 不痴迷于速度/性能?请参阅 Hacker News 的讨论 PyTorch 的 Torch 中。

Soumith 关于发展 PyTorch 的博客文章 社区对此进行了一些深入的讨论,但从高层次上讲:

  • PyTorch 的主要目标是可用性

  • 次要目标是获得合理的性能

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

更具体地说,我们以可用性为先的方式运营并尝试 为避免跳转到限制优先的方案(例如,静态形状、 graph-mode only),而没有对权衡有清晰的了解。经常在那里 是预先施加严格的用户限制的诱惑,因为它 可以简化实施,但也会带来风险:

  • 性能可能不值得用户摩擦,因为 性能优势不够引人注目,或者仅适用于 一组相对狭窄的子问题。

  • 即使性能优势令人信服,限制也可能 将生态系统分割成不同的限制集,这些限制可以 很快就会变得用户难以理解。

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

原则 2:简单胜于简单

在这里,我们借鉴了 The Zen of 蟒蛇

  • 显式优于隐式

  • 简单胜于复杂

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

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

  • Easy / Implicit(使用):用户不必担心 设备;系统计算出全局最优设备 放置。

在这种特定情况下,作为一般的设计理念,PyTorch 倾向于公开简单和显式的构建块,而不是 API 易于从业者使用。简单版本立即 PyTorch 新用户可理解和调试:您将获得清晰的 如果您在 程序中实际调用运算符的点。简单 解决方案最初可能会让新用户移动得更快,但调试这样的 系统可能很复杂:系统如何做出决定?什么 是用于插入此类系统的 API,对象如何 在其 IR 中表示?

一些支持这种设计的经典论点来自 A 分布式说明 计算(TLDR:不要 对性能特征截然不同的资源进行建模 ,则细节会泄露)和 End-to-End 原则 (TLDR:在堆栈的较低层构建智能可以防止 在堆栈中的较高层构建高性能功能,并且通常 反正也不起作用)。例如,我们可以构建 Operator 级或 global device movement 规则,但具体选择并不明显,并且 构建可扩展机制具有不可避免的复杂性和延迟 成本。

这里需要注意的是,这并不意味着更高级别的 API 是“简单”的 API 没有价值;当然,例如,它有价值: 堆栈中的更高级别,以支持高效的张量计算 跨大型集群中的异构计算。相反,我们的意思是 是专注于简单的较低级别构建块有助于通知 简单的 API,同时在用户需要时仍保持良好的体验 离开人迹罕至的地方。它还为创新和 以我们无法支持的速度增长更多固执己见的工具 PyTorch 核心库,但最终会从中受益,具体表现为 我们丰富的生态系统。在其他 单词,而不是在开始时自动化,使我们能够潜在地达到水平 的 良好 自动化 更快。

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

这个原则始于 Python First

PyTorch 不是与整体式 C++ 框架的 Python 绑定。 它旨在深度集成到 Python 中。您可以使用它 自然就像你使用 NumPySciPyscikit-learn、 或其他 Python 库。您可以编写新的神经网络 层,使用您最喜欢的库并使用 例如 CythonNumba 的软件包。我们的目标是不重塑 轮子。

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

尽管如此,在 Python 中工作很容易为我们的 users:它灵活、熟悉,也许最重要的是,它有一个 由科学计算库和扩展组成的庞大生态系统 可供使用。这一事实激励了我们最近的一些 贡献,该贡献尝试达到接近 Python 可用性曲线的终点:

这些设计原则不是硬性规定,而是来之不易的 choices 和 anchor 如何将 PyTorch 构建为可调试、可 hack 的 和今天的灵活框架。由于我们有更多的贡献者和 维护者们,我们期待着与您一起应用这些核心原则 在我们的库和生态系统中。我们也愿意将它们发展为 我们学习新事物,AI 领域也在发展,正如我们所知道的那样。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

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

查看教程

资源

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

查看资源