《Deep-Learning-with-PyTorch》学习笔记Chapter15 Deployment(四)

(自学《Deep-Learning-with-PyTorch》使用,仅供参考)

Interacting with the PyTorch JIT

What to expect from moving beyond classic Python/PyTorch

Python的运行比起C和C++等语言会稍慢一些,但是我们在Pytorch中使用的张量操作本身足够大,因此Python的慢速问题几乎可以忽略不计。

从经典的Pytorch方法(先执行一个操作,然后再查看下一个操作)转变一下,Pytorch可以看到整个计算过程,也就是Pytorch可以整体考虑计算过程。

当Pytorch在GPU上运行一系列操作的时候,它为每一个操作调用一个子程序(用CUDA的说法就是内核),每个内核从GPU内存读取输入,计算结果,然后存储结果。所以,大多时间都用在了从内存中读取和写入数据的过程中。改进方法就是:我们通过只读一次,计算几个操作,最后再写进。而这正是PyTorch JIT fuser所做的。

使用JIT模型加速不是特别的多,但它有一个很重要好处就是——避免GIL。

【The dual nature of PyTorch as interface and backend】

Pytorch中的torch.nn模块是我们建模的重要工具,它持有我们的网络参数,并利用函数接口实现函数接受和返回张量的功能。

同时,TorchScript模块中函数接口——Pytorch JIT,能够实现加载、检查、执行模型的功能。

【TorchScript】

TorchScript是Pytorch部署选项的核心。

有两种方式可以直接创建一个TorchScript模型:跟踪和脚本。

【跟踪】:

由于JIT只有在调用Pytorch函数(或者使用nn.Moduels)时才起作用,所以我们在跟踪的过程中,可以运行任何Python的代码,但JIT不会注意到这些。

“看着我怎么做的——你可以这么做了”

【脚本】:

JIT可以捕获程序的每个方面,但JIT只会运行解释器能够理解的部分

“我告诉你怎么做——你可以这么做了”

TorchScript是静态类型——程序中每个变量都有且只有一个类型。

在程序中,JIT通常会自动推断类型,但是我们需要用脚本函数的类型来注释任何非张量参数。

为了跟踪和编写脚本,我们可以将Module的实例传递给torch.jit.trace或者torch.jit.script,如果我们想公开从外部调用的其他方法(只有编写脚本可以做到),我们可以在类定义中使用装饰器@torch.jit.export

【总结】

通过使用JIT模式,我们可以避免GIL。

跟踪是得到JIT最简单的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值