如何在 PyTorch 中执行就地操作?

就地操作直接更改张量的内容,而无需复制它。由于它不创建输入的副本,因此在处理高维数据时减少了内存使用。就地操作有助于使用更少的 GPU 内存。

在PyTorch,就地操作总是后固定带“_”,如add_(),mul_()等

步骤

要执行就地操作,可以按照以下步骤操作 -

  • 导入所需的库。所需的库是torch。

  • 定义/创建要执行就地操作的张量。

  • 执行正常原位操作以查看它们之间的明显区别。

  • 显示在正常和就地操作中获得的张量。

示例 1

以下 Python 程序突出显示了正常添加和就地添加之间的区别。在原地加法中,第一个操作数“x”的值被改变;而在正常加法中,它保持不变。

# import required library
import torch

# create two tensors x and y
x = torch.tensor(4)
y = torch.tensor(3)
print("x=", x.item())
print("y=", y.item())

# Normal addition
z = x.add(y)
print("正常加法 x:",x.item())

# In-place addition
z = x.add_(y)
print("In-place Addition x:",x.item())
输出结果
x = 4
y = 3
正常加法 x: 4
In-place Addition x: 7

在上面的程序中,添加了两个张量 x 和 y。在正常的加法操作中,x 的值不会改变,但在就地加法操作中,它的值发生了变化。

示例 2

下面的 Python 程序展示了普通加法和就地加法操作在内存分配方面的不同之处。

# import required library
import torch

# create two tensors x and y
x = torch.tensor(4)
y = torch.tensor(3)
print("id(x)=", id(x))

# Normal addition
z = x.add(y)
print("Normal Addition id(z):",id(z))

# In-place addition
z = x.add_(y)
print("In-place Addition id(z):",id(z))
输出结果
id(x)= 63366656
Normal Addition id(z): 63366080
In-place Addition id(z): 63366656

在上面的程序中,正常操作为“z”分配新的内存位置,而就地操作不分配新的内存。