PyTorc添加网络图结构add_graph报错:RuntimeError: Cannot insert a Tensor that requires grad as a constant.

错误说明

在使用PyTorch自带的TensorBoard的add_graph方法将网络图结构添加到监测信息中时,遇到如下报错:

RuntimeError: Cannot insert a Tensor that requires grad as a constant. Consider making it a parameter or input, or detaching the gradient.

这个信息其实有些tricky:

  • 告诉了是add_graph这一步有问题,但是具体哪个变量是带有不符合要求的属性不得而知
  • 格式是按照api照猫画虎的,怎么会不符合要求呢?

Debug过程

  1. 搜遍全网也没有找到结果,根据一些相关信息(见参考)的蛛丝马迹,首先怀疑是传入模型的Tensor的requires_grad设置问题,debug后发现其值为False(也应该是False,因为是从原始文件读入的数据)。

  2. 接下来,怀疑是模型output的Tensor的requires_grad的问题,但是没想到如何简便地更改add_graph中的模型输出Tensor的属性,因为这一步是在add_graph源码中的,当然也可以更改源码中的model(input_to_model)这里,使其所有输出的属性符合要求,但是这有点不elegant。

  3. 接下来从参考链接2中获得了一些启发,想到我使用的是多GPU训练,会不会是Dataparallel的问题呢?接下来又想到之前在知乎(链接3)看到关于读写Dataparallel的一些技巧,马上“灵光一闪”。先尝试了将add_graph放到模型并行化之前,果然没有报错,基本确定是Dataparallel的问题。

  4. 然后根据参考链接2和3,想到把模型先从并行化容器中取出来,再执行,果然问题完美解决。相关代码如下

 # setup the summary writer
train_data_sample, label_sample = iter(dataloader_train).next()
writer = SummaryWriter(args.summary_path, flush_secs=120)

with writer:
    writer.add_graph(model.module,train_data_sample.to(device))  # model graph, with input

重点就在model.module,这句话讲模型从并行化后的容器中取出来,以未并行化的模型(原始模型)返回,这样再执行就没有问题了。

参考

  1. https://github.com/pytorch/pytorch/issues/20101
  2. https://discuss.pytorch.org/t/how-to-reach-model-attributes-wrapped-by-nn-dataparallel/1373/4
  3. https://www.zhihu.com/question/67726969
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江前云后

文章结束的标识:打赏链接

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值