TorchScript总结

TorchScript教程

TorchScript介绍

TorchScript是Pytorch模型(继承自nn.Module)的中间表示,可以在像C++这种高性能的环境中运行。
这个教程主要涵盖以下内容:

  1. Pytorch基础
    • Modules
    • 定义forward函数
    • 将modules组合进modules
  2. 定义转换pytorch的modules到TorchScript的方法,一个高性能的部署运行:
    • 追踪一个已存在的module
    • 使用scripting来直接编译一个module
    • 如何结合两者方法
    • 保存和加载TorchScript的modules

Pytorch模型编写基础

一个Module定义基础包含以下内容:

  1. 一个构造器,准备一些初始化参数
  2. 一个Parameters和sub-Modules的集合,这些将会在构造器内初始化,如torch.nn.Linear之类的
  3. 一个forward函数,当module被调用时调用

如下一个示例模型:

class MyDecisionGate(torch.nn.Module):
    def forward(self, x):
        if x.sum() > 0:
            return x
        else:
            return -x

class MyCell(torch.nn.Module):
    def __init__(self):
        super(MyCell, self).__init__()
        self.dg = MyDecisionGate()
        self.linear = torch.nn.Linear(4, 4)

    def forward(self, x, h):
        new_h = torch.tanh(self.dg(self.linear(x)) + h)
        return new_h, new_h

my_cell = MyCell()
print(my_cell)
print(my_cell(x, h))

#输出如下
MyCell(
  (dg): MyDecisionGate()
  (linear): Linear(in_features=4, out_features=4, bias=True)
)
(tensor([[-0.0657,  0.1869,  0.8526,  0.3125],
        [ 0.6072,  0.7615,  0.6674,  0.7230],
        [ 0.0875,  0.7908,  0.6205,  0.5743]], grad_fn=<TanhBackward>), tensor([[-0.0657,  0.1869,  0.8526,  0.3125],
        [ 0.6072,  0.7615,  0.6674,  0.7230],
        [ 0.0875,  0.7908,  0.6205,  0.5743]], grad_fn=<TanhBackward>))

其中torch.nn.Linear是一个Module都继承了Module,打印Module可以给出其层级。可以看到其子类和参数。
其中,输出中有grad_fn,允许我们潜在的计算导数。
这里我们加入了MyDecisionGate,这个modules使用了控制流control flow,包含了循环和if判断。
许多框架在给定完整程序的情况下计算符号的导数,但是Pytorch中在计算的时候记录,在计算中向后回放。这样就不用为所有的构造定义导数函数。

TorchScript基础

TorchScript提供了工具来捕捉模型的定义,即使在轻量灵活和动态的Pytorch中。我们通过tracing 的方法。
如下:

class MyCell(torch.nn.Module):
    def __init__(self):
        super(MyCell, self).__init__()
        self.linear = torch.nn.Linear(4, 4)

    def forward(self, x, h):
        new_h = torch.tanh(self.linear(x) + h)
        return new_h, new_h

my_cell = MyCell()
x, h = torch.rand(3, 4), torch.rand(3, 4)
traced_cell = torch.jit.trace(my_cell, (x, h))
print(traced_cell)
traced_cell(x, h)

# 输出
MyCell(
  original_name=MyCell
  (linear): Linear(original_name=Linear)
)

其中,我们调用了torch.jit.trace,传入Module和符合的示例输入。
它会调用Moduel并将操作记录下来,当Module运行时记录下操作,然后创建torch.jit.ScriptModule的实例(其中TracedModule是一个实例)
TorchScript记录下模型定义在中间表示中(Intermediate Representation (IR)),在深度学习中通常被称为graph,我们可以打印.graph属性。

print(traced_cell.graph)
# 输出
graph(%self.1 : __torch__.MyCell,
      %input : Float(3, 4, strides=[4, 1], requires_grad=0, device=cpu),
      %h : Float(3, 4, strides=[4, 1], requires_grad=0, device=cpu)):
  %21 : __torch__.torch.nn.modules.linear.Linear = prim::GetAttr[name="linear"](%self.1)
  %23 : Tensor = prim::CallMethod[name="forward"](%21, %input)
  %14 : int = prim::Constant[value=1]() # /var/lib/jenkins/workspace/beginner_source/Intro_to_TorchScript_tutorial.py:188:0
  %15 : Float(3, 4, strides=[4, 1], requires_grad=1, device=cpu) = aten::add(%23, %h, %14) # /var/lib/jenkins/workspace/beginner_source/Intro_to_TorchScript_tutorial.py:188:0
  %16 : Float(3, 4, strides=[4, 1], requires_grad=1, device=cpu) = aten::tanh(%15) # /var/lib/jenkins/workspace/beginner_source/Intro_to_TorchScript_tutorial.py:188:0
  %17 : (Float(3, 4, strides=[4, 1], requires_grad=1, device=cpu), Float(3, 4, strides=[4, 1], requires_grad=1, device=cpu)) = pr
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可变性卷积可以通过使用FX来转换为TorchScript。FX是一个用于Python到Python的转换的平台,而TorchScript则更专注于将PyTorch程序移出Python环境进行部署。这两者是正交的,可以互相组合使用。首先,我们可以使用FX对可变性卷积进行转换,然后将其导出为TorchScript以进行部署。具体步骤如下: 1. 首先,我们需要定义一个函数或类来对可变性卷积进行转换。可以使用torch.fx模块来进行转换。例如,我们可以定义一个名为transform的函数,该函数接受一个nn.Module对象作为输入,并返回一个经过修改的图形表示。 2. 在转换函数中,我们可以使用torch.fx.Tracer类来追踪可变性卷积模型的图形表示。这将生成一个torch.fx.Graph对象,表示模型的计算图。 3. 接下来,我们可以对生成的图形进行修改,以实现对可变性卷积的转换。具体的修改操作可以根据需求进行定义。 4. 最后,我们可以使用torch.fx.GraphModule类来构建一个新的模块,该模块包含转换后的图形表示。这样,我们就可以将其导出为TorchScript以进行部署。 总结起来,可变性卷积可以通过使用FX进行转换,并将其导出为TorchScript以进行部署。这样,我们可以在保持模型的可变性的同时,实现高效的部署。 #### 引用[.reference_title] - *1* *2* *3* [实践torch.fx第一篇——基于Pytorch的模型优化量化神器](https://blog.csdn.net/IAMoldpan/article/details/124903484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值