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

PyTorch张量创建问题:如何直接在GPU/指定设备创建张量?new()方法弃用后的替代方案

嘿,很高兴能帮你解决这些PyTorch张量创建的问题!让我一步步给你讲清楚:

问题1:直接在GPU上创建张量,或在另一个张量所在设备创建张量
  • 直接在GPU上创建张量:
    你可以在创建张量时通过device参数直接指定GPU设备,比如:

    # 创建一个在默认CUDA设备上的张量
    gpu_tensor = torch.tensor([1, 2, 3], device="cuda")
    # 或者指定具体的CUDA设备编号
    gpu_tensor = torch.tensor([1, 2, 3], device="cuda:0")
    

    也可以用torch.cuda系列的张量构造器(比如torch.cuda.FloatTensor([1,2,3])),但更推荐前者,因为它更灵活,能兼容CPU/GPU切换。

  • 在另一个张量的设备上创建新张量:
    直接复用目标张量的device属性即可,不用手动判断设备类型。比如你有一个张量std,要在它的设备上创建新张量:

    new_tensor = torch.tensor([4, 5, 6], device=std.device)
    

    这样不管std在CPU还是GPU,新张量都会自动在同一个设备上。

问题2:替代已弃用的new()方法,简化设备判断代码

你提到的new()方法确实在PyTorch的新版本中被标记为弃用了,现在有更简洁、更符合现代PyTorch风格的方式来替代原来的逻辑:

  • 替代std.new().normal_()的最简写法:
    使用torch.empty_like()方法,它会创建一个和输入张量同形状、同设备、同数据类型的空张量,之后再调用normal_()初始化,一行代码就能替代原来的if-else判断:

    eps = torch.empty_like(std).normal_()
    

    这段代码的效果和你原来的if-else完全一致,但不用再手动判断std是否在CUDA上,PyTorch会自动处理设备匹配。

  • 如果需要自定义形状(非和输入张量同形状):
    可以直接在张量构造器中指定device和dtype为目标张量的属性,比如要创建和std同设备、指定形状的正态分布张量:

    eps = torch.randn(std.size(), device=std.device, dtype=std.dtype)
    

    同样不用写if条件,就能保证新张量和std在同一个设备上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:23:35