You need to enable JavaScript to run this app. PyTorch处理EMNIST数据时触发CUDA device-side assert错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:36:03