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

为何创建张量时设requires_grad=True后移至GPU会丢失叶子节点状态?

为什么requires_grad=True的张量转GPU后会丢失叶子节点状态?

核心原因:.cuda()是可微分运算,会生成新的非叶子张量

PyTorch里**叶子节点(leaf tensor)**的判定规则很明确:

  • 当requires_grad=True时,只有直接创建、未经过任何张量运算生成的张量才是叶子节点,这类张量的grad_fn属性为None。
  • 当requires_grad=False时,所有张量都会被视为叶子节点(因为PyTorch不会追踪它们的梯度,无需区分节点类型)。

拆解你的三个测试案例:

  1. b = torch.rand(10).cuda():torch.rand默认requires_grad=False,不管后续有没有.cuda()运算,is_leaf都会返回True。
  2. b = torch.rand(10, requires_grad=True):直接在CPU上创建需要梯度的张量,无任何运算步骤,grad_fn=None,因此是叶子节点。
  3. b = torch.rand(10, requires_grad=True).cuda():.cuda()是一个可微分的张量运算——它会把CPU张量复制到GPU并生成新张量,这个新张量的grad_fn会被设置为CopyBackwards(记录复制操作用于反向传播),所以它不再是叶子节点(由其他张量运算得到)。

解决办法:直接在GPU上初始化张量

你提到的b = torch.rand(10, requires_grad=True, device='cuda')之所以有效,是因为它跳过了CPU到GPU的复制运算,直接在GPU上创建张量,没有经过任何运算步骤,grad_fn=None,自然保留了叶子节点状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:22:12