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

神经网络模型一直不能上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 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用
  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启