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
)。特别是,如果您的代码不能单独使用跟踪 jit
ed,您应该使用 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 脚本是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow / Numpy 中的 torch.nn.functional.grid_sample 等价物是啥?