在过去十年中,机器学习软件开发的格局发生了重大变化。许多框架来来去去,但大多数都严重依赖于利用 Nvidia 的 CUDA,并且在 Nvidia GPU 上表现最佳。
然而,随着 PyTorch 2.0 和 OpenAI 的 Triton 的到来,英伟达在该领域主要依靠其软件护城河的主导地位正在被打破。
笔者认为,机器学习模型的默认软件堆栈将不再是 Nvidia 的闭源 CUDA。球在 Nvidia 的球场上,他们让 OpenAI 和 Meta 控制了软件堆栈。
由于 Nvidia 的专有工具失败,该生态系统构建了自己的工具,现在 Nvidia 的护城河将被永久削弱。
TensorFlow 与 PyTorch
几年前,框架生态系统相当分散,但 TensorFlow 是领跑者。谷歌看起来准备控制机器学习行业。他们凭借最常用的框架 TensorFlow 以及通过设计/部署唯一成功的 AI 应用特定加速器 TPU 获得了先发优势。
相反,PyTorch 赢了。谷歌未能将其先发优势转化为对新兴 ML 行业的主导地位。
如今,谷歌在机器学习社区中有些孤立,因为它不使用 PyTorch 和 GPU,而是使用自己的软件堆栈和硬件。按照典型的谷歌方式,他们甚至还有一个名为 Jax 的第二个框架,它直接与 TensorFlow 竞争。
由于大型语言模型,尤其是来自 OpenAI 和使用 OpenAI API 或正在构建类似基础模型的各种初创公司的大型语言模型,谷歌在搜索和自然语言处理方面的主导地位甚至没完没了。
虽然我们认为这种厄运和阴霾被夸大了,但这是另一个故事。尽管存在这些挑战,谷歌仍处于最先进机器学习模型的前沿。他们发明了transformers ,并在许多领域(PaLM、LaMBDA、Chinchilla、MUM、TPU)保持最先进的水平。
回到为什么 PyTorch 赢了。虽然谷歌在争夺控制权方面存在一些因素,但这主要是由于 PyTorch 与 TensorFlow 相比具有更高的灵活性和可用性。
如果我们将其归结为第一个主要级别,PyTorch 与 TensorFlow 的不同之处在于使用“ Eager mode ”而不是“ Graph Mode ”。
Eager 模式可以被认为是一种标准的脚本执行方法。深度学习框架会像任何其他 Python 代码一样,逐行立即执行每个操作。这使得调试和理解您的代码更容易,因为您可以看到中间操作的结果并查看您的模型的行为方式。
相反,Graph 模式有两个阶段。第一阶段是表示要执行的操作的计算图的定义。计算图是一系列相互连接的节点,表示操作或变量,节点之间的边表示它们之间的数据流。第二阶段是延迟执行计算图的优化版本。
这种两阶段方法使理解和调试代码更具挑战性,因为在图形执行结束之前您无法看到发生了什么。这类似于“解释”与“编译”语言,如 Python 与 C++。调试 Python 更容易,主要是因为它是解释型的。