pytorch快速上手之二_排除计算图

GPU确实快,但是显存太小不够跑别人的代码时,可以把一些操作简化。如:原模型中使用了预训练模型Bert,且对Bert微调,如果实在跑不动,可以改为不微调Bert,先跑起来再说。

一 with torch.no_grad()

https://www.jianshu.com/p/1cea017f5d11
https://blog.csdn.net/weixin_43178406/article/details/89517008

作用:节省内存
关键概念:grad_require requires_grad、grad_fn
说明:
  1. 什么样的tensor可以调用backward()方法【即可以主动求导】?
    grad_fn 不为None的tensor
  2. 什么样的tensor存在grad属性【即被求导】?
    grad_require 为 True的tensor
  3. 什么样的tensor的grad_fn不为None?
    计算该tensor的表达式中,存在参数的grad_require不为false
注意:
  1. tensor的grad_require默认为false;grad_require为true时,tensor的grad属性保存上次被求导时的导数值;【占内存】
  2. grad_fn不为None的tensor叫做叶子变量;
  3. tensor的grad_require为True,则所有依赖于该tensor的tensor,其grad_require也将为True,且grad_fn不为None;
  4. 某tensor由其他tensor计算得来,若这些tensor的grad_require均为false,那么这个tensor的grad_require也将为false,而且其grad_fn为None,即该tensor还只是一个叶子变量;
  5. 基于上述各点,如果某个tensor依赖的其他tensor中,有的的grad_require为true,但是这个当前这个tensor又确实不需要被求导,那么怎么把它的grad_fn设为None、grad_require设为false来节省内存?with torch.no_grad()就起强制设置的作用

二 附带一提:model.zero_grad()

两者虽然没什么关系,但是乍一看上去给人感觉有联系

https://blog.csdn.net/Fhujinwu/article/details/108567324
https://blog.csdn.net/comli_cn/article/details/104664494/
https://blog.csdn.net/VictoriaW/article/details/73930204

作用:清空变量上的梯度
关键概念:torch.grad
说明:
  1. 我们上面总提到梯度或者说导数,现在问一个问题:A对B求导数,如果保存导数,导数值存放在哪?pytorch中,将导数值存放在被求导数的tensor中,也就是自变量中。
  2. 这样有个问题:如果一段程序中,A和C先后对B求导数,B中保存的是哪一步的导数?pytorch中,B会将两步的导数求和后保存。
  3. 如何只保存最后被求导时的导数值?清空上一步保存的导数值即可,也就是zero_grad()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值