PyTorch

关注
义项:开源机器学习框架
PyTorch

PyTorch是一个开源的机器学习与深度学习框架,最初由Meta(原Facebook)旗下的人工智能研究实验室FAIR主导开发,2016年公开发布首个版本,现由Linux基金会下属的PyTorch基金会治理,采用修改版BSD许可证发布[1]。它以Python为主要前端接口,具备GPU加速的张量计算能力与基于磁带式自动微分的动态计算图机制,被广泛用于计算机视觉、自然语言处理、强化学习和生成式人工智能等方向的研究与生产部署[2]。截至2024年,它已成为人工智能与机器学习领域使用最广的深度学习框架之一[3]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

PyTorch是一套面向机器学习与深度学习的开源框架,官方将其定位为从研究原型到生产部署的加速工具。它在设计上强调灵活性与模块化,同时兼顾生产环境所需的稳定性与支持能力。

在结构上,PyTorch可分为前端与后端两部分:前端是供使用者直接调用的Python应用程序接口,后端则是框架内部的实现,其中包括自动微分引擎Autograd[2]。它以张量为核心数据结构,torch.Tensor用于存储和运算同构的多维矩形数组,这类张量与NumPy数组相似,但可以放到支持CUDA的英伟达图形处理器上运行[1]。除Python接口外,PyTorch也提供C++接口[1]。

PyTorch基于早期的科学计算框架Torch开发,早期版本沿用Torch7的张量库,其后逐步演变为自有的张量实现[2]。它与TensorFlow并列为深度学习领域使用最广的两大框架[4]。

原理

PyTorch提供两项高层能力:一是类似NumPy的张量计算,并可通过图形处理器获得显著加速;二是建立在磁带式自动微分系统之上的深度神经网络[1]。所谓磁带式,是指前向计算过程被逐条记录下来,反向传播时按记录逆序回放,从而自动求出梯度。

计算图采用动态构建方式,即定义与运行同步发生,代码逐行执行,因此调试器与错误堆栈能够直接指向代码定义的位置,无需先编译静态图。这一机制在模型开发与调试阶段便于在运行时打印、修改或分析计算图[5]。

在性能层面,PyTorch 2.0引入了torch.compile作为主要接口,它包装模型并返回编译后的模型,其底层由TorchDynamo、AOTAutograd、PrimTorch与TorchInductor组成[6]。其中TorchDynamo借助Python的框架评估钩子捕获计算图,TorchInductor则为多种加速器生成代码,在英伟达与AMD图形处理器上以OpenAI Triton作为关键构件,在英特尔处理器上生成多线程向量化的C++代码[6]。当遇到无法捕获的Python代码时会发生图中断,编译被中断、执行该段代码后继续编译,这会损失部分优化机会,但可避免结果错误或程序崩溃[7]。

PyTorch还通过torch.jit提供编译栈TorchScript,可从PyTorch代码生成可序列化、可优化的模型。TorchScript采用静态图表示,计算图在执行前定义并编译一次,以提升推理阶段的性能,这与PyTorch默认的动态图执行方式不同[8]。

发展历程

PyTorch的源头可追溯到Torch系列框架。Torch是瑞士Idiap研究所的一个机器学习与科学计算项目,最初以Lua语言编写,后采用LuaJIT提升性能,Torch7是该系列最后一个版本,在其神经网络库获得较高评价的同时,Lua语言的流行度已不及Python[5][2]。

2016年,主导Torch7的Soumith Chintala收到当时在波兰读大学的Adam Paszke的询问,后者希望用Python替换Torch中的Lua,随后又有Sam Gross与Gregory Chanan加入[5]。团队经过约一个半月的开发做出框架雏形,并邀请约100名来自不同公司和大学的开发者试用,早期反馈帮助其在一周内修复了30多个问题[4]。框架最初版本于2016年推出,同年10月在Facebook公开发布[2][9]。

与简单地封装Lua Torch不同,PyTorch重构了张量之上的全部模块,并加入自动求导系统[10]。2017年9月,Meta与微软共同发起开放神经网络交换项目,用于在不同框架之间转换模型;2018年3月底,Caffe2被并入PyTorch[1]。2018年10月,Facebook在NeurIPS 2018会议上宣布发布PyTorch 1.0,将研究与生产能力统一到同一框架中,被视为其商业化进程的重要一步[2][11]。

