PyTorch张量移至GPU报错 运算张量未加载到CUDA原因咨询
问题根因与解决方法
核心错误点
所有异常的根源是对PyTorch张量设备迁移API的用法错误:
PyTorch中张量的.cuda()、.to(device)方法都不是原地操作,执行后会生成一个驻留在目标设备上的新张量,必须用变量接收这个返回值,才算是完成了张量的设备迁移。你写的img1.cuda()执行后,变量img1仍然指向原本存储在CPU内存中的张量,根本没有被转移到GPU显存。
这直接对应你碰到的两个现象:
- 差值运算结果不在CUDA设备上:
img1、img2两个张量自始至终都在CPU上,CPU张量间的算术运算结果必然留在CPU,因此is_cuda返回False。 - 触发
CUDA error: unspecified launch failure报错:后续代码如果混用了未正确迁移的CPU张量和GPU张量,会触发跨设备运算错误;而CUDA核函数的错误默认是异步上报的,错误堆栈会指向后续的API调用点,才会出现报错位置不明确的提示。
正确实现方式
迁移张量到GPU时必须接收方法返回值,更推荐用显式设备定义的写法,兼容不同运行环境:
import torch import torchvision # 显式指定运行设备,自动适配有无CUDA的环境 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") img1 = torchvision.io.read_image(IMAGE1).float().to(device) img2 = torchvision.io.read_image(IMAGE2).float().to(device) # 此时两张量均在GPU上,差值计算在GPU侧完成 img_diff = img2 - img1 print(img_diff.is_cuda) # 输出True
如果调试阶段仍碰到CUDA相关报错,可以在启动脚本前设置环境变量CUDA_LAUNCH_BLOCKING=1,关闭CUDA的异步错误上报机制,就能准确定位到实际触发错误的代码行,避免堆栈错位问题。
内容的提问来源于stack exchange,提问作者John M.
相关产品推荐
相关产品推荐

