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

PyTorch中优化GPU上的张量报非叶张量错误如何解决

问题根因

你触发报错的核心原因是:对requires_grad=True的CPU张量调用.to("cuda")方法时,返回的GPU张量属于计算图的中间节点(非叶子节点),PyTorch的优化器仅支持优化叶子张量。
你之前用.detach().cpu()的方案相当于切断了梯度传播链路,自然没法更新shape的数值。

正确解决方案

你只需要在初始化shape张量的时候直接在GPU上创建,或者迁移后手动设置requires_grad属性即可,具体操作如下:

  • 方案1:初始化shape张量时直接指定设备为cuda
    如果你是随机初始化或者从其他数据加载得到shape,直接在创建时指定device参数:
    # 示例,根据你实际的shape初始化逻辑调整
    shape = torch.randn(your_shape_size, device="cuda", requires_grad=True)
    
  • 方案2:迁移到GPU后重新开启梯度
    如果你必须先在CPU上创建shape,迁移GPU后手动调用requires_grad_()标记为叶子张量:
    # 先迁移到GPU,再设置可导,此时返回的就是GPU上的叶子张量
    shape = shape.to("cuda").requires_grad_(True)
    
  • 额外注意事项
    模型也同步迁移到GPU,同时真值gt_vertices也要放到同一GPU设备上,避免设备不匹配报错:
    model = model.to("cuda")
    gt_vertices = gt_vertices.to("cuda")
    

之后优化器正常传入这个处理后的shape张量即可,不需要加detach相关操作,梯度就能正常回传更新shape的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:48:00