当前位置: 首页 > ops >正文

PyTorch 社区贡献 和 设计原则

文章目录

  • PyTorch 治理体系 | 构建与持续集成
    • 一、如何新增维护者
  • PyTorch 贡献指南
    • 一、贡献流程
    • 二、入门指南
      • 1、提议新功能
      • 2、问题报告
      • 3、功能实现与缺陷修复
      • 4、添加教程
      • 5、改进文档与教程
      • 6、参与在线讨论
      • 7、通过 PR 修复问题
      • 8、审查开放 PR
      • 9、提升代码可读性
      • 10、增强测试覆盖
      • 11、推广 PyTorch
      • 12、问题分类
    • 三、开源开发须知
    • 四、避免常见错误
    • 五、常见问题解答
    • 六、文档体系
      • 1、Python 文档
      • 2、C++ 文档
    • 七、教程系统
      • 1、教程构建流程
      • 2、贡献新教程
  • PyTorch 设计哲学
    • 一、设计原则
      • 1、可用性优先于性能
      • 2、简单优于便捷
      • 3、Python 优先与顶尖语言互操作性
  • PyTorch 治理机制
    • 一、概述
    • 二、模块维护者
    • 三、核心维护者
    • 四、首席核心维护者 (BDFL)
    • 五、维护者提名与任免机制
      • 1、基本原则
      • 2、提名流程
      • 3、移除流程
      • 4、首席维护者更替
    • 六、模块管理机制
    • 七、决策机制
      • 1、常规变更
      • 2、争议性变更
      • 3、项目政策
    • 八、常见问题


PyTorch 治理体系 | 构建与持续集成


一、如何新增维护者

候选人需满足以下条件才能成为维护者:

  • 至少向 PyTorch 代码库相关部分提交过 6 次 commit
  • 其中至少 1 次 commit 是在最近 6 个月内提交的

要为合格候选人添加维护者权限,需执行以下操作:
1、创建 PR 将候选人添加至核心贡献者名单页面
2、同步更新合并规则文件
现有维护者将通过投票表决,PR 合并的决策标准如下:

  • 必须等待至少 2 个工作日后再合并(确保大多数贡献者已查看)
  • PR 需正确标记 module: ci 标签
  • 现有维护者无人提出反对意见
  • 获得至少 3 个净赞成票(若该模块维护者少于 3 人,则需全体维护者赞成)


PyTorch 贡献指南

注意:本页面已弃用。请参考 PyTorch Wiki 上的贡献指南。


PyTorch 是一个基于磁带自动微分系统的 GPU 加速 Python 张量计算库,用于构建深度神经网络。


一、贡献流程

PyTorch 组织遵循 PyTorch 治理章程,技术贡献指南详见 CONTRIBUTING.md。

PyTorch 的开发过程包含核心开发团队与社区之间的大量公开讨论。虽然 PyTorch 的 GitHub 工作流程与大多数开源项目类似,但如果你是首次贡献开源项目,以下是基本流程:

  • 确定工作内容
    大多数开源贡献源于开发者解决自身需求。若你尚未明确目标或希望熟悉项目,可通过以下方式寻找合适任务:

    • 查阅 issue 跟踪器,寻找可修复的问题。被其他贡献者确认的问题通常更值得关注。我们为新手保留了特定标签(如 bootcamp1hr),但这些标签维护频率较低。
    • 加入 开发讨论区 告知你的意向。我们非常乐意帮助研究者和合作伙伴熟悉代码库。
  • 评估变更范围
    对于小型变更可直接实施,大型变更建议先通过 提交 RFC 获取设计意见:

    • 不确定变更规模?可在 issues 或 开发讨论区 咨询。
    • 标准化功能(如新增算子或优化器)需提供效用证明(如论文引用或其他框架实现)。
      • 近期研究成果的算子/算法 通常不被接受,除非有压倒性证据表明其突破性价值。不确定时可先创建 issue 讨论。
    • 核心变更需特别注意协调,因主分支开发节奏极快。基础性改动建议分阶段实施。
  • 编写代码
    技术实现建议参考 CONTRIBUTING.md。

  • 提交 Pull Request

    • 未完成时创建 Draft PR 或添加 “[WIP]” 前缀。复杂变更建议始终以 Draft 状态启动,便于持续集成测试。
    • 为 PR 指定合适审查者。可参考 核心维护者列表 直接@相关人员。
  • 迭代优化直至合并

    • 我们将尽量减少审查轮次,仅对重大问题提出阻塞意见。常见问题参考避免常见错误章节。
    • PR 通过审查且 CI 测试通过后,我们将自动完成合并。

