Pytorch中inplace操作

article/2025/9/23 22:54:47

文章目录

  • 前言
  • Inplace操作概述
  • inplace操作的优缺点
  • 常见的inplace操作
  • 总结
  • 参考链接

前言

之前在写训练代码时,遇到了inplace operation导致的问题,所以就了解了一下pytorch的inplace operation,在此记录一下inplace操作的一些知识。报错信息如下:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation.

Inplace操作概述

稍微了解过python的人应该会知道python的变量名是一个类似索引的东西,其指向内存中的一个对象。而对该变量重新赋值,实际上是将该变量名指向内存中的其它对象,原对象本身其实并未改变。而Inplace操作并非如此,该操作会直接改变原对象的内容,这样能减少内存的消耗,但也会带来一些隐患。

非inplace操作如下图所示,运算操作先是开辟了一块新的内存存放运算后的结果,然后再将引用指向新内存,而旧内存的内容保持不变。

而inplace操作则不同,运算操作会直接在旧内存上进行更改,而并不会另外开辟一个新内存进行运算结果的存放。

inplace操作的优缺点

要使用好inplace操作,首先肯定需要知道其存在的优点以及缺点。根据inplace操作的原理,其实不难发现其优点就在于节省内存,尤其是在处理高维数据时能显著减少额外的内存开销,这在训练神经网络时是很有价值的一个特性。但在节省内存的同时,inplace操作也带来了一些隐患,pytorch的官方文档是这样说的:

  1. inplace操作可能会覆盖计算梯度所需的值。

  2. 每个inplace操作实际上都需要实现重写计算图。Out-of-place版本只是简单地分配新对象并保持对旧图的引用,而inplace操作则要求将所有输入的创建者更改为表示该操作的函数。

也就是说,在Autograd中支持inplace操作很困难,有时候会在不经意间导致自动求导失败,得到上文所提到的报错。同时,Autograd积极的缓冲区释放和重用使其非常高效,inplace操作实际上并不能降低太多内存的消耗,因此在大多数情况下不鼓励使用。除非在沉重的内存压力下运行,否则可能永远不需要使用inplace操作。

PS:如果你使用了inplace操作而没有报错的话,那么你可以确定你的梯度计算是正确的。但是,这仅仅表示Autograd计算梯度无误,如果出现了该内存被其他变量引用而未注意,依旧可能存在计算一致性的风险。

常见的inplace操作

inplace操作有优点也有缺点,但总体来说还是弊大于利,所以如果显存足够的话,还是尽量少用inplace操作。那inplace操作有哪些呢?

  1. 数值运算,如x+=1属于inplace操作,会直接对x的值进行操作;而y=x+5则不属于inplace操作(PS:x+=1虽然是inplace操作,但求导时其导数为1,导数值并不与x的值相关,所以不会对反向传播产生影响,故这种情况的影响不大)

  2. pytorch提供的一些inplace选项,如nn.ReLU(inplace=True)nn.LeakyReLU(inplace=True),这些选项的安全性要高一些,但也需要注意中间变量后续是否需要,如果后面还需要使用中间变量,就应当设置inplace=False

  3. 具有 _ 后缀的方法,如x.copy_(y)x.t_(),将直接改变x。同时,一些常见的操作如x.add_(y)x.mul_(y)也会直接改变x,除非有特定需求,否则不建议使用这类inplace操作,隐患比前两种情况高很多。

以上是常见的一些inplace操作,虽然不建议使用inplace操作,但还是需要了解一下,以免日后遇到问题。

总结

inplace操作会直接修改原内存处的值,虽然会节省一些内存,但也会带来一些隐患,如自动求导出错等。因此如果不是内存十分紧缺,不建议使用inplace操作。

参考链接

  • PyTorch中的In-place操作是什么?为什么要避免使用这种操作?_ronghuaiyang的博客-CSDN博客

  • pytorch中的ReLU与inplace原地操作的一些注意点 - 知乎 (zhihu.com)

  • PyTorch的inplace的理解_Raywit的博客-CSDN博客_inplace pytorch

  • PyTorch中In-palce(就地操作) - 知乎 (zhihu.com)

  • 关于pytorch中inplace运算需要注意的问题 - 那抹阳光1994 - 博客园 (cnblogs.com)


http://chatgpt.dhexx.cn/article/J2GlDdMf.shtml

相关文章

PyTorch的inplace的理解

inplace的理解 我们平时看到的 nn.ReLU(inplaceTrue)、nn.LeakyReLU(inplaceTrue),这些语句中的inplace是什么意思? inplaceTrue指的是进行原地操作,选择进行原地覆盖运算。 比如 x1则是对原值x进行操作,然后将得到的结果又直接覆…

mysql如何改连接端口号_MYSQL修改端口号

系统:Windows Server 2016 MYSQL版本:5.7.20 1、打开MYSQL根目录查看是否存在my.ini,若不存在,创建一个my.ini文件 复制下面的code到my.ini中 [client] port2512 default-character-setutf8 [mysqld] # 设置为自己MYSQL的安装目录…

Linux如何查询mysql的端口号

Linux如何查询mysql的端口号 如何查询mysql的端口号(使用root): netstat -anp|grep mysql netstat -anp|grep mysql

MAC:查看和更改Mysql端口号(保姆级解决方案)

