PyTorch 中的“inplace=True”激活仅对推理模式有意义吗?

Is it true that `inplace=True` activations in PyTorch make sense only for inference mode?

根据 PyTorch 论坛上的讨论:

inplace=True的目的是修改输入到位,而不用为这个操作的结果分配额外的张量内存。

这可以提高内存使用效率,但禁止进行反向传递,至少在操作减少信息量的情况下。并且反向传播算法需要保存中间激活以更新权重。

可以说,只有当模型已经训练好并且不想再修改它时,才应该分层打开这种模式吗?

nn.ReLU(inplace=True)trainingtesting.

期间节省内存

然而,在计算梯度时使用nn.ReLU(iplace=True)可能会遇到一些问题。 有时,计算梯度时需要原始值。因为inplace破坏了一些原有的值,所以有些用法可能会有问题:

def forward(self, x):
    skip = x
    x = self.relu(x)
    x += skip # inplace addition
    # Error!

以上两个连续的inplace操作会报错

不过用first加法就好了,then激活函数用inplace=True:

def forward(self, x):
    skip = x
    x += skip # inplace addition
    x = self.relu(x)
    # No error!