二、入门指南


1、提议新功能

新功能建议应在特定 issue 中讨论。请尽可能提供详细信息、配套数据及解决方案。PyTorch 团队和社区会定期审查新 issue 并提供帮助。若方案成熟可直接实现。


2、问题报告

发现问题时请先搜索现有 issue 列表。确认无类似问题后新建 issue,需包含:

  • 问题重现步骤
  • 预期行为说明
  • 相关环境信息

3、功能实现与缺陷修复

修复特定 issue 时建议先在对应 issue 中留言说明意图。除合作开发者外,我们通常不会锁定或分配 issue。最佳实践是与团队讨论方案,可节省大量时间。

标有 first-new-issue、low 或 medium 优先级的 issue 最适合新手入门。


4、添加教程

pytorch.org 上多数教程来自社区贡献。新增教程请参考:PyTorch 教程贡献指南


5、改进文档与教程

我们致力于提供高质量文档。若发现拼写错误或内容缺陷,欢迎提交 PR。文档系统说明详见文档体系章节。


6、参与在线讨论

开发者可加入:

  • 用户讨论区:PyTorch Discussion Forums
  • 核心开发讨论区:PyTorch Dev Discussion Forums

7、通过 PR 修复问题

所有开放 issue 可通过此列表查看。在 issue 中留言说明解决方案能有效吸引团队注意。复杂问题我们会提供具体指导。


8、审查开放 PR

协助审查 PR 始终受欢迎。虽然团队会快速响应并合并有价值提交,但更多审查者能提高代码质量。


9、提升代码可读性

小范围改进优于大范围改动。建议先在论坛或相关 issue 发起讨论。


10、增强测试覆盖

补充测试用例能使代码库更健壮。


11、推广 PyTorch

在研究论文、技术博客或项目中采用 PyTorch 能有效扩大社区影响力。需要市场支持请联系 marketing@pytorch.org。


12、问题分类

若认为某 issue 需要调整标签或优先级,欢迎留言提出建议。


三、开源开发须知

首次贡献者可能对以下流程感到陌生:

  • 无法"认领"issue
    开源社区不鼓励独占式认领,因为开发者可能中途放弃。建议以咨询方式沟通,最终以可运行代码和共识推进。

  • 新功能门槛较高
    不同于企业环境,合并后的代码将由全体维护者共同负责。这导致我们对合并代码的质量要求更为严格。


四、避免常见错误

  • 缺少测试
    测试用例能帮助:
    1、检测后续破坏
    2、验证初始正确性(如 Knuth 所言:“未运行的代码不可轻信”)
    例外情况:极简变更或难以测试的改动需明确说明验证方式。

  • PR 过大
    审查难度与 PR 规模呈非线性增长。大型变更应:

    • 提前进行设计讨论
    • 拆分为可独立合并的模块
    • 提供完整描述
  • 缺少关键注释
    复杂逻辑需附加说明文档。

  • 临时解决方案
    Hack 代码需特别说明必要性。

  • 修改核心组件
    基础组件变更需额外审查,务必提前与团队协调。

  • 新功能开发
    务必先在相关 issue 中讨论设计方案。

  • 无关变更
    PR 应仅包含直接相关的文件修改。


五、常见问题解答

  • 如何参与审查?
    重现问题、测试新功能、协助排查问题均有价值。在 PR 中补充环境细节尤为有用。

  • CI 测试失败?
    可能基于损坏的主分支。尝试 rebase 到最新主分支,或查看 CI 状态:https://hud.pytorch.org/

  • 高风险变更?
    构建配置修改风险最高,必须提前讨论。

  • 分支出现陌生提交?
    可能是其他贡献者为修复 CI 提供的补丁。


六、文档体系


1、Python 文档

使用 Sphinx 从 Python 源码生成,部署于:

  • 站点:https://pytorch.org/docs
  • 源码:https://github.com/pytorch/pytorch/tree/main/docs
  • 托管:https://github.com/pytorch/pytorch.github.io/tree/master/docs

2、C++ 文档

通过 Doxygen 生成,部署于:

  • 站点:https://pytorch.org/cppdocs
  • 源码:https://github.com/pytorch/pytorch/tree/main/docs/cpp
  • 托管:https://github.com/pytorch/cppdocs

