PyTorch中的Torch Scripts是什么?

57

我刚刚发现PyTorch文档中提供了一种称为Torch脚本的东西。但是,我不知道:

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

3
如果您感兴趣的话,我还做了一个使用torch scripts的实际情景短教程:http://blog.christianperone.com/2018/10/pytorch-1-0-tracing-jit-and-libtorch-c-api-to-integrate-pytorch-into-nodejs/。 - Tarantula
1个回答

76
Torch Script是使用PyTorch即时编译器的两种模式之一,另一种是追踪。相关文档中解释了其优点:
Torch Script是一种从PyTorch代码创建可序列化和可优化模型的方法。在 Torch Script 中编写的任何代码都可以保存在 Python 进程中,并在没有 Python 依赖项的进程中加载。
上述引用实际上适用于脚本和追踪。所以:
1. 您可以将模型序列化,稍后通过C++本地模块LibTorch在Python之外运行它们。这使您可以将DL模型嵌入到各种生产环境中,例如移动或IoT。此处有一份关于将模型导出为C++的官方指南here。 2. PyTorch可以编译您的jit-able模块,而不是将其作为解释器运行,从而允许进行各种优化并提高性能,无论是在训练还是推理期间。这对开发和生产都同样有帮助。
关于Torch Script,与跟踪相比,它是Python的一个子集,详细规定 在此处, 当遵循这些规定时,可以通过PyTorch编译。编写Torch Script模块比跟踪常规的 nn.Module 子类更费力,但它允许一些额外的功能,尤其是像 if 语句或 for 循环这样的流程控制。跟踪将这种流程控制视为“常量” - 换句话说,如果您在模块中有一个 if model.training 子句,并使用 training = True 进行跟踪,则无论您以后将 training 变量更改为 False ,它始终会以这种方式运行。
回答您的第一个问题,如果您想在Python之外部署模型,则需要 使用 jit ,否则,如果您想以牺牲额外开发工作的代价获得一些执行性能,则应该使用 jit (因为并不是每个模型都可以直接符合 jit )。特别是,如果您的代码依赖于某些功能,例如 if 语句,则应使用Torch Script,因为您的代码无法通过跟踪单独 jit 。为了最大的人体工程学,您可能想要混合使用两者并根据具体情况进行选择。

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


@Jatentaki,所以for循环也应该使用Torch Script而不是跟踪模式,对吗?因为跟踪模式无法处理控制流程? - thinkdeep
1
@coder 是的,除非循环总是以相同的次数执行相同的操作,否则使用跟踪是可以的。例如,如果您正在将nn.Sequential重新实现为for module in self: x = module(x),则可以使用跟踪,因为包含在self中的模块在执行之间不会改变。如果循环取决于x,则必须使用脚本。 - Jatentaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接