PyTorch 是怎么吃掉 TensorFlow 的
我先给一个结论。PyTorch 在 2023 年 NeurIPS 的接受论文中拿下超过八成的实验份额,连 Google 自己的研究也开始用它。这并不意味着 TensorFlow 死了,但研究圈已经整体搬家。这场翻转的关键不在算子优化或硬件兼容,而在于一群研究者做了一个选择:他们不想再写配置文件,他们想写 Python。
一个没人想要的 Lua
PyTorch 的源头在 2001 年就埋下了。那年瑞士 IDIAP 研究所发布了一个机器学习库。它叫 Torch。底层用 C++ 和 CUDA 写成,性能比同期大部分框架快出一个数量级。但它有一个致命伤:前端绑定了 Lua。
Lua 诞生于 90 年代的巴西。几个教授在学校写着玩,弄出了这门极简脚本语言。游戏行业后来用它。World of Warcraft 的部分界面就是 Lua 写的。但数据科学家很少碰它。
2010 年前后,Ronan Collobert、Clément Farabet 和 Koray Kavukcuoglu 重写了 Torch。新产品叫 Torch7。底层仍是 C,前端仍是 Lua。Meta 的 FAIR 实验室把它当成主力工具。Yann LeCun 团队大量依赖它。
问题出在用户增长上。2015 年 TensorFlow 开源。Jeff Dean 站台,Google Brain 背书,论文实验全跑在上面。那批硕士生、博士生和工业界工程师都学 Python。他们直接涌向了 Google 的生态。Torch 性能再好,也扛不住一条现实:没人想学 Lua。
FAIR 内部开始讨论对策。讨论结果后来成了行业经典决策:保留后端,扔掉前端。用 Python 重写一切。
动态图
TensorFlow 在同期坚持静态计算图。你写代码时,本质上是先画一张图。你定义好所有操作和依赖关系。图构造完成后,一次性塞给后端执行。这样做的好处是性能优化容易。坏处是调试像恶梦。你想在训练中途打印一个变量,得加一句 tf.Print,然后重新构造图,再跑一遍。
2015 年,Seiya Tokui 还在日本 Preferred Networks 工作。他做了一个叫 Chainer 的小框架。他提出了当时看来异端的想法:抛弃静态图。模型前向跑一步,计算图就实时构建一步。你可以在训练过程中随时 print、break、改代码。像写普通 Python 一样写深度学习。
Chainer 用户极少,但它影响了两个关键后来者。一个是哈佛 HIPS 组的 autograd。另一个是 Soumith Chintala。
Chintala 在 FAIR 做研究工程师。他用 Torch 时每天都痛苦于 Lua 的语法限制。2016 年初,他和 Adam Paszke、Sam Gross、Gregory Chanan 在 FAIR 内部启动 PyTorch。他们保留 Torch 的 C/CUDA 后端,用 Python 重写全部前端 API,实现动态计算图。
2016 年 9 月,PyTorch Alpha 版发布。Chintala 在 GitHub 上写了一句备注:「我们想做一件在这个领域还没人做好的事。」
从实验室传开
PyTorch 的起飞方式和 TensorFlow 完全相反。TensorFlow 靠 Google 的体量推广:白皮书、开发者大会、企业合同、TPU 绑定。PyTorch 靠的是研究者的笔记本电脑。
2017 年开始,一种典型模式出现了。博士生在 arXiv 发论文,代码开源在 GitHub。仓库里有一份 train.py,打开第一行就是 import torch。学长学姐推荐学弟学妹用 PyTorch,理由全部一样:你可以断点、可以 print、可以交互测试。TensorFlow 坚持静态图。你改一行代码,要等十分钟跑完图构造。
2017 年底,Meta 和微软联合发布 ONNX。它的战略意义一直被低估。ONNX 让 PyTorch 训练的模型能导出到任何推理后端,包括 NVIDIA TensorRT。工业部署链路因此打通:你用 PyTorch 做实验,训完后导出 ONNX,丢到生产环境,TensorRT 在那里负责推理。
2018 年,Hugging Face 选了 PyTorch。他们的 Transformers 库上线,支持当时刚开始火的 BERT 和 GPT。所有研究者都想微调预训练模型。他们下载 Hugging Face 的库,第一件事就是 pip install torch。
关键一票
2020 年 1 月 30 日,OpenAI 发了一篇简短博客文章。标题是「OpenAI 标准化到 PyTorch」。正文只有几句话:从今天起,所有研究项目使用 PyTorch 作为标准框架。我们已在几个大型项目上完成迁移,结果很满意。我们还将开源 PyTorch 版 GPT 训练代码。
这是 TensorFlow 被翻盘的正式信号。OpenAI 的规模在当时数一数二。它选了对手的框架。同一年,特斯拉 Andrej Karpathy 在演讲里说,Autopilot 的神经网络训练全在 PyTorch 上。DeepMind 的 AlphaFold 也在 PyTorch 上。
TensorFlow 试图反击。2019 年发布的 TensorFlow 2.0 把 Keras 做成默认 API,模仿 PyTorch 的动态图体验。但这个举动得罪了原来的静态图用户。他们觉得自己的生产系统被降级了。同时,TensorFlow 2.0 也没有完全追上 PyTorch 的 Python 原生感。
2022 年 9 月,Meta 把 PyTorch 捐给 Linux 基金会,成立独立的 PyTorch 基金会。这意味着 PyTorch 不再属于一家公司。竞争对手可以在同一个基础上合作,不用担心 Meta 在背后控制什么。
2023 年 3 月,PyTorch 2.0 发布。核心组件叫 TorchDynamo。它是一个 Python 层面的 JIT 编译器,能让 PyTorch 代码自动跑得比以前快一倍。到这个版本,PyTorch 已经同时满足了两件事:研究灵活性,以及生产性能。
只有 Python 赢了
TensorFlow 没有死。2025 年,Google 的内部系统、TPU 集群和大量企业客户还跑在它上面。但它已经从「所有人的选择」缩小成了「Google 生态的选择」。
PyTorch 赢在哪里?答案跟编译器优化、底层算子或设备兼容性关系不大。它赢在了一个点上:深度学习研究员干活的方式是实验。实验需要调试。调试需要交互。交互需要 Python。
TensorFlow 一开始把它当成工程问题。PyTorch 把它当成用户体验问题。
你的用户在笔记本上写代码。他们需要 print 一个中间变量来确认逻辑。他们不想等图编译。他们不在乎底层框架是什么。他们在乎下一次改完超参以后,能不能在三分钟内看到新的 loss 曲线。
Chintala 在 2023 年写过一篇博客回顾 PyTorch 的起源。文章里有句话:「我们一开始没有宏伟的架构设计。我们只是想做个工具,帮研究员省点事。然后它变成了所有人都在用的东西。」