七、教程系统

教程用于指导特定任务或概念理解,通过 Sphinx-Gallery 从 Python 或 RST 文件生成:

  • 站点:https://pytorch.org/tutorials
  • 源码:https://github.com/pytorch/tutorials

1、教程构建流程

PR 触发完整重建:

  • CircleCI 分 9 个并行任务,耗时约 40 分钟
  • 同步执行 Netlify 快速构建(不渲染 notebook 输出)
  • 合并后通过 GitHub Actions 重新部署

2、贡献新教程

参考:PyTorch 教程贡献指南


PyTorch 设计哲学

https://docs.pytorch.org/docs/stable/community/design.html

本文档旨在帮助贡献者和模块维护者理解 PyTorch 长期发展形成的高层设计原则。这些原则并非铁律,而是作为权衡不同关注点和解决开发过程中可能出现的分歧的指南。有关贡献、模块维护以及如何向核心维护者提请争议解决的更多信息,请参阅 PyTorch 治理文档。


一、设计原则


1、可用性优先于性能

这一原则可能令人惊讶!正如某位 Hacker News 用户所言:PyTorch 太棒了![…] 但令我困惑的是,一个机器学习框架怎么能不痴迷于速度/性能? 参见 Hacker News 关于 PyTorch 的讨论。

Soumith 在《壮大 PyTorch 社区》博文中深入探讨了这一点,其核心观点是:

  • PyTorch 的首要目标是可用性
  • 次要目标是保持合理的性能

我们认为,保持灵活性以支持基于我们抽象层开展研究的人员至关重要。虽然无法预知未来的工作负载形态,但我们希望这些工作负载能首先在 PyTorch 上构建——这需要框架具备足够的灵活性。

具体而言,我们采用可用性优先的工作方式,避免在未充分权衡利弊的情况下贸然采用限制优先的方案(例如静态形状、纯图模式等)。虽然预先施加严格的用户限制可以简化实现,但存在以下风险:

  • 性能收益可能无法抵消用户摩擦,要么因为性能提升不够显著,要么仅适用于相对狭窄的子问题集
  • 即使性能收益显著,这些限制可能导致生态系统分裂成具有不同限制条件的子集,最终令用户难以理解

我们希望用户能够无缝地将 PyTorch 代码迁移到不同的硬件和软件平台,与各类库和框架互操作,并体验完整的 PyTorch 用户体验,而非最低公分母的功能子集。


2、简单优于便捷

此处我们借鉴了《Python 之禅》的理念:

  • 显式优于隐式
  • 简单优于复杂

更简洁的表述是《简单与容易》中的观点。让我们通过示例说明,因为在日常英语中*简单(simple)容易(easy)*常被混用。以 PyTorch 中设备的建模方式为例:

  • 简单/显式(便于理解、调试): 每个张量都关联特定设备。用户需显式指定张量设备迁移。跨设备操作会直接报错
  • 便捷/隐式(易于使用): 用户无需关心设备,系统会自动确定全局最优设备布局

在这个具体案例以及整体设计哲学中,PyTorch 倾向于提供简单显式的构建块,而非面向从业者的便捷 API。简单版本能让新用户立即理解并调试:当程序执行到实际调用跨设备操作的代码位置时,你会获得明确的错误提示。便捷方案或许能让新用户快速上手,但调试这类系统可能变得复杂:系统如何做出决策?接入该系统的 API 是什么?其中间表示(IR)中的对象如何表达?

支持这种设计的经典论述来自《分布式计算笔记》(核心观点:不要用统一方式建模性能特征差异巨大的资源,细节终将暴露)和《端到端原则》(核心观点:在底层堆栈构建智能机制会阻碍高层堆栈开发高性能特性,且往往徒劳无功)。例如,我们可以制定算子级或全局设备迁移规则,但精确选择并不明显,而构建可扩展机制必然带来复杂性和延迟成本。

需要说明的是,这并不意味着高层"便捷"API 没有价值。显然,在堆栈高层支持跨异构计算集群的高效张量运算具有重要价值。我们的核心观点是:聚焦简单的底层构建块既能指导便捷 API 的设计,又能确保用户在偏离常规路径时仍获得良好体验。这也为创新留出空间,使得更具倾向性的工具能以 PyTorch 核心库无法支持的速度发展——正如我们丰富的生态系统所证明的,这种模式最终会反哺核心库。换言之,初始阶段不盲目自动化,反而可能让我们更快达到理想的自动化水平。


