PyTorch 中的“inplace=True”激活仅对推理模式有意义吗?
Is it true that `inplace=True` activations in PyTorch make sense only for inference mode?
根据 PyTorch
论坛上的讨论:
- What’s the difference between nn.ReLU() and nn.ReLU(inplace=True)?
- Guidelines for when and why one should set inplace = True?
inplace=True
的目的是修改输入到位,而不用为这个操作的结果分配额外的张量内存。
这可以提高内存使用效率,但禁止进行反向传递,至少在操作减少信息量的情况下。并且反向传播算法需要保存中间激活以更新权重。
可以说,只有当模型已经训练好并且不想再修改它时,才应该分层打开这种模式吗?
nn.ReLU(inplace=True)
在 training 和 testing.
期间节省内存
然而,在计算梯度时使用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!
根据 PyTorch
论坛上的讨论:
- What’s the difference between nn.ReLU() and nn.ReLU(inplace=True)?
- Guidelines for when and why one should set inplace = True?
inplace=True
的目的是修改输入到位,而不用为这个操作的结果分配额外的张量内存。
这可以提高内存使用效率,但禁止进行反向传递,至少在操作减少信息量的情况下。并且反向传播算法需要保存中间激活以更新权重。
可以说,只有当模型已经训练好并且不想再修改它时,才应该分层打开这种模式吗?
nn.ReLU(inplace=True)
在 training 和 testing.
然而,在计算梯度时使用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!