2022年9月,Meta宣布PyTorch由新成立的PyTorch基金会治理,该基金会是Linux基金会的下属机构[1]。基金会旨在培育一个供应商中立的开源项目生态[3]。2023年3月15日,PyTorch 2.0发布,引入torch.compile,官方称其在165个开源模型中有93%可正常工作,float32精度下平均提速20%,自动混合精度下平均提速36%[6]。

应用

PyTorch被广泛用于学术界与工业界,覆盖自然语言处理、计算机视觉、强化学习与生成式人工智能等场景。它针对中央处理器、图形处理器以及自定义硬件加速器进行了优化,支持分布式训练,并可将模型部署到云平台与移动设备上。

在模型生态方面,不少深度学习软件构建于PyTorch之上,包括特斯拉的Autopilot、Uber的Pyro、Hugging Face的Transformers、PyTorch Lightning与Catalyst[1]。生物信息学领域也大量采用它,用于分析复杂的生物数据[12]。

在应用落地上,Meta将PyTorch用于旗下产品的推荐与增强现实功能。以图片社交产品Instagram的个性化推荐为例,其模型训练数据量最大可达10TB,采用PyTorch后训练与调试大规模模型的时间从数月缩短到数周甚至数天,团队还通过模型自动分片在单机上训练更大的模型[11]。

面向移动与嵌入式设备的部署,PyTorch提供了独立于TorchScript的ExecuTorch方案,采用torch.export导出并以.pte文件形式下发,运行时为可链接进应用程序的C++库[13][8]。该运行时体积较小,可运行于手机、嵌入式设备乃至微控制器,并已用于Meta旗下应用与雷朋智能眼镜等产品[14]。

局限

动态图带来了调试便利,但在早期也意味着性能优化的空间受限。PyTorch通过TorchScript等编译路径将动态图转换为静态图来提升推理效率,而TorchScript采用静态图表示,计算图需在执行前定义并编译一次[8]。目前TorchScript已被弃用,其功能正在被逐步移除,PyTorch官方建议新的移动端与边缘部署改用ExecuTorch[8]。

编译路径本身也存在限制。在torch.compile中,数据相关的控制流会触发图中断,导致优化机会丢失[7]。其动态形状支持在推出时仍属原型阶段,存在较多限制,例如依赖数据的nonzero等运算仍需中断图形,动态特性也无法与非标准的reduce-overhead或max-autotune模式配合使用[6]。

导出到设备端同样有约束。torch.export要求得到不含Python、可在推理时运行的图,因此基于张量取值的条件分支、循环次数依赖输入的循环、带阈值的提前返回等数据相关控制流无法被捕获,导出过程会直接报错,需要改写在模型中而非导出器一侧[13]。此外,导出图默认会针对示例输入的形状特化,若某个维度需要变化,必须显式声明动态形状[13]。

后端加速的覆盖范围也是有限的。分区器会挑选可加速的算子,其余部分回落到可移植的CPU内核,因此后端实际接管的图占比是关键指标,若一个模型仅有一小部分算子被接管,其表现会接近CPU模型并额外承担传输开销[13]。在不同框架之间转换模型时,语义差异也可能在部署之后才暴露,例如PyTorch中的量化感知训练未必能忠实转换为其他格式的量化语义[15]。

参见

  • TensorFlow —— 与PyTorch并列为使用最广的深度学习框架,两者常被相互比较

  • NumPy —— PyTorch的张量计算在设计上与其相似,但支持图形处理器加速

  • 自动微分 —— PyTorch的Autograd引擎所实现的核心机制

  • CUDA —— PyTorch在英伟达图形处理器上运行张量运算所依赖的计算平台

  • Linux基金会 —— PyTorch基金会所属的上级组织

  • 开源软件 —— PyTorch以修改版BSD许可证发布的软件形态

词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T22:17:01Z

历史版本

本条目引用的词条
TensorFlow NumPy 自动微分 CUDA Linux基金会 开源软件