3、Python 优先与顶尖语言互操作性

这一原则最初表述为Python 优先

PyTorch 不是封装在单体 C++ 框架外的 Python 绑定。它被设计为深度集成到 Python 生态中。你可以像使用 NumPy、SciPy 或 scikit-learn 等 Python 库那样自然地使用它。你可以直接用 Python 编写新的神经网络层,调用喜爱的库,并使用 Cython 和 Numba 等工具包。我们的目标是在适当场景避免重复造轮子。

多年来 PyTorch 一直在应对 Python 开销问题:我们首先用 C++ 重写了自动微分引擎,然后迁移了大部分算子定义,随后开发了 TorchScript 和 C++ 前端。

尽管如此,Python 仍为用户提供了最佳体验:灵活、熟悉,最重要的是拥有庞大的科学计算库和扩展生态系统。这一事实推动了我们最近的几项重要贡献,它们试图在接近 Python 可用性曲线的帕累托最优点上取得突破:

  • TorchDynamo:能通过最小用户干预加速现有即时模式 PyTorch 程序的 Python 帧评估工具
  • torch_function 和 torch_dispatch 扩展点:支持在 C++ 内部实现基础上构建 Python 优先的功能,例如分别催生了 torch.fx 追踪器和 functorch

这些设计原则并非铁律,而是历经实践检验的选择,它们锚定了 PyTorch 成为如今这个可调试、可扩展且灵活的框架的发展轨迹。随着贡献者和维护者群体的壮大,我们期待与您共同在库和生态系统中践行这些核心原则。我们也保持开放态度,随着认知深化和 AI 领域演进,持续迭代这些原则——因为我们深知,变革永不止息。



PyTorch 治理机制


一、概述

PyTorch 采用层级化的技术治理结构:

  • 贡献者社区:负责提交问题、创建拉取请求并为项目做出贡献
  • 模块维护者:每个 PyTorch 模块由少量核心维护者驱动
  • 核心维护者:监督模块维护者,主导项目整体发展方向
  • 首席核心维护者(BDFL):作为最终决策者

所有维护者都应高度认同 PyTorch 的设计理念。除维护者外,社区成员可通过贡献代码、提交问题、提出建议、审查拉取请求等方式参与。只要具备贡献意愿和能力,任何人都可能成为维护者并获得代码库的写入权限。

技术治理与商业治理严格分离,确保任何个人或公司都无法通过商业手段影响技术决策。技术治理成员以个人身份参与,不保留公司席位,成员资格与个人而非雇主公司绑定。


二、模块维护者

模块定义为 PyTorch 组织下的 GitHub 仓库或核心仓库 pytorch/pytorch 中的目录。每个模块拥有独立的维护者小组,负责:

  • 代码审查与合并
  • 设计改进
  • 模块范围调整

各维护小组可自定义决策规则(默认采用多数表决)。模块维护者有权质疑其他模块的决策(特别是受影响时),需公开说明争议点、相关论据及解决方案。若无法达成共识,可提交核心维护者仲裁。

维护小组应公开以下信息:

  • 模块愿景
  • 路线图草案
  • 设计文档
  • 争议及解决方案

核心职责
1、处理模块高优先级问题
2、审查合并高优先级拉取请求
3、维护模块相关公开文档
4、组织公开开发者会议


三、核心维护者

核心维护者需深刻理解 PyTorch 代码库与设计哲学,主要职责包括:

  • 制定长期发展愿景
  • 协调解决重大争议
  • 评估来自利益相关方的变更请求(模块级请求由模块维护者处理)

核心维护者有权:

  • 否决模块级决策
  • 仲裁争议
  • 管理 PyTorch GitHub 组织

成员名单见 Maintainers。所有决策需公开说明理由。


四、首席核心维护者 (BDFL)

当核心维护者无法达成共识时,由预先指定的首席核心维护者(BDFL)做出最终决策。首席需:

  • 公开决策过程与依据
  • 负责核心维护者的任免

五、维护者提名与任免机制


1、基本原则

  • 个人 merit 制:基于贡献、评审和讨论表现授予资格
  • 持续活跃要求:长期不活跃可能转为荣誉状态
  • 无任期限制:成员资格与个人而非公司绑定

2、提名流程

1、模块维护者提名

  • 各模块自定义流程,或通过提名表提交核心维护者审议
  • 需包含:
    • 候选人的代码/评审/设计贡献证明
    • 社区评价(正反两面)
    • 现有维护者支持声明

