tensor加法存在的问题

[[pytorch:张量(tenser)]]

问题阐述

python的实现逻辑和内存回收机制挺奇怪的。实际上,当使用tensor类型的时候,其更像是存储了一个指针:

  • 创建变量的时候,先申请分配内存,然后再将变量指向其存储tensor的位置
  • 计算的时候,实际上是不是将其对应的值赋予过去,而是将位置赋予过去。

这就导致了一个问题:

1
2
3
before = id(x)
x = x + y
before == id(x)

输出:false

实际上,计算x+y的时候,系统先申请了一个内存空间,然后将计算结果放在这个空间内,最后将 x存储的位置改为这个内存空间的地址……

所有的变量都是存储在内存中的,如果x释放出来的内存没有被及时释放,这样就会带来很大的内存占用冗余,而这在本就对内存占用需求比较大的深度学习来说是致命的。

解决办法

所以说可以换一种写法,就可以使得其代码效率优化:

1
z[:] = x + y

这样的话,相当于将值进行了复写,而不是重复申请更换空间。而x+y产生的临时内存占用将会被赋值完之后被释放。

如果说,我们知道后面x中存储的数据不再会被使用了,也可以使用下面的写法:

1
x += y