PyTorch处理EMNIST数据时触发CUDA device-side assert错误如何解决
问题原因及解决方案
你遇到的RuntimeError: CUDA error: device-side assert triggered是PyTorch使用GPU训练时的常见错误,本质是CUDA内核执行时触发了边界断言,错误发生后会破坏当前CUDA上下文,因此后续所有CUDA操作都会失效,和显存剩余空间无关。结合你提供的代码和使用的EMNIST-letters数据集,核心问题和修复方案如下:
核心触发原因
EMNIST-letters数据集的原始标签范围是1~26,而你的CNN模型最后一层全连接输出维度是26,对应分类数为26。如果使用CrossEntropyLoss作为损失函数,PyTorch要求输入的标签范围必须是0~(分类数-1)也就是0~25,标签值26超出了合法范围,触发了CUDA侧的数组越界断言。
修复步骤
- 首先在CPU环境下复现验证:将模型和数据都移动到CPU运行,此时会输出更明确的错误提示(如
IndexError: Target 26 is out of bounds.),确认是标签越界问题 - 加载EMNIST数据集时添加标签转换,将标签偏移到合法范围:
EMNIST_test = torchvision.datasets.EMNIST( root="./data", split="letters", train=False, download=True, target_transform=lambda y: y - 1 # 标签从1~26转为0~25 ) - 确认输入数据和模型在同一设备:读取batch后需要将图像、标签都移动到模型所在设备,示例代码:
for img, label in batch_generator: img = img.to(model.device) label = label.to(model.device) pred = model(img) # 后续损失计算等逻辑 - 错误发生后不需要更换Colab实例,只要在菜单栏选择「运行时」-「重新启动运行时」即可重置CUDA上下文,修正代码后重新运行即可。
内容的提问来源于stack exchange,提问作者fiendfire28
相关产品推荐
相关产品推荐

