Skip to content

CUDA device-side assert triggered 错误解析与解决

问题概述

当在 Google Colab 或本地环境中使用 PyTorch 进行 GPU 计算时,可能会遇到 RuntimeError: CUDA error: device-side assert triggered 错误。这个错误信息通常比较隐晦,需要进一步调试才能找到根本原因。

错误现象

尝试在 GPU 上创建张量时出现以下错误:

python
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
t = torch.tensor([1,2], device=device)

错误信息:

bash
RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,
so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1

常见原因与解决方案

1. 索引不匹配(最常见原因)

注意

这是最常见的原因,通常发生在训练神经网络时,标签索引超出了模型输出层的维度范围。

典型场景:

  • 数据集有 15 个类别,但模型输出层只有 10 个神经元
  • 标签值从 1 开始(如 {1,2,3}),但 PyTorch 需要从 0 开始(如 {0,1,2})

解决方案:

python
# 确保标签从 0 开始
labels = labels - labels.min()  # 如果标签从 1 开始,转换为从 0 开始

# 检查标签范围与模型输出维度是否匹配
num_classes = model.fc.out_features  # 假设最后是全连接层
assert labels.max() < num_classes, "标签值超出模型输出范围"

2. Hugging Face Transformers 相关问题

词汇表大小不匹配:

python
# 添加特殊标记后需要调整模型嵌入层大小
tokenizer.add_special_tokens({'pad_token': '<pad>'})
model.resize_token_embeddings(len(tokenizer))

参数值超出范围:

python
# 确保 speaker_id 等参数在有效范围内
if speaker_id >= config.vocoder_num_spkrs:
    speaker_id = 0  # 使用默认值或抛出错误

3. 损失函数相关问题

BCEWithLogitsLoss 缺少 sigmoid 激活:

python
# 错误:忘记在 BCE 损失前添加 sigmoid
# output = model(input)
# loss = criterion(output, target)

# 正确:要么在模型输出中添加 sigmoid,要么使用带 logits 的 BCE
output = torch.sigmoid(model(input))
loss = criterion(output, target)

# 或者直接使用 BCEWithLogitsLoss
criterion = nn.BCEWithLogitsLoss()
output = model(input)  # 不需要 sigmoid
loss = criterion(output, target)

标签中使用了 -100(忽略索引):

python
# 在某些情况下,设置 labels[:, -1] = -100 可能导致此错误
# 检查是否正确处理了忽略索引

调试方法

方法一:切换到 CPU 模式

首选调试方法

在 CPU 上运行会显示更详细的错误信息,帮助定位问题根源。

python
# 强制使用 CPU 进行调试
device = torch.device('cpu')
t = torch.tensor([1,2], device=device)

# 或者暂时注释掉 GPU 相关代码
# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device = torch.device('cpu')

方法二:启用同步 CUDA 错误报告

python
import os
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'  # 启用同步错误报告

# 注意:这会降低性能,仅用于调试
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
t = torch.tensor([1,2], device=device)

方法三:重启运行时

Colab 特定建议

有时 CUDA 错误会导致 GPU 状态异常,需要重启运行时来清除状态。

  1. 在 Colab 中:运行时 → 重新启动运行时
  2. 在本地 Jupyter 中:重启内核
  3. 或者使用命令强制清理:
bash
# 查找并终止相关进程
!nvidia-smi  # 查看 GPU 进程
!kill -9 <PID>  # 终止特定进程

预防措施

  1. 数据预处理检查:确保标签值从 0 开始且不超过类别数
  2. 模型配置验证:检查输入/输出维度是否匹配
  3. 逐步测试:先在 CPU 上测试代码,再切换到 GPU
  4. 版本兼容性:确保 PyTorch、CUDA 和 cuDNN 版本兼容

总结

CUDA error: device-side assert triggered 通常不是表面上的 GPU 问题,而是深度学习代码中的逻辑错误。通过切换到 CPU 模式调试、检查维度匹配和标签范围,大多数情况下都能找到并解决问题。

重要提醒

一旦出现此错误,建议立即重启运行时/内核,因为 CUDA 状态可能已损坏,会影响后续的所有 GPU 操作。