微调GPT-J遇RuntimeError:DequantizeAndLinearBackward视图原地修改报错
解决自定义Function视图原地修改导致的RuntimeError
你的判断完全正确——这个错误确实和原地操作(in-place)修改自定义Function返回的视图有关。不需要修改激活函数的参数,只需要对自定义Function的输出做一个简单的克隆操作就能解决。
问题根源
DequantizeAndLinear.apply()返回的张量是内部F.linear()生成的视图,而PyTorch的autograd系统会跟踪这个视图的反向传播逻辑。当你用output += self.adapter(input)做原地修改时,会覆盖自定义Function关联的反向梯度计算逻辑,框架抛出这个错误是为了避免梯度计算结果出现偏差。
修复方案
在获取自定义Function的输出后,立刻调用.clone()生成独立的张量,之后再进行原地操作:
修改你的FrozenBNBLinear类的forward方法:
def forward(self, input): # 对自定义Function的输出进行克隆,避免后续原地操作破坏视图的反向逻辑 output = DequantizeAndLinear.apply(input, self.weight, self.absmax, self.code, self.bias).clone() if self.adapter: output += self.adapter(input) return output
或者,你也可以在原地操作前单独克隆:
def forward(self, input): output = DequantizeAndLinear.apply(input, self.weight, self.absmax, self.code, self.bias) if self.adapter: # 克隆后再执行原地加法 output = output.clone() output += self.adapter(input) return output
为什么这样有效?
克隆操作会创建一个和原张量内容相同但内存独立的新张量,后续的原地修改只会作用于这个新张量,不会影响原始视图关联的自定义反向传播逻辑,autograd就能正确计算梯度了。
内容的提问来源于stack exchange,提问作者May Ouir
相关产品推荐
相关产品推荐

