在 PEFT 中为嵌入层构建 DoRA 支持

社区文章 发布于2024年8月23日

image/png

引言

为开源做贡献可能是一项艰巨的任务,特别是如果你是社区的新手或正在处理一项具有挑战性的功能。然而,它也是开发者所能拥有的最有益的经历之一。这是一个与杰出人才合作、向他人学习并对广泛使用的软件产生实际影响的机会。

在这篇博客文章中,我将带您了解我通过为嵌入层实现 DoRA 支持,为 Hugging Face 的 PEFT 仓库贡献的旅程,我希望这能激励更多人投身于开源贡献。

开端:发现机遇

这一切都始于一个名为“DoRA 对嵌入的支持”的问题。最初的帖子请求 DoRA(权重分解低秩适应)对嵌入层的支持,以便与 LoRA(低秩适应)框架无缝集成。

此请求的动机是需要使用额外令牌微调模型。仓库维护者 Benjamin 回应道,承认 DoRA 尚未支持嵌入,并邀请社区贡献。

迎接挑战

作为一名对 DoRA 论文感兴趣的人,我发现这个问题特别吸引人。我接受了实现嵌入模块的挑战,我知道这将是对社区的重大贡献。然而,这并不容易。我的第一次提交花了一些时间,因为我必须理解仓库的内部工作原理,理解 LoRA 适配器是如何注入模块的,并掌握 DoRA 适配器权重如何用于线性和卷积层(因为它们已经实现)。

经过大量的研究和努力,我提交了我的第一次提交,标志着 拉取请求 的开始。

鼓励的话语

Benjamin 的回应令人鼓舞。他评论说代码看起来不错,并建议虽然将来可能需要一些重构,但我们应该保持当前的实现不变。他还指出,目前没有任何关于将 DoRA 应用于嵌入层的现有参考,这使得这项贡献特别令人兴奋。

这个反馈极大地激励了我。能够站在开发可能树立新标准的新功能的最前沿,感觉非常棒。

他提出了下一步:针对现有示例测试新的 DoRA 嵌入层,并将结果与 LoRA 嵌入进行比较。

一个激动人心的建议

激动人心的事不止于此。开源社区的另一位杰出人物 Sayak 建议请求 DoRA 作者进行审查,类似于添加 Conv DoRA 支持时的做法。让 DoRA 作者审查我的作品的想法既令人兴奋又令人望而生畏。这增加了犯错的可能性,但也提供了一个令人难以置信的学习机会。

学习曲线:编写测试并发现错误

随着 PR 的进展,Benjamin 审查了我的代码,并建议我编写测试以确保一切正常运行。这是关键一步,因为它导致了一个我完全忽略的重大错误的发现。在编写测试时,我意识到我在通过 DoRA 嵌入层向前传播输入时出现了错误。

这是一个令人拍脑门的时刻,但也强调了编写测试用例的重要性。

难忘的时刻:DoRA 作者的反馈

随后,一个我将永远珍视的时刻来临了。DoRA 的第一作者 Shih-Yang 加入了讨论,并审查了我的实现。他建议了一个潜在的推理速度优化,指出由于嵌入层输入上没有 dropout,我们可以跳过一个前向调用。这是一个虽小但却能显著提升性能的细节。

参与这次讨论感觉超现实。我被一群比我经验丰富的杰出人才包围着,然而我却在这里,为直接影响代码库的对话做出了贡献。这是一次令人谦卑的经历,我为此机会感到感激。

结论:为开源做贡献的乐趣

这段旅程教会了我很多关于编码、协作和开源社区的知识。它巩固了这样一个想法:为开源做贡献不仅仅是编写代码;它更是与他人互动、学习并作为一名开发者成长的过程。

如果您正在考虑为开源做贡献,我鼓励您勇敢尝试。从小处着手,与社区互动,不要害怕犯错。这次经历是无价的,看到您的代码被广泛使用的库采纳的满足感是无与伦比的。

我很高兴能看到社区将如何使用新的 DoRA 嵌入层,并且我已经期待我的下一次贡献。编码愉快!

社区

注册登录 发表评论