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

如何让PyTorch全局默认使用CUDA?GPU调用异常问题求助

PyTorch全局默认使用CUDA的解决方案及.to(device)用法验证

一、.to(device)用法验证

你的.to(device)用法是完全正确的。执行torch.rand(10).to(device)后,张量已经被迁移到指定的CUDA设备上,可以通过以下代码验证:

x = torch.rand(10).to(device)
print(x.device)  # 输出应为 cuda:0

如果输出是cuda:0,说明迁移成功,之前误以为没使用GPU可能是没检查张量的设备属性。

二、为什么torch.cuda.set_device没生效

torch.cuda.set_device(device)的作用是设置默认的CUDA设备(多GPU场景下切换),而非让所有张量默认创建在CUDA上。它仅影响显式指定device='cuda'时的设备选择,不会改变张量默认创建在CPU的行为。

三、全局默认使用CUDA的实现方案

PyTorch官方没有提供全局默认设备的开关,但可以通过包装张量创建函数来实现近似效果:

方案1:包装常用张量创建函数

通过装饰器重新定义PyTorch的张量创建函数,让它们默认使用CUDA设备:

import torch

# 定义全局默认设备
_default_device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 装饰器:为函数添加默认device参数
def set_default_device(func):
    def wrapper(*args, **kwargs):
        # 如果用户没指定device,就用全局默认设备
        kwargs.setdefault("device", _default_device)
        return func(*args, **kwargs)
    return wrapper

# 替换PyTorch中的常用张量创建函数
torch.rand = set_default_device(torch.rand)
torch.randn = set_default_device(torch.randn)
torch.zeros = set_default_device(torch.zeros)
torch.ones = set_default_device(torch.ones)
torch.empty = set_default_device(torch.empty)
# 根据需要添加其他函数,比如torch.full等

之后直接创建张量就会默认在CUDA上:

x = torch.rand(10)
print(x.device)  # 输出 cuda:0

方案2:局部上下文管理器(适合代码块场景)

如果只需要在某段代码中默认使用CUDA,可以使用torch.cuda.device上下文管理器:

from torch.cuda import device

with device("cuda:0"):
    x = torch.rand(10)  # 此张量默认在cuda:0上
    y = torch.zeros(5)  # 此张量也默认在cuda:0上

这个方法仅在上下文块内生效,不会影响全局。

注意事项

  • 对于从NumPy数组转换的张量(torch.from_numpy()),由于NumPy数组本身存储在CPU,转换后的张量默认仍在CPU,需要手动调用.to(_default_device),或者使用torch.tensor(arr, device=_default_device)替代。
  • 第三方库或自定义函数返回的张量可能仍会默认在CPU,这种情况还是需要手动迁移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:48:11