PyTorch源于LuaTorch重构,受Chainer动态图和HIPS/autograd启发,与JAX同源,通过开放协作与持续创新成长为AI主流框架。
从Lua到大模型:PyTorch不为人知的“盗火”史诗,Chainer与JAX竟是亲兄弟?
你有没有想过,如今AI圈最火、科研界最宠、工业界最稳的深度学习框架PyTorch,竟然是从一门冷门脚本语言Lua中“涅槃重生”的?更离谱的是,它和Chainer之间不是简单的“借鉴”,而是一场双向奔赴、互相启发的技术恋爱;它和JAX看似毫无交集,却共享同一个“祖师爷”——HIPS/autograd。
今天,我们就来揭开PyTorch背后那段鲜为人知的开源江湖往事,带你穿越回2016年,看看一群理想主义程序员如何用代码改写AI的历史!
一切始于Torch7:那个用Lua写神经网络的“非主流”时代
时间倒回2010年,深度学习还在襁褓之中,TensorFlow还没诞生,Keras还是个名字都没听过的小透明。就在这个时候,三位大神——Ronan Collobert、Clément Farabet和Koray Kavukcuoglu联手打造了一个叫Torch7的深度学习框架。别被名字骗了,它其实和后来的PyTorch“同宗不同命”——Torch7是用Lua语言写的,因此也被人亲切地称为LuaTorch。
当时的AI圈,Python还没完全统治天下,而Lua因为轻量、嵌入性强,被不少科研团队用来快速搭建神经网络原型。
作者本人从2012年就深度参与Torch7开发,2014年正式成为核心维护者之一。那时候,Torch7在Facebook(后来的Meta)内部已经小有名气,但它的致命伤也显而易见:整个C/CUDA后端深度绑定Lua,导致扩展性极差。你要是想换个语言调用那些高效的线性代数和卷积核?不好意思,几乎不可能。这种“语言绑架”让团队意识到:是时候重构了!
一场语言中立的革命:把Lua的“心脏”掏出来,为Python铺路
2015年底到2016年中,一场静悄悄的重构风暴在Torch7社区掀起。由Luca Antiga、Sergey Zagoruyko、作者自己、Adam Paszke、Francisco Massa等一众开发者牵头,他们做了一件极其大胆的事:把Torch7里所有和Lua耦合的C/CUDA代码(比如TH、THC、THNN、THCUNN这些底层库)彻底剥离,改造成语言无关的通用后端。
这相当于把LuaTorch的“心脏”和“神经系统”完整摘除,只留下纯粹的计算能力。
这个阶段他们还没想好下一代框架叫什么、用什么语言、长什么样,但共识只有一个:必须现代化、必须解耦、必须拥抱更主流的生态。
而这个时候,Python早已成为数据科学和机器学习的事实标准语言。于是,命运的齿轮开始转动——一场从Lua到Python的“跨语言迁徙”即将上演。
PyTorch横空出世:不是复制,而是进化
2016年初,当时还在读博的Adam Paszke(后来成为PyTorch联合创始人)给作者发邮件,希望能来Facebook实习。巧的是,当时Facebook AI团队只有三人维护LuaTorch:作者、Gregory Chanan和Trevor Killeen。作者灵机一动:不如让Adam来造一个“下一代Torch”?于是,Adam来了,另一位工程师Edward Yang(@colesbury)也正好处于项目空窗期,顺势全职加入。
他们从LuaTorch和LuaTorch-nn代码库直接fork出来,但只取两样东西:一是前面重构好的C/CUDA后端(TH/THC等),二是为了兼容老用户,把LuaTorch的nn模块用自动化工具“转译”成Python代码,这就是PyTorch早期那个神秘的torch.legacy.nn包的由来——它让老用户能无缝迁移模型。
但真正的核心设计,他们是重新写的。而设计灵感来自两大源头:一是torch-autograd(由Alex Wiltschko和Clément Farabet开发),二是日本公司Preferred Networks开发的Chainer。尤其是Chainer,其“Define-by-Run”(动态图)理念彻底颠覆了当时主流的静态图范式,让神经网络像普通Python代码一样可调试、可交互。团队里有个叫Erik Betica的工程师是Chainer死忠粉,天天安利,最终成功把大家“策反”。
与Chainer:不是抄袭,而是共舞
很多人误以为PyTorch是“Chainer的Python复刻版”,这是天大的误解!事实恰恰相反:PyTorch从Chainer v1中汲取了动态图思想,但做了大量原创性改进。比如,在Chainer v1里,你要构建神经网络,得把所有层“显式”传给父类构造函数,或者调用add_link()方法;而PyTorch首创了self.conv = nn.Conv2d(...)这种“属性即模块”的写法,让代码更简洁、更Pythonic。
更重要的是,PyTorch引入了Parameter类,明确区分模型参数(可训练)和普通张量,这一设计后来被Chainer v2反向借鉴。PyTorch还创新性地实现了“变量版本控制”(variable versioning),能自动检测就地操作(in-place ops)引发的梯度计算错误——这些特性在当时都是行业首创。
更有趣的是,这种技术交流是双向的。PyTorch 2017年1月正式开源后,Chainer团队不仅没有敌意,反而主动和PyTorch社区互动。作者2017年还专程飞到日本拜访Preferred Networks团队。后来当Chainer因维护成本过高而停止开发时,Preferred Networks官方宣布全面转向支持PyTorch,并将Chainer用户迁移指南直接指向PyTorch文档。这哪是竞争?这简直是开源界的“英雄惜英雄”!
与JAX的隐秘血缘:同一个祖师爷,两条进化路
再说PyTorch和JAX的关系。很多人以为它们是“对手”,其实它们有共同的“精神祖先”——HIPS/autograd。这是由Matthew Johnson、Dougal Maclaurin、David Duvenaud和Ryan Adams在哈佛智能概率系统(HIPS)实验室开发的自动微分库。Alex Wiltschko开发的torch-autograd正是受此启发,而PyTorch的核心自动微分引擎torch.autograd又直接继承自torch-autograd。
有意思的是,PyTorch团队当初取名torch.autograd时,以为“autograd”是自动微分领域的通用术语,结果不小心和HIPS团队的原始项目名撞了。后来他们专门道歉,承认命名冲突,并高度致敬HIPS团队的开创性工作。而Matthew Johnson和Dougal Maclaurin等人后来离开学术界,加入Google,并以此为基础开发了JAX——所以,PyTorch和JAX就像同父异母的兄弟,一个在Meta土壤中长成工业巨树,一个在Google实验室中淬炼成科研利刃。
持续进化:融合Caffe2、编译器革命与分布式飞跃
PyTorch的崛起并非一蹴而就。2017年后,它开启“海纳百川”模式。最标志性的事件是2018年与Caffe2的合并:Caffe2是Facebook早期为移动端和生产部署设计的高性能框架,其执行引擎和量化工具被PyTorch吸收,催生了TorchScript和后来的PyTorch Mobile。这背后是Yangqing Jia(贾扬清)、Dmytro Dzhulgakov等Caffe2核心成员的贡献。
编译器方面,PyTorch团队前前后后探索了五代编译架构,最终由Zach DeVito、Edward Yang、Adam Paszke等人主导的TorchDynamo和AOTAutograd方案胜出——这直接让PyTorch 2.0实现了“编译即加速”,性能逼近原生C++。
分布式训练也不甘落后。从最初的DataParallel到后来的Fully Sharded Data Parallel(FSDP),PyTorch一步步支撑起千亿参数大模型的训练。而functorch(后融入torch.func)则把JAX的函数式变换思想引入PyTorch,让高阶微分、向量化等操作成为可能——Richard Zou、Horace He等年轻开发者在此功不可没。
致敬开源精神:PyTorch为何能赢?
回看PyTorch的成功,技术只是表象,内核是开源协作精神。作者在文中反复强调:要清晰归功前人。PyTorch从不掩饰自己受Chainer、torch-autograd、HIPS/autograd等项目的启发;Chainer团队也坦然接受PyTorch的反哺。这种“承认源头、开放讨论、互相成就”的文化,正是深度学习框架能快速迭代的关键。
反观某些商业公司,为了塑造“技术原生”神话,刻意抹去历史痕迹,把集体智慧包装成独家秘方——这种做法或许能骗一时眼球,但终将被社区抛弃。而PyTorch团队始终把框架开发视为“科学探索”,像写论文一样标注引用,像开源社区一样欢迎共建。这才是它能从学术圈火到工业界、从实验室走向大模型时代的根本原因。
结语:技术史不是零和游戏,而是交响乐
PyTorch的故事告诉我们:伟大的技术从来不是凭空诞生的。它是无数前人铺路、同代人碰撞、后继者拓展的共同结晶。LuaTorch提供了高性能内核,Chainer点燃了动态图革命,HIPS/autograd奠定了自动微分基石,Caffe2补足了生产部署短板——PyTorch像一个集大成者,站在巨人肩膀上,又反过来推动巨人进化。
今天,当我们用一行model.to('cuda')就启动GPU训练,用with torch.no_grad()轻松关闭梯度,用torch.compile()一键加速模型时,别忘了背后是十年开源协作的厚重积淀。这不仅是代码的胜利,更是开放、透明、尊重历史的工程文化的胜利。
如果你也热爱AI、热爱开源,请记住这些名字:Ronan Collobert, Clément Farabet, Adam Paszke, Edward Yang, Luca Antiga, Sergey Zagoruyko, Preferred Networks团队, HIPS实验室……他们不是遥不可及的神,而是一群愿意分享、敢于重构、乐于致敬的普通开发者。正是他们,让PyTorch成为我们今天手中的“神兵利器”。