【问题标题】:What are Torch Scripts in PyTorch?PyTorch 中的 Torch 脚本是什么?
【发布时间】:2019-05-22 20:20:27
【问题描述】:

我刚刚发现 PyTorch 文档公开了一些名为 Torch Scripts 的内容。但是,我不知道:

  • 什么时候应该使用它们?
  • 它们应该如何使用?
  • 它们有什么好处?

【问题讨论】:

标签: pytorch jit


【解决方案1】:

Torch 脚本是使用 PyTorch just in time compiler 的两种模式之一,另一种是 tracing。链接文档中解释了这些好处:

Torch 脚本是一种从 PyTorch 代码创建可序列化和可优化模型的方法。任何用 Torch Script 编写的代码都可以从您的 Python 进程中保存并加载到没有 Python 依赖项的进程中。

上面的引用实际上对脚本和跟踪都是正确的。所以

  1. 您可以序列化模型,然后通过 C++ 原生模块 LibTorch 在 Python 之外运行它们。这使您可以将 DL 模型嵌入到各种生产环境中,例如移动设备或物联网。有一个关于将模型导出到 C++ 的官方指南here
  2. PyTorch 可以编译您的 jit-able 模块,而不是将它们作为解释器运行,从而允许在训练和推理期间进行各种优化并提高性能。这对开发和生产同样有帮助。

具体来说Torch Script,相对于Tracing来说,它是Python的一个子集,详细说明here,只要遵守它,就可以被PyTorch编译。编写 Torch 脚本模块而不是跟踪常规的 nn.Module 子类更加费力,但它允许一些额外的功能而不是跟踪,最明显的是流控制,如 if 语句或 for 循环。跟踪将此类流控制视为“常量” - 换句话说,如果您的模块中有 if model.training 子句并使用 training=True 跟踪它,即使您将 training 变量更改为False 稍后。

要回答您的第一个问题,如果您想在 Python 之外部署模型,需要使用 jit,否则如果需要,应该使用 jit以额外的开发工作为代价获得一些执行性能(因为并非每个模型都可以直接符合jit)。特别是,如果您的代码不能单独使用跟踪 jited,您应该使用 Torch 脚本,因为它依赖于一些功能,例如 if 语句。为了最大程度地符合人体工程学,您可能需要根据具体情况mix the two

最后,如何使用它们,请参考所有文档和教程链接。

【讨论】:

  • @Jatentaki 所以,for-loop 也应该使用 Torch 脚本而不是跟踪模式,对吗? b/c 跟踪模式无法处理控制流?
  • @coder 是的,除非循环总是执行相同的操作相同的次数,那么使用跟踪就可以了。例如,如果您将nn.Sequential 重新实现为for module in self: x = module(x),则可以使用跟踪,因为self 中包含的模块在执行之间不会更改。如果循环依赖于x,那么你必须使用脚本。
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 2019-11-17
  • 2015-09-20
  • 2021-11-21
  • 2022-07-22
  • 2018-02-16
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多