内容提要
torch.export()用于提前编译Python可调用对象,生成功能图。它利用TorchDynamo进行字节码追踪,AOT Autograd功能化图形,并通过torch.fx.graph提供图形表示。ExportedProgram包含GraphModule和图签名,支持动态形状和序列化。使用export_for_training()可处理非功能操作,但存在无法追踪的代码和缺失的假内核等限制。
关键要点
-
torch.export()用于提前编译Python可调用对象,生成功能图。
-
torch.export()内部使用TorchDynamo进行字节码追踪,AOT Autograd功能化图形,并通过torch.fx.graph提供图形表示。
-
ExportedProgram包含GraphModule和图签名,支持动态形状和序列化。
-
GraphModule将每个指令编译为低级ATen操作,ATen是PyTorch的核心张量库。
-
ExportedProgram的图签名是功能性的,给定相同输入总会产生相同输出。
-
严格模式和非严格模式都将模型编译为torch.fx.Graph,非严格模式需要Python运行时,严格模式通过torch.Dynamo检查字节码。
-
使用export_for_training()可以处理非功能操作,适用于训练场景。
-
支持动态形状,使用Dim()生成编译期间的范围约束。
-
torch.export.save()用于保存模型,torch.export.load()用于加载模型。
-
在导出期间,某些值(如输入形状和Python原始类型)被固定为常量,简化图形。
-
torch.export存在一些限制,如无法追踪的代码和缺失的假内核可能导致失败。
延伸解读
torch.export与torch.compile的区别
torch.export和torch.compile都是用于优化PyTorch模型的工具,但它们的工作原理不同。torch.export主要通过提前编译生成功能图,而torch.compile则侧重于在运行时进行动态编译。理解这两者的区别有助于开发者选择合适的工具来满足不同的需求。
动态形状的支持
torch.export支持动态形状的处理,这意味着在编译期间可以根据输入的不同生成相应的范围约束。这对于需要处理变形输入的模型尤为重要,开发者在使用时应注意如何定义动态形状,以确保模型的灵活性和适应性。
导出过程中的限制
在使用torch.export时,开发者需注意一些限制,例如无法追踪的代码和缺失的假内核可能导致导出失败。这要求开发者在编写模型时考虑到这些因素,必要时进行代码重写或提供额外信息,以确保导出过程顺利进行。
延伸问答
torch.export()的主要功能是什么?
torch.export()用于提前编译Python可调用对象,生成功能图。
torch.export()如何处理动态形状?
torch.export()支持动态形状,使用Dim()生成编译期间的范围约束。
ExportedProgram包含哪些主要组件?
ExportedProgram包含GraphModule和图签名。
如何使用torch.export保存和加载模型?
使用torch.export.save()保存模型,使用torch.export.load()加载模型。
torch.export的限制是什么?
torch.export存在无法追踪的代码和缺失的假内核等限制,可能导致失败。
torch.export与torch.compile有什么区别?
torch.export用于提前编译并生成功能图,而torch.compile主要用于即时编译。