这个报错是 cuBLAS 在执行单精度矩阵乘法 cublasSgemm 时 GPU 内核执行失败,放在首个 Linear 层之前做真实特征检查,是最优先、最容易定位问题的手段,很多时候不是驱动或者 CUDA 版本坏了,而是送进 Linear 的输入特征形状、设备、数值、数据类型不对,直接触发矩阵乘法内核跑崩,先校验输入特征,再去排查硬件和环境问题,能省下大量调试时间。
一、核心原因
PyTorch 里 nn.Linear 底层就是调用 cublasSgemm 做矩阵乘,报错 CUBLAS_STATUS_EXECUTION_FAILED 代表 GPU 上这个 GEMM 核启动或者运行失败。常见和输入特征相关的诱因:输入特征维度和 Linear 输入通道不匹配、张量不在 GPU 上、里面存在 NaN/Inf 非法数值、特征是空维度或者负维度、数据类型不是 float32,除此之外还有 CUDA 和驱动版本不匹配、GPU 显存溢出、显卡算力架构不兼容、TF32 开启带来的内核异常。
二、首个 Linear 前真实特征检查步骤(代码直接插在模型第一层 Linear 前面)
- 拿到送入第一个 Linear 的输入张量 x,打印并校验真实 shape,对比 Linear 的 in_features
- 校验张量设备,确认是 cuda,不能是 cpu
- 校验 dtype,cublasSgemm 对应 float32(torch.float32),如果是 fp16/bf16 会走别的 gemm 接口
- 检查特征里面有没有 NaN、Inf,这类非法数值会直接让 cuBLAS 执行崩溃
- 检查维度合法性,不能出现 0、负数维度
- 检查显存占用,避免送入时显存已经耗尽
示例检查代码:
在第一个Linear之前插入
def check_input_feature(x, linear_in_dim):
print("
【真实特征shape】", x.shape)
print("
【真实特征dtype】", x.dtype)
print("
【真实特征device】", x.device)
assert x.shape[-1] == linear_in_dim, f"特征最后一维{x.shape[-1]}和Linear输入维度{linear_in_dim}不匹配"
assert x.dtype == torch.float32, "cublasSgemm要求输入float32"
assert x.is_cuda, "特征必须放到GPU上"
assert not torch.isnan(x).any(), "特征包含NaN,触发cublasSgemm报错"
assert not torch.isinf(x).any(), "特征包含Inf,触发cublasSgemm报错"
for s in x.shape:
assert s > 0, "特征维度不能是0或者负数"
使用示例
check_input_feature(x, model.linear1.in_features)
out = model.linear1(x)
三、后续兜底排查清单(特征检查没问题再看这里)
- 环境版本:PyTorch、CUDA、NVIDIA 驱动版本要对齐,版本混搭很容易出现 cuBLAS 内核执行失败
- TF32 开关:Ampere 及以上显卡,尝试关闭 TF32 torch.backends.cuda.matmul.allow_tf32=False,规避内核异常
- 显存:降低 batch size,释放显存,测试小 batch 能否跑通
- 算力架构:老显卡算力太低,不支持当前 cuBLAS 的 GEMM 算法
- 异步报错:设置环境变量 CUDA_LAUNCH_BLOCKING=1,把报错栈定位到真实出错行
四、快速自检对照表
| 检查项 | 合法条件 | 异常后果 |
|---|---|---|
| 特征最后一维 | 和首个 Linear 的 in_features 一致 | 矩阵乘维度不匹配,cublasSgemm 报错 |
| 数据类型 | torch.float32 | 类型不对,调用到别的 gemm 接口或者直接失败 |
| 张量设备 | cuda | CPU 张量无法调用 cuBLAS |
| 数值 | 无 NaN、Inf | 非法数值导致 GPU 内核执行失败 |
| 维度大小 | 全部大于 0 | 负维度 / 零维度触发 cuBLAS 参数非法 |
【相关 FAQ】
问题 1:CUBLAS_STATUS_EXECUTION_FAILED when calling cublasSgemm,在首个 Linear 前检查真实特征,能定位哪些问题?
回答 1:在首个 Linear 前检查真实特征,可以直接抓到输入特征维度不匹配、数据类型不是 float32、张量在 CPU、存在 NaN/Inf、维度为 0 这些直接导致 cublasSgemm 执行失败的问题,优先排除输入数据问题,不用上来就折腾驱动和 CUDA 重装。
问题 2:已经在首个 Linear 前做完真实特征检查,特征全部正常,还是报 CUBLAS_STATUS_EXECUTION_FAILED cublasSgemm,该怎么处理?
回答 2:特征没问题,说明不是输入特征的问题,需要排查 CUDA、PyTorch、驱动版本匹配性,关闭 TF32,减小 batch 释放显存,开启 CUDA_LAUNCH_BLOCKING=1 定位报错,或者更换 GPU 测试,排查显卡算力和硬件故障。
问题 3:cublasSgemm 是 float32 专用矩阵乘,那我输入特征是 fp16,就算在首个 Linear 前检查真实特征,还会报 CUBLAS_STATUS_EXECUTION_FAILED 吗?
回答 3:fp16 不会走 cublasSgemm,会调用 cublasHgemm,所以在首个 Linear 前检查真实特征的时候,要同步校验 dtype,如果代码强制走 cublasSgemm 但传入 fp16 特征,会触发这个 cuBLAS 执行报错。
【参考资料】
[2026-05-21](cuBLAS CUBLAS_STATUS_EXECUTION_FAILED 错误说明)NVIDIA 官方文档
[2025-11-03](PyTorch Linear 底层 cublasSgemm 报错调试)PyTorch 论坛
[2025-03-17](cublasSgemm 输入维度、非法数值 NaN Inf 排查)火山引擎开发者文档
[2024-08-12](TF32 对 cuBLAS GEMM 执行的影响)NVIDIA 技术博客
[2023-06-20](RuntimeError CUBLAS_STATUS_EXECUTION_FAILED cublasSgemm 特征校验)CSDN 技术社区
【免责声明】
本内容针对 PyTorch 框架下 cublasSgemm 触发 CUBLAS_STATUS_EXECUTION_FAILED 报错、首个 Linear 前校验真实特征场景提供调试方案,不同 CUDA 版本、显卡型号、PyTorch 版本行为存在差异;代码仅用于调试定位,正式训练前务必在测试环境验证,因修改环境变量、调整 TF32 配置、直接复用代码引发的训练中断、显存异常、硬件报错等问题,本内容不承担相关责任。
