【发布时间】:2019-05-22 20:20:27
【问题描述】:
我刚刚发现 PyTorch 文档公开了一些名为 Torch Scripts 的内容。但是,我不知道:
- 什么时候应该使用它们?
- 它们应该如何使用?
- 它们有什么好处?
【问题讨论】:
-
如果你有兴趣,我还做了一个简短的教程,里面有一个使用 Torch 脚本的实际场景:blog.christianperone.com/2018/10/…
我刚刚发现 PyTorch 文档公开了一些名为 Torch Scripts 的内容。但是,我不知道:
【问题讨论】:
Torch 脚本是使用 PyTorch just in time compiler 的两种模式之一,另一种是 tracing。链接文档中解释了这些好处:
Torch 脚本是一种从 PyTorch 代码创建可序列化和可优化模型的方法。任何用 Torch Script 编写的代码都可以从您的 Python 进程中保存并加载到没有 Python 依赖项的进程中。
上面的引用实际上对脚本和跟踪都是正确的。所以
具体来说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。
最后,如何使用它们,请参考所有文档和教程链接。
【讨论】:
nn.Sequential 重新实现为for module in self: x = module(x),则可以使用跟踪,因为self 中包含的模块在执行之间不会更改。如果循环依赖于x,那么你必须使用脚本。