You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch报can't optimize a non-leaf Tensor错误咨询

报错原因

错误由链式调用.to(self.device)的写法导致:

  • 代码执行逻辑是先生成CPU上的nn.Parameter对象,再调用.to()方法做设备迁移。当目标设备不是CPU(如CUDA、MPS)时,.to()会返回一个全新的、经过拷贝生成的非叶子张量,这个返回值被赋值给了self.W_ch1,最初创建的真正叶子节点Parameter因为没有被持有引用会被直接回收。
  • 此时self.W_ch1是设备拷贝操作的计算结果,不属于叶子张量,传入优化器做参数注册时就会抛出"can't optimize a non-leaf Tensor"错误。可以通过打印self.W_ch1.is_leaf验证,输出结果必然为False。
修复方法

二选一即可:

  • 方案1:生成随机张量时直接指定目标设备,从根源避免创建后做设备拷贝
self.W_ch1 = nn.Parameter(
    torch.rand(encoder_feature_dim, encoder_feature_dim, device=self.device),
    requires_grad=True
)
self.W_ch1_optimizer = torch.optim.Adam([self.W_ch1], lr=encoder_lr)
  • 方案2:先完成普通张量的设备迁移,再封装为nn.Parameter对象
self.W_ch1 = nn.Parameter(
    torch.rand(encoder_feature_dim, encoder_feature_dim).to(self.device),
    requires_grad=True
)
self.W_ch1_optimizer = torch.optim.Adam([self.W_ch1], lr=encoder_lr)

提示:如果是在nn.Module子类中定义可训练参数,优先选择方案1,能减少不必要的设备拷贝开销,也能避免模型加载、设备切换时出现参数不在同一设备的问题。

内容的提问来源于stack exchange,提问作者Gooby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:18:31