上篇:PyTorch,让深度学习从“造火箭”变成“搭乐高”的神器

张开发
2026/4/12 17:10:32 15 分钟阅读

分享文章

上篇:PyTorch,让深度学习从“造火箭”变成“搭乐高”的神器
先给个准确定义PyTorch到底是什么PyTorch一个开源的深度学习框架由Facebook现在的Meta在2017年1月正式发布。这玩意儿能干两件大事一是GPU加速的张量计算你可以理解成“带涡轮增压的NumPy”二是自动构建和训练神经网络后者靠一个叫自动微分Autograd的引擎来实现。但光说定义没啥意思。你真正要懂的是——PyTorch为什么会冒出来以及它凭啥在短短几年内把谷歌的TensorFlow从王座上拉下来。为什么会出现得从深度学习框架的“黑暗时代”讲起在PyTorch出现之前学术界和工业界其实已经被几个框架“折磨”得不轻。最早出名的是Theano2008年从蒙特利尔大学出来的Python库算是Python深度学习框架的“老祖宗”。然后是2013年的Caffe专注于计算机视觉速度快但不够灵活。再然后是2015年谷歌推出的TensorFlow背靠大树迅速成为霸主。这些框架有个共同的毛病静态计算图。什么意思你用这些框架搭神经网络得先把整个“施工图纸”画好定义好每一层、每一个运算然后才能把数据扔进去跑。想中途改个结构抱歉得重新画图纸、重新编译。对做研究的人来说这简直是噩梦——你改一行代码可能得等好几分钟才能看到效果。更烦人的是Theano用的是声明式编程风格你得先定义“我要算什么”然后框架再去执行中间出错了很难调试。TensorFlow虽然功能强大但它的API应用程序接口早期被吐槽“混乱、难用”文档也让人头大。学术界的人想要的是我写一行代码马上能看到结果我想调试能像普通Python一样设断点我想改模型结构不用重新编译整个图。但当时的主流框架没一个能满足这个需求。转折点Torch的“Python版”横空出世PyTorch其实有个亲爹叫Torch。Torch早在2002年就诞生了是一个科学计算框架后来发展出Torch7版本在深度学习圈子里小有名气。但Torch有个致命伤——它用Lua语言作为接口。Lua虽然简洁高效但用的人少。深度学习研究者大多是用Python的你让他们为了用Torch去学一门新语言门槛太高。Facebook AI研究院FAIR看到了这个机会。2016年9月Adam Paszke、Sam Gross和Soumith Chintala等人开始开发PyTorch的初始版本。2017年1月他们正式向全世界发布了PyTorch。本质上PyTorch就是把Torch的核心能力“翻译”成了Python语言同时引入了一套全新的设计理念动态计算图。动态vs静态PyTorch制胜的关键一招这是PyTorch和TensorFlow最核心的区别你得搞明白。静态图TensorFlow 1.x的方式你先画好一张“运算流程图”定义好每个节点做什么然后编译成可执行代码最后才能把数据塞进去跑。优点是可以做全局优化、跑得快缺点是不灵活、调试难。动态图PyTorch的方式你写代码的过程就是构建计算图的过程。每执行一行图就实时生成。你可以随时打印中间结果、随时修改网络结构、随时打断点调试。打个比方静态图像预制菜——你得先把所有食材切好、调料配好、包装好然后才能下锅。动态图像现点现炒——厨师看到订单才开始切菜、开火你想加个葱花他马上就能加。对做研究的人来说动态图就是救星。你想验证一个新想法改一行代码马上跑起来看效果模型中间某层输出不对print出来看一眼瞬间定位问题。这大大加快了迭代速度。TensorFlow后来也学乖了在1.5版本引入了Eager Execution机制实现了动态图但已经慢了PyTorch一步。更“Pythonic”的体验不用再写“非Python代码”PyTorch的另一个杀手锏是它用起来就像原生Python。你写PyTorch代码不需要学习什么特殊语法不需要写字符串来定义运算图不需要用框架自带的调试工具。直接用Python的print、用pdb断点调试、用任何你熟悉的Python库配合使用。这让从NumPy转过来的用户几乎零学习成本——PyTorch的张量操作和NumPy数组操作几乎一模一样只不过PyTorch的张量能自动扔到GPU上跑。市场份额从“小透明”到“学术圈一哥”PyTorch刚出来的时候没几个人看好它能挑战TensorFlow的地位。但结果呢短短几年PyTorch成了学术界事实上的标准。到2022年AI顶会论文中使用PyTorch的比例已经达到80%。TensorFlow虽然还在工业界有广泛使用但在研究领域PyTorch已经把谷歌拉下了马。为什么学术界这么偏爱PyTorch因为搞研究的人需要的是灵活、快、好调试而不是“能跑多快”。PyTorch的动态图正好匹配了研究者的工作方式。

更多文章