如何参与PyTorch社区开源贡献?

2021-12-02 11:25:51 浏览数 (1)

如何参与PyTorch社区开源贡献?

作为深度学习框架OneFlow的一个全职开发者(声明我是菜鸡),基本上每天都会和PyTorch打交道,所以自问自答一下这个问题,希望对想为开源项目做贡献的小伙伴们提供一些思路也希望这个问题能获得更多回复。

OneFlow最近一年切到动态图模式之后就非常注重和PyTorch在API上进行对齐,以提升动态图模式的易用性,也即我们的:import oneflow as torch 特性。为了实现这个目标,我们在写Op的时候除了肉眼对Python API进行对齐之外还要写PyTorch的测试样例。动态图Op开发前期非常痛苦,因为测试样例的代码比较多这对开发者和Reviewer来说都很痛苦。后来@daquexian 写了一个自动测试框架可以非常方便的测试OneFlow Op的API接口以及计算结果是否和PyTorch的接口完全对齐。这个自动测试框架只有两个Python脚本,对原始的PyTorch进行了一个封装(我把它叫做High Level PyTorch),我们做测试的时候用这个High Level的PyTorch进行测试。测试框架可以像写dsl一样随意指定输入Tensor以及Paramter的形状和取值范围等,然后运行时会自动获取程序中的输入Tensor,中间Tensor,以及输出Tensor和它们对应的梯度Tensor,甚至是nn.Module的Parameter,只有OneFlow和PyTorch的所有参数和中间Tensor全部一样时才可以通过测试。这里有个issue一看便知 :https://github.com/Oneflow-Inc/oneflow/issues/5549 。后面我基于这个框架下进行了一些改进,比如自动codegen出错的代码,可以打印出错的程序方便OneFlow的开发者进行Debug以及跑CI的过程中直接暴漏出错程序。后面我会考虑写一篇文章介绍我们的自动测试框架,欢迎大家关注,它的可移植性非常强,非常方便的可以改到任何深度学习框架。

其实不读上面那段话也完全没有关系,我想表达的是我为PyTorch做的贡献主要是我在开发OneFlow的算子过程中基于OneFlow的自动测试框架发现和完成的。

说回给PyTorch做贡献,我个人的观点是,无论是提PR还是提issue实际上都是对开源社区做了贡献。如果只是想做一些微小的贡献(比如我,因为自己还有工作),那么BUG修复和一些Feature的Small Fix比较适合提PR,而一些侵入软件系统比较深的问题如果我们解决需要花很长时间或者目前能力还不够,这个时候就可以提交issue给PyTorch团队。下面我将以我的第一视角,来展示一下2021年我为Pytorch发现了哪些BUG,以及我提了什么PR以及ISSUE。

1. PyTorch CPU反卷积实现有BUG

在实现OneFlow的cpu group conv的时候,通过我们的自动测试框架测试发现一直有一些特殊的样例OneFlow和Pytorch无法对齐,最后Debug良久发现就是nn.ConvTranspose1D里面的weight的梯度无法对齐。然后在错误样例的一步步指引下,最终定位到一组PyTorch在CPU和GPU上输出结果不一致的问题。赶紧整理出了复现代码给PyTorch提了issue:https://github.com/pytorch/pytorch/issues/68868 。

为PyTorch指出它们的反卷积在CPU上实现有误

并且很快获得了PyTorch团队的回复,他们确认是MKLDNN那部分实现出了问题,并表达了感谢以及他们正在修复这个问题。

PyTorch官方做问题确认

2. 我给PyTorch的第一个PR

我在OneFlow开发Upsample这个nn.Module的时候发现PyTorch的上采样系数在在非整数的情况下会出错,源于PyTorch的代码实现错误,和OpenCV并没有对齐。我将这个bug报告在了https://github.com/pytorch/pytorch/issues/65200 中。然后我开始修复这个问题,并快速的提交了一个PR给PyTorch官方Review:https://github.com/pytorch/pytorch/pull/61166 。在 jbschlosser 给出代码方面的review意见之后,我修了他提的意见并且给PyTorch添加了触发这种BUG的测试样例就开始了跑PyTorch的CI的流程。但跑完之后PR还是迟迟没有合并,后来我就每周在PR下面催促他们approve以及合并,直到一个多月后这个PR终于合并进去了QAQ,PyTorch的第一次合并的流程感觉还是很慢的。(至少对我来说。

PyTorch的第一个PR

3. 发现了几个文档错误相关的PR以及FX模块的一些错误

后面浏览PyTorch相关文档时发现了一些文档错误以及FX的一些错误,又顺手提了2个PR并合并进去了。https://github.com/pytorch/pytorch/pull/64802 & https://github.com/pytorch/pytorch/pull/68043 。当然文档级的失误很少,如果你恰好发现了就尝试体提交一下吧,就可以成为contributor了。不过,文档也是深度学习框架的一个重要组成部分。

4. 又发现了一些BUG&疑惑

同样还是在开发OneFlow算子的时候,通过OneFlow自动测试框架,发现PyTorch SoftPlus的梯度有一些问题。然后整理复现代码提交issue之后发现这个问题已经在PyTorch最近一次版本更新后解决掉了。https://github.com/pytorch/pytorch/issues/61568

然后还有一件疑惑的事情,我在给OneFlow实现CPU反卷积Kernel的时候通过自动测试框架发现在一些非法的数据(反卷积的核的大小比输入长度还大的时候)上PyTorch仍然正常输出了答案,而在OneFlow和PaddlePaddle上均有对应的错误检查并抛出异常。我将其反馈给了PyTorch,但一直没有得到回复。https://github.com/pytorch/pytorch/issues/66542

好了,以上就是今年我加入OneFlow做开发的过程中顺带发现的PyTorch问题以及做的贡献了。**当我们觉得某些情况PyTorch有BUG的时候,要大胆质疑并用其它的框架去验证。**再次回到题目,如何参与PyTorch社区开源贡献呢?我们要勇于用issue提出bug,用pr解决bug。至于如何提pr的教程,Google会很详细的告诉你。

成为很火的开源框架的Contributor是一件不错的事情,特别是对于学生或者初入职场的工程师来说,简历上可能是一个加分项。欢迎大家为PyTorch(https://github.com/pytorch/pytorch)以及国内的深度学习框架比如OneFlow(https://github.com/Oneflow-Inc/oneflow) , Paddle(https://github.com/PaddlePaddle/Paddle) ,Mindspore(https://github.com/mindspore-ai/mindspore) ,MegEngine(https://github.com/MegEngine/MegEngine) 等做出贡献,成为Contributor。

0 人点赞