MAC:查看和更改Mysql端口号 第零步: 进入终端,使用sudo su命令,并输入用户密码开启root高权限 sudo su第一步: 终端输入命令如下,输入密码后进入mysql mysql -u root -p第二步: 输入命令(…

查看 mysql端口 和进程_mysql 端口号(怎么查看mysql的端口号)

mysql 端口号(怎么查看mysql的端口号) 2020-05-07 21:54:58 共10个回答 如何查看mysql的端口号 --输入以下命令:SHOWVARIABLESWHEREVARIABLE_NAMEport就可以查看当前连接的端口号,--例如:mysql>SHOWVARIABLESWHEREVARIABLE_NAMEport; mysql的默认端口号是多少 mysql默认端口…

mysql有多少个端口号_mysql默认端口号(mysql端口号是多少)

mysql默认端口号(mysql端口号是多少) 2020-05-07 22:14:36 共10个回答 mysql的默认端口号是多少 mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf mysql使用的默认端口号是哪个端口 mysql的默认端口是3306,可以编辑用户目录下的.my.cnf文件进行修改.sqlserver默…

linux mysql修改端口号

1.登陆MySQL数据库 mysql -u root -p 2.输入show global variables like port;查看当前端口号 mysql> show global variables like port; Ps:port后面的值就是当前端口号 3.修改mysql配置文件,一般是在/etc/my.cnf,早期版本有可能是my.conf文件…

宝塔面板修改mysql端口号

为了站点安全起见,常用端口都建议修改,那么宝塔面板的Mysql端口需要怎么修改呢? 1、 找到软件商店-运行环境-Mysql-的设置菜单 2、打开后选择端口选项,将默认的3306改为自定义端口。 3、改完端口后记得在安全菜单中放行修改后的…

mysql有多少个端口号_查看mysql端口号(mysql端口号是多少)

查看mysql端口号(mysql端口号是多少) 2020-05-07 22:11:45 共10个回答 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注…

【修改MySQL端口号(没有my.ini文件)详细图解】

修改MySQL端口号(没有my.ini文件) 前置方案安装服务方案 前置方案 PS:修改MySQL端口号,网上大部分都是修改my.ini文件 有my.ini文件的参考地址 安装服务方案 对于没有my.ini文件使用如下步骤: 1,已安装M…

Docker部署项目更改Mysql端口号

问题情景: 师弟在阿里云服务器上通过Tomcat部署java Web项目 程序端口8080 mysql端口3306 我通过Dokcer部署了前后端分离项目,为了避免端口冲突,服务器6612:3306映射端口。 本以为需要在java后端配置文件中更改url为&#xff1…

linux下查看mysql端口号和修改端口号方法

一、查看端口号 1、登录mysql [rootlocalhost ~]# mysql -uroot -p Enter password: 输入数据库密码; 2、使用show global variables like port; 命令查看端口号, 3307即为当前端口号。 二、修改mysql端口号 1、编辑/etc/my.cnf文件 [rootlocalhost ~]# vi /…

linux下修改mysql端口号

1.登录mysql mysql -u root -p 2.查看当前端口号 show global variables like port; 3.修改端口 vim /etc/my.cnf 4. 增加或修改端口参数,然后保存退出 port3308 5.重启mysql service mysqld restart 6.查看mysql状态 systemctl status mysqld 7.阿里云上安全…

如何修改mysql占用的端口号_修改mysql端口号(mysql的端口号)

修改mysql端口号(mysql的端口号) 2020-05-07 22:12:00 共10个回答 如何查看mysql默认端口号和修改端口号 登录mysql,使用命令showglobalvariableslikeport;查看端口号修改端口在配置文件my.ini,修改后重新启动.[mysqld]port3506 如何修改修改mysql默认端口号3306 在配置文件my.…

虚拟机查看MySQL端口号

先进入MySQL mysql -hhadoop102 -uroot -p 再查看端口号 show variables like ‘port’;

mysql怎么看端口号_mysql端口号(怎么查看mysql的端口号)

mysql端口号(怎么查看mysql的端口号) 2020-05-07 21:54:58 共10个回答 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注…

mysql默认端口号_什么是MySQL默认端口号?

mysql默认端口号 MySQL is very popular database in the opensource community. While developing applications or connecting MySQL database we need to specify the MySQL port implicitly or explicitly. In this tutorial we will learn MySQL default port number and …

任意进制之间的转换(Java使用自带方法)

做国赛的题需要实现数字k进制之间的转换&#xff08;2<k<36&#xff09;上网搜了实现的方法&#xff1a; 博客的地址&#xff1a;就是这里&#xff01; public class BinaryTest {//设置字符数组//可以添加任意不重复字符&#xff0c;提高能转换的进制的上限static char…

java中的进制转换及转换函数

Java的进制转换 进制转换原理 十进制 转 二进制&#xff1a; 原理: 对十进制数进行除 2 运算取余。 6 --> 110 二进制 转 十进制 原理: 二进制 乘以 2 的n次幂 的过程 110 ->0*20 1*21 1 * 22 0 2 46 0 0 1 1 0 1 0 1 128 64 32 16 8 4 2 1 53 当 8个bi…

Java实现任意进制转换拓展进制转换计算器

JAVA实现蓝桥杯基础练习十六进制转换八进制-----------拓展进制转换计算器 这个题目我浏览了大量的道友的文章发现十分麻烦&#xff0c;但仍然从其中收益菲薄&#xff0c;所以在这里分享一下我认为最好的代码 import java.math.BigInteger; import java.util.Scanner;public c…