wizard_zqmy 2024-09-16 17:43 采纳率: 0%
浏览 13
已结题

神经网络模型一直不能上GPU

本人是初学神经网络,对代码里面的配置设计不是很了解,尝试搜索了各种方法,但都没法解决,
先摆一下基本参数:

python:3.9.19
cuda:11.5   # nvidia-smi查看的最高支持版本是12.2
cudnn:8302
pytorch:1.11.0+cu115

在这个配置的pytorch_gpu环境下尝试运行过别人的代码,是可以在GPU上跑的,也就是说环境应该是没问题的
以下是我自己的代码:(删减了一些print,主体是没有删减的)

class BPNeuralNetwork(nn.Module):
    def __init__(self):  # 设置在BP神经网络中用到的参数
        self.dataloader = None
        self.model = None
        self.input_n = 0
        self.hidden_n = 0
        self.output_n = 0
        self.dataset = 'single_tone_estimation'
        self.save_dir = 'modelsave'
        self.model_name = 'bpnntest'
        super(BPNeuralNetwork, self).__init__()

    def setup(self, arg):  # 参数设置
        self.input_n = arg.ni
        self.hidden_n = arg.nh
        self.output_n = arg.no
        self.model = nn.Sequential(nn.Linear(self.input_n, self.hidden_n, True),
                                   nn.Sigmoid(),
                                   nn.Linear(self.hidden_n, self.output_n, True),
                                   nn.Sigmoid())

    def bptrain(self, batch_size, epochs, learn_rate, filenum):
        self.train_hist = {}
        self.train_hist['loss'] = []
        self.train_hist['per_epoch_time'] = []
        self.train_hist['total_time'] = []

        # loss
        self.criterion = torch.nn.MSELoss()
        # optimizer
        self.optimizer = torch.optim.SGD(self.model.parameters(), learn_rate, weight_decay=1e-6)

        if torch.cuda.is_available():
            print(True)
            self.model = self.model.cuda()  # 将模型加载到GPU上去
            self.criterion = self.criterion.cuda()

        print("-" * 25)
        print('BPNN开始循环训练...\n')

        loss_list = []
        lr_list = []
        start_time = time.time()
        for j in range(epochs):
            epoch_start_time = time.time()
            for datafile in range(filenum):  # 共四个训练数据集
                self.dataloader = load_data(batch_size, datafile)
                for iters, (datas, labels) in enumerate(self.dataloader, 0):  # 依次提取样本数据,一次循环是一个batch
                    datas = Variable(datas).cuda()
                    labels = Variable(labels).cuda()
                    model_outputs = self.model(datas)

                    # ===========求在偏差范围内的输出个数==========detach().
                    acc_temp = 0
                    model_outputs_cpu = model_outputs.cpu().detach().numpy()
                    labels_cpu = labels.cpu().detach().numpy()
                    for i in range(len(labels)):
                        if abs(labels_cpu[i, 0] - model_outputs_cpu[i, 0]) <= 0.001:
                            if abs(labels_cpu[i, 1] - model_outputs_cpu[i, 1]) <= 0.01:
                                acc_temp += 1
                    acc += acc_temp  # 计算模型当前的识别率
                    total += batch_size

                    # 求损失loss
                    labels = labels.to(torch.float32)  # 由于backward(),需要先转换类型
                    loss = self.criterion(model_outputs, labels)
                    loss_list.append(float(loss))
                    # 使用优化器优化损失
                    self.optimizer.zero_grad()  # 清空上一步残余更新参数值
                    loss.backward()  # 误差反向传播,计算参数更新值
                    self.optimizer.step()
                    train_loss += loss.item()
                print("file:[%4d] Loss:%.3f | acc: %.3f%%" %
                      (datafile, (train_loss / (j + 1)), 100 * acc / total))

            lr_list.append(self.optimizer.state_dict()['param_groups'][0]['lr'])
            self.train_hist['per_epoch_time'].append(time.time() - epoch_start_time)
        # 保存训练的模型
        self.save()

按照之前搜到的帖子,模型、损失函数、数据,我都添加了.cuda(),加.to(device)也尝试过,但运行起来GPU调用还是0

img

自己也在想会不会是其他配置或者代码有问题,但目前实在是不知道问题出在哪,如果有佬之前有类似情况并解决,也麻烦给我参考参考,万分感谢!

针对已有回答的回复:
(1)有使用如下代码,

print(torch.cuda.is_available())  # 输出为  True
print(labels.device, datas.device, next(self.model.parameters()).device)   # 输出均为cuda:0

(2).to(device)尝试过了,前面已经说过了
(3)问答区真的没有真人吗?

  • 写回答

29条回答 默认 最新

  • 阿里嘎多学长 2024-09-16 18:07
    关注
    获得0.15元问题酬金

    AIGC生成:


    神经网络模型一直不能上GPU

    你好!我是阿里嘎多学长,很高兴帮助你解决神经网络模型不能上GPU的问题。

    首先,感谢你提供了基本参数信息,包括 Python 版本、CUDA 版本和 NVIDIA GPU 的信息。下面,我将列举一些可能的解决方法:

    1. 检查 CUDA 版本是否正确:请确保你的 CUDA 版本与 NVIDIA GPU 的版本相匹配。如果你的 GPU 支持的最高 CUDA 版本是 11.5,而你使用的 CUDA 版本是 11.5,那么这可能不是问题的原因。
    2. 检查 GPU 是否被占用:使用 nvidia-smi 命令来查看 GPU 的使用情况。如果 GPU 已经被占用,可以使用 nvidia-smi -L 命令来查看占用 GPU 的进程。
    3. 检查 Python 版本是否支持 GPU:Python 3.9.19 支持 GPU 计算,但是你需要使用合适的库和框架来访问 GPU。例如,你可以使用 TensorFlow、PyTorch 或 Keras 等库来访问 GPU。
    4. 检查代码中的 GPU 配置:请检查你的代码中是否正确地配置了 GPU。例如,你可以使用 import tensorflow as tftf.config.set_visible_devices([0]) 来设置 GPU 的可见设备。
    5. 检查 GPU 驱动程序是否更新:请确保你的 GPU 驱动程序已经更新到最新版本。如果你的 GPU 驱动程序 outdated,这可能会导致 GPU 无法正确地访问。
    6. 检查系统中的 CUDA 依赖项:请确保你的系统中已经安装了正确的 CUDA 依赖项。如果你使用的是 Linux 系统,可以使用 sudo apt-get install libcuda1 命令来安装 CUDA 依赖项。
    7. 检查代码中的 GPU 优化设置:请检查你的代码中是否正确地设置了 GPU 优化参数。例如,你可以使用 import tensorflow as tftf.config.optimizer.set_jit(True) 来设置 GPU 优化参数。

    这些可能的解决方法可以帮助你解决神经网络模型不能上GPU的问题。如果你仍然无法解决问题,请提供更多的信息和代码,我将尽力帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 9月24日
  • 修改了问题 9月17日
  • 修改了问题 9月16日
  • 创建了问题 9月16日

悬赏问题

  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用