clone()/copy()/detach()
clone()函数是新开辟一个内存给数据,但是仍然在计算图上;detach()是有一个不计算梯度的副本,不在计算图上,但是和原数据指向的是同一内存空间。因此,想要获取一个完全与原有数据独立的数据可以使用b=a.clone().detach()
a是GPU上的模型输出的tensor,用clone()将它拷贝到CPU上,然后再把拷贝的结果存储在一个OrderedDict()中,
原来的gpu上的tensor占用的显存并没有随着循环结束被释放,造成显存out of memory
原因是clone()的时候关联了求导关系,因此无法释放原来变量的内存
解决方法:
b=a.data 或者 b=a.detach()(推荐)
这两种赋值方式将a的tensor赋值给b,不会有链式求导联系。