CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle):先区分显存不足和已有 CUDA 错误

简介: Colab中`cublasCreate`失败非单纯batch过大所致,需区分环境异常与资源不足:重启运行时、验证CUDA可用性、用小矩阵测试基础算力,并对比`nvidia-smi`与`memory_summary`定位真实瓶颈。(239字)

原帖在 Colab 的 Linear 运算处失败;相同代码以前能跑,batch 从 128 降到 64 仍未解决:

RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`

降低 batch 仍失败,说明还需要做区分检查

原题只有 cuBLAS 创建句柄失败的堆栈,没有标签、网络和显存时间序列,因此不能套用别人的“类别数写错”或“batch 太大”结论。先在干净进程确认最小计算,再恢复同一模型与首批数据,能够把环境问题和训练资源问题分开。

cuBLAS 初始化需要设备资源,但这条错误不能单独证明是 batch 过大。Notebook 残留模型、其他进程占用和此前 CUDA 失败也应区分。

在尚未失败的干净运行时、模型前向之前检查:

import torch
print("josh050608")
print("torch/CUDA:", torch.__version__, torch.version.cuda)
print("available:", torch.cuda.is_available())
if torch.cuda.is_available():
    print(torch.cuda.memory_summary(abbreviated=True))

在 Colab 终端或单独命令单元运行 nvidia-smi,查看设备总占用。PyTorch 的 memory_summary 主要统计本进程分配器,两者应结合看。如果此前发生设备断言,先重启运行时,不能继续用已经出错的上下文判断显存。

若干净进程显存充足,先运行很小的矩阵乘法 torch.ones(2,2,device='cuda') @ torch.ones(2,2,device='cuda')。若连它都失败,继续核对驱动与 torch 构建;若能成功,恢复模型到首个失败层,检查该层输入形状、权重形状和实际峰值。

若确认为显存压力,清理已不用的模型引用,降低 batch/输入大小,推理加 torch.no_grad(),日志只存 loss.item()。empty_cache() 不会释放仍被活跃张量占用的显存,不能代替删除无用引用或缩小计算。

最后在干净会话跑完整一个训练 step,再观察多批次内存是否稳定。只有这一条 cuBLAS 消息,没有足够依据断定是哪一项造成资源分配失败。

在模型加载前后分别记录资源

下列脚本需要可用的 NVIDIA CUDA 环境,可在重启后的独立进程运行。它只创建小矩阵;若这里失败,应保留完整错误,暂不加载大模型:

import torch
if not torch.cuda.is_available():
    raise RuntimeError("当前进程 CUDA 不可用,请先核对驱动和 torch 构建")
device = torch.device("cuda:0")
print("before:", torch.cuda.memory_allocated(device), torch.cuda.memory_reserved(device))
a = torch.ones(2, 2, device=device)
b = a @ a
torch.cuda.synchronize()
assert torch.equal(b.cpu(), torch.full((2, 2), 2.0))
print("after:", torch.cuda.memory_allocated(device), torch.cuda.memory_reserved(device))

然后把同样的统计放在真实模型加载后、前向后、backward 后,观察第一次显著增长的位置。nvidia-smi 显示的是设备层面的占用,可能包含其他进程;PyTorch 统计不能直接等同于整张卡剩余空间。

若每批都增加,检查列表里是否保存了 GPU 输出或带图 loss:用于记录时保存 loss.item(),用于后续 CPU 分析时明确 detach 并迁到 CPU。若是一次性峰值过大,再减小 batch、输入尺寸或按任务采用精度优化;不要为了省内存改变类别数或丢失目标含义。

若此前已有 device-side assert,先重启运行时,继续 empty_cache 无法恢复坏掉的上下文。新进程小矩阵通过、真实首批通过、连续多批峰值稳定,才构成这类问题比较可靠的验证;原题缺少资源记录,文章只能提供分支判断,不能补造唯一根因。

参考:原始求助帖;技术依据:PyTorch CUDA 语义(2.5)、CUDA 内存统计(2.5)、PyTorch CUDA 环境变量(2.5)。

相关文章
|
2天前
|
机器学习/深度学习 并行计算 Linux
CUBLAS_STATUS_EXECUTION_FAILED when calling cublasSgemm:在首个 Linear 前检查真实特征
该帖描述一维信号CNN在GPU上执行fc1层时触发cuBLAS执行失败错误。重点强调:勿凭空猜测展平维度,应通过打印输入/权重形状、dtype、设备及启用`CUDA_LAUNCH_BLOCKING=1`定位真实首错点,再系统排查设备一致性、内存压力或环境兼容性问题。(239字)
|
2天前
|
缓存 Unix PyTorch
OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符
原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
Expected all tensors to be on the same device, cuda:0 and cpu:恢复训练时检查 SGD 动量
该问题源于断点续训时优化器状态(如SGD动量缓冲区)未与模型参数同设备,导致`optimizer.step()`中跨设备张量运算失败。前向/反向可正常执行,但动量更新报错“cuda:0 and cpu”。需检查并统一`param`、`grad`及`optimizer.state`中所有Tensor的设备。
|
2天前
|
并行计算 PyTorch Linux
libtorch_python.so: cannot open shared object file:文件缺失时先修复 torch 安装
该问题核心是 PyTorch 1.0.1.post2 安装不完整,`torch/lib/` 下缺失关键文件 `libtorch_python.so`,非环境变量(LD_LIBRARY_PATH)可解决。需先用 `importlib.util.find_spec` 定位真实安装路径,核对文件存在性;再通过 `pip show -f torch` 验证分发完整性。切勿混用版本或复制库文件。
|
2天前
|
并行计算 PyTorch 异构计算
can’t convert CUDA tensor to numpy:只取分类索引时直接用 torch.argmax
原帖因直接对CUDA张量调用`.data.numpy().argmax()`报错:“无法将CUDA张量转为NumPy”。正确做法是:在GPU上用`output.argmax(dim=1).item()`获取单图预测索引,避免全量拷贝,仅传回标量,高效且安全。(239字)
|
2天前
|
并行计算 IDE PyTorch
No module named "torch":Notebook 能导入,终端脚本却失败时先对齐解释器
该问题本质是Python环境不一致:Notebook与控制台使用了不同解释器,导致torch仅安装在其中一个环境中。关键在于比对`sys.executable`路径,确认实际运行环境,并在对应环境精准安装(推荐`python -m pip install torch`),而非盲目重装。
|
2天前
|
机器学习/深度学习 索引
The size of tensor a (133) must match tensor b (10):分类任务换 MSELoss 后先查标签含义
原帖网络输出133类logits,CrossEntropyLoss支持类别索引输入(如`[10]`),而MSELoss要求`outputs`与`target`形状严格匹配(如`[10,133]`)。报错因`target`为`[10]`,无法广播匹配`[10,133]`输出,本质是两类损失对标签格式约定不同。
|
2天前
|
数据可视化 PyTorch 算法框架/工具
only batches of spatial targets supported:三通道分割 one-hot 转为每像素类别编号
该报错源于PyTorch交叉熵要求标签为`[N, H, W]`(3D),但输入了`[N, 3, H, W]`(4D)掩码。需先验证三通道是否为互斥one-hot,再用`argmax(dim=1)`转为整型标签,并妥善处理全零未标注像素(设`ignore_index`),避免误判为背景类。(239字)
|
2天前
|
存储 数据可视化 PyTorch
dimension out of range [-1, 0], but got 1:UNet 的 CrossEntropyLoss 不要把类别维压平
该帖解析PyTorch中分割任务自定义损失报错`RuntimeError: dimension out of range`的根源:错误展平导致类别维丢失。强调应保持`[N,2,H,W]` logits与`[N,H,W]` long掩码的匹配布局,直接使用`F.cross_entropy`,禁用冗余sigmoid/view;或改用单通道+BCEWithLogitsLoss方案。
|
2天前
|
PyTorch 算法框架/工具 索引
ValueError: only one element tensors can be converted to Python scalars:张量列表先检查形状,再 stack
该文解析PyTorch中`list(tensor)`引发的`ValueError`根源:列表含多元素张量时,不可直接转Python标量。强调应通过`tensor.shape`或遍历打印各张量尺寸来查形状;同形张量用`torch.stack`(增维)而非`cat`或`item`;异形则保留原结构,避免强行转换。

热门文章

最新文章