PyTorch 中的 Torch 脚本是啥?

Posted

技术标签:

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

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

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

【问题讨论】:

如果你有兴趣,我还做了一个简短的教程,里面有一个使用 Torch 脚本的实际场景:blog.christianperone.com/2018/10/… 【参考方案1】:

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

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

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

    您可以序列化模型,然后通过 C++ 原生模块 LibTorch 在 Python 之外运行它们。这使您可以将 DL 模型嵌入到各种生产环境中,例如移动设备或物联网。有一个关于将模型导出到 C++ 的官方指南here。 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,那么你必须使用脚本。

以上是关于PyTorch 中的 Torch 脚本是啥?的主要内容,如果未能解决你的问题,请参考以下文章

pytorch是啥?

Tensorflow / Numpy 中的 torch.nn.functional.grid_sample 等价物是啥?

在 PyTorch 中保存训练模型的最佳方法是啥? [关闭]

PyTorch使用Torch自带的工具进行性能分析

PyTorch使用Torch自带的工具进行性能分析

PyTorch 1.0 中文文档:torch.onnx