2、核心维护者提名

  • 需由现有核心/模块维护者发起
  • 首席维护者评估:
    • 其他维护者的推荐信
    • 社区支持证明
    • 其他相关资质

3、移除流程

  • 社区成员或本人可发起移除提案
  • 核心维护者(排除利益冲突者)评估:
    • 活跃度情况
    • 是否与项目方向冲突
    • 行为准则问题
    • 利益冲突:亲属/恋爱关系

4、首席维护者更替

  • 75%核心维护者表决可罢免现任首席
  • 新首席通过排序复选制选举产生

六、模块管理机制

核心维护者集体决策以下事项:

  • 新增/移除模块
  • 调整模块范围
  • 仓库结构调整(新仓库或核心仓库子目录)

提案要求
1、调研需求:访谈研究者、收集社区反馈
2、技术评估:研读论文、构建示例管道
3、必要性论证:权衡维护成本与价值
4、提案内容:需包含维护计划、开发路线和社区方案


七、决策机制


1、常规变更

  • 通过 GitHub 问题/PR 流程处理
  • 维护者应避免直接推送,始终使用 PR
  • CODEOWNERS 文件定义审批权限
  • 必须通知相关领域专家评审,否则变更可能被撤销

2、争议性变更

需创建 GitHub issue 讨论的情况包括:

  • 框架语义/语法变更
  • Python/C++ API 不兼容改动
  • 核心功能新增/移除
  • 平台支持变更

3、项目政策

  • 版权归属:贡献者保留版权
  • 默认采用 3-Clause BSD 许可证(链接)
  • 特殊情况下可批准其他开源许可证

八、常见问题

Q:如何主导某个功能模块(如线性代数库)?
A:先参与现有模块贡献,再通过 GitHub issue 提交改进提案。

Q:企业能否通过赞助影响项目方向?
A:不可以。技术治理与商业赞助完全分离,企业可通过 PyTorch 基金会(PTF)参与赞助。

Q:项目是否提供开发者资助?
A:目前没有,但正在探索社区支持方案。欢迎在论坛提出建议。

Q:如何提交代码贡献?
A:小改动直接提 PR;重大变更需先开 issue 讨论。参考贡献指南。

Q:非 Facebook 员工能否成为提交者?
A:当前提交流程依赖 Facebook 内部系统,正在扩展外部提交权限。

Q:举办 PyTorch 教程会议是否需要官方身份?
A:不需要。欢迎社区成员自主推广,如需市场支持请联系 marketing@pytorch.org。


http://www.xdnf.cn/news/18221.html

相关文章:

  • 第5课_Rust生命周期和泛型
  • Android MVVM(Model-View-ViewModel)架构
  • 从零开始的云计算生活——第四十七天,细水长流,kubernetes模块之ingress资源对象
  • 23TaskExecutor初始化
  • 【ansible】4.实施任务控制
  • AI 伦理的 “灰色地带”:当算法拥有决策权,公平与隐私该如何平衡?
  • 工地智能安全带让高空作业更安全
  • Kafka如何保证消费确认与顺序消费?
  • gcc 与 g++ 的区别:本身不是编译器而是编译器驱动
  • 数据库优化提速(一)之进销存库存管理—仙盟创梦IDE
  • 【Tech Arch】Apache Pig大数据处理的高效利器
  • 【JavaEE】多线程 -- 线程池
  • 基于单片机太阳能充电器/太阳能转换电能
  • 30. 技术专题-锁
  • HTTP的协议
  • .gitignore 文件 记录
  • Linux服务器性能优化总结
  • 【Tech Arch】Apache HBase分布式 NoSQL 数据库
  • redis---常用数据类型及内部编码
  • 如何低比特量化算法的工程实战与落地优化
  • 【考研408数据结构-08】 图论基础:存储结构与遍历算法
  • 让Chrome信任自签名证书
  • AI时代下阿里云基础设施的稳定性架构揭秘
  • C#海康SDK—热成像测温篇
  • gitlab、jenkins等应用集成ldap
  • package.json详细字段解释
  • 大数据技术栈 —— Redis与Kafka
  • JavaScript 性能优化实战:从分析到落地的全指南
  • 网络间的通用语言TCP/IP-网络中的通用规则4
  • Apache Doris 在菜鸟的大规模湖仓业务场景落地实践