RuntimeError: Trying to backward through the graph a second time but the buffers have already been f

2024-03-06 20:38

本文主要是介绍RuntimeError: Trying to backward through the graph a second time but the buffers have already been f,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed

遇到过几次这个报错了,这几天把backward和autograd给看了几遍,终于摸着点门道

首先要知道,为什么会报这个错,这个错翻译成白话文就是说:当我们第二次backward的时候,计算图的结构已经被破坏了(buffer的梯度被释放了),这也是pytorch动态图的机制,可以节省内存。

这里不仔细讲解backward是怎么工作的了,一般我们在训练的时候常用的就是loss.backward()这种写法,loss一般是一个标量

在pytorch的计算图中,其实只有两种元素:tensor和function,function就是加减乘除、开方、幂指对、三角函数等可求导运算,而tensor可细分为两类:叶子节点(leaf node)和非叶子节点。使用backward()函数反向传播计算tensor的梯度时,并不计算所有tensor的梯度,而是只计算满足这几个条件的tensor的梯度:1.类型为叶子节点、2.requires_grad=True、3.依赖该tensor的所有tensor的requires_grad=True。

看下面的这段代码

这样执行完以后就会报开头的错

根据这段代码画出计算图,x是叶子节点,y和z都不是叶子节点

当我们进行m.backward()之后,这个红框内的计算图就被破坏了,报错里说 the buffers have already been freed,在这张图上,很明显y不是叶子节点,不属于m.backward()里要计算的tensor,buffer指的就是y的梯度被释放掉了, m.backward()只会计算保留x的梯度

如果不想释放y的梯度怎么办,可以用m.backward(retain_graph=True)

buffer:反向传播中不需要被optimizer更新,区别于parameter

进行n.backward()中,y是参与在计算图内的,但y的梯度已经被free掉了,所以报错

再看下一个例子

这段代码是不会报错的

虽然他们的计算图有相交之处(共享了x),x是叶子节点且requires_grad=True,经过backward后它的梯度是保留的,重要的是buffer(y和z)是不共享的,所以不会相互干扰

 

最后再来说下detach的作用,detach可以把一个非叶子节点变成叶子节点且requires_grad=False

看下图,蓝色箭头代表backward时的流向

 

当我们把z 变成z.detach() ,流向就会变成这样

 

detach可以起到截流的作用

 

总结: 当报错RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed

1.看看是不是自己的loss.backward里用到的参数里有重复用过的buffer

2.如果想把这个buffer作为叶子节点(不考虑之前的梯度)参与计算图,可以用detach的方法

 

参考:https://zhuanlan.zhihu.com/p/85506092 

这篇关于RuntimeError: Trying to backward through the graph a second time but the buffers have already been f的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781280

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

Tomcat启动报错:transport error 202: bind failed: Address already in use

Tomcat启动报错:transport error 202: bind failed: Address already in use 了,上网查找了下面这篇文章。也是一种解决办法。 下文来自:http://blog.csdn.net/sam031503/article/details/7037033 tomcat 启动日志报出以下错误:  ERROR: transport err

A Comprehensive Survey on Graph Neural Networks笔记

一、摘要-Abstract 1、传统的深度学习模型主要处理欧几里得数据(如图像、文本),而图神经网络的出现和发展是为了有效处理和学习非欧几里得域(即图结构数据)的信息。 2、将GNN划分为四类:recurrent GNNs(RecGNN), convolutional GNNs,(GCN), graph autoencoders(GAE), and spatial–temporal GNNs(S

Neighborhood Homophily-based Graph Convolutional Network

#paper/ccfB 推荐指数: #paper/⭐ #pp/图结构学习 流程 重定义同配性指标: N H i k = ∣ N ( i , k , c m a x ) ∣ ∣ N ( i , k ) ∣ with c m a x = arg ⁡ max ⁡ c ∈ [ 1 , C ] ∣ N ( i , k , c ) ∣ NH_i^k=\frac{|\mathcal{N}(i,k,c_{