数据集输入到分类模型中产生的bug

在我尝试把数据集输入到网络后,在计算损失函数步骤后面出现了这个错误。

Traceback (most recent call last):
  File "train.py", line 158, in 
    main()
  File "train.py", line 121, in main
    loss.backward()
  File "/root/miniconda3/lib/python3.8/site-packages/torch/_tensor.py", line 487, in backward
    torch.autograd.backward(
  File "/root/miniconda3/lib/python3.8/site-packages/torch/autograd/__init__.py", line 197, in backward
    Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`

下面是对应的代码片段

   for epoch in range(epochs):
        # train
        net.train()
        running_loss = 0.0
        train_bar = tqdm(train_loader, file=sys.stdout)
        for step, data in enumerate(train_bar):
            images, labels = data
            optimizer.zero_grad()
#             images = torch.stack(images, dim=1)
            logits = net(images.to(device))
            loss = loss_function(logits, labels.to(device))
        **    loss.backward()**
            optimizer.step()

            # print statistics
            running_loss += loss.item()

            train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,
                                                                     epochs,
                                                                     loss)


我看到其他回答是数据集分类数量和模型分类数量不一致,但是我不理解这是什么意思,请问怎么修改,万分感激。

是你的GPU内存不足导致的,计算损失函数的梯度时,要分配足够的 GPU 内存,但是现在内存不够用了,就出错了。
降低 batch size ,比如:

train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)

或者用 GPU 量化:用低精度的 GPU 数据类型,比如 half,可以节省 GPU 内存。
还可以选择使用更小的模型、使用 CPU 进行训练。
在亏本点,换个大GPU,

这个错误消息表明 CUDA 运算时内存分配失败。可能的原因有:

GPU 内存不足:如果你的 GPU 内存不够,尝试减少数据集的大小或者降低模型的复杂度。
选择的 GPU 是否支持 CUDA:请检查你的 GPU 是否支持 CUDA 并且安装了相应的驱动程序。
该模型是否使用了 GPU:请确保将模型以及数据从 CPU 转移到 GPU 上,如下所示:


device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)
images = images.to(device)
labels = labels.to(device)

该错误一般是由于 GPU 内存不足导致的。在 PyTorch 中,计算损失函数的梯度并反向传播(backward)的过程可能会消耗大量的 GPU 内存。如果 GPU 内存不够,则无法完成该过程,从而出现该错误。

解决该错误的方法是:

1.减小数据集的大小,减少 GPU 内存占用。
2.使用更小的网络模型。
3.尝试通过分批处理数据来减小单次 GPU 内存占用(比如,通过将数据分成多个小批量,并逐批进行训练)。
如果上述方法都不能解决问题,可以尝试使用更大的 GPU 或将代码运行在 CPU 上。

这个错误是因为你在使用 CUDA 运行时出现了 CUDA 内存分配错误,而 CUDA 内存分配错误通常是由于 GPU 内存不足导致的。

具体来说,损失函数的计算过程中可能需要大量的内存空间,如果你的 GPU 内存不够用,那么 CUDA 就会抛出这个错误。

要修复这个错误,可以尝试以下几种方法:

减少数据集的大小:如果你的数据集很大,可以减小它的大小来减少 GPU 内存的使用。

使用较小的网络:如果你的网络非常大,可以使用较小的网络来减少 GPU 内存的使用。

使用 GPU 限制:可以使用 torch.cuda.max_memory_allocated() 和 torch.cuda.max_memory_cached() 来限制 GPU 的内存使用。

使用硬件限制:如果你有多块 GPU,可以使用 CUDA_VISIBLE_DEVICES 环境变量来限制可用 GPU 的数量。

你这个报错应该是显存不够用了啊,你可以把batchsize减小一些 或者 到显存大一些的卡上再跑跑看。然后对于你说的数据集分类数量和模型分类数量不一致的问题,你不太理解。我给你解释一下:分类的时候肯定会涉及类别标签,这里就有两个维度,一个是训练数据集的标签 以及 模型的分类类别数,比如数据是猫、狗、大象三分类,那么可以认为分类id为0-猫、1-狗、2-大象,那么对应到分类模型就是1x3的输出,id0为猫的概率、id1为狗的概率、id2为大象的概率。希望对你有所帮助。

看到这个错误信息,可以得知是一个 CUDA 相关的错误。CUBLAS_STATUS_ALLOC_FAILED 错误通常是因为 GPU 内存不足引起的。

有几种方法可以尝试解决这个问题:

调整 batch size: 使用较小的 batch size 可以降低 GPU 内存的使用量。

限制 GPU 内存使用量:可以使用 torch.cuda.empty_cache() 函数在使用完 GPU 后清空 GPU 缓存,从而限制 GPU 内存的使用量。

降低模型的复杂度:如果模型太复杂,可以尝试降低模型的复杂度以减少 GPU 内存的使用量。

可以尝试这些方法中的一个或几个,看看哪个方法对于您的情况是有效的。

您可以尝试重新安装CUDA驱动程序,以解决此问题。首先,您需要确保您的系统上安装了最新版本的CUDA驱动程序,然后您可以尝试重新安装CUDA驱动程序,以确保您的系统上安装的是最新版本的CUDA驱动程序。此外,您还可以尝试更新您的显卡驱动程序,以确保您的显卡驱动程序是最新版本的。