如何让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
相关产品推荐
相关产品推荐

