uryida 2023-12-18 17:01 采纳率: 91.7%
浏览 19
已结题

请教一个深度学习中如何使用GPU加速的问题

#我使用GPU加速时出现了问题,我的cpu被占满了,我的GPU的使用率一上一下的

img


#以下是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

# print(torch.cuda.is_available())     # True
# # 查看GPU数量,索引号从0开始
# print(torch.cuda.current_device())   # 0
# # 根据索引号查看GPU名字
# print(torch.cuda.get_device_name(0)) # NVIDIA GeForce GTX 1050 Ti

# 定义训练设备
device = torch.device("cuda")     #使用gpu

#prepare dataset
class DiabetsDataset(Dataset):
    def __init__(self,filepath):
        xy = np.loadtxt(filepath,delimiter=',',dtype=np.float32)
        self.len = xy.shape[0] #shape会返回xy的长度,如果xy是二维shape[0]就是行数,shape[1]就是列数
        self.x_data = torch.from_numpy(xy[:,:-1])
        self.y_data = torch.from_numpy(xy[:, [-1]])

    def __getitem__(self, index):
        return self.x_data[index],self.y_data[index]

    def __len__(self):
        return self.len

dataset = DiabetsDataset('diabetes.csv')
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=8)

#bulid model
class Model(torch.nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self,x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x

model = Model()
model.to(device)   #将模型用到gpu

#LOSS and OPTIMIZER
criterion = torch.nn.BCELoss(reduction='mean')
criterion.to(device)      #将损失函数放到GPU
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

#train cycle
# training cycle forward, backward, update
if __name__ == '__main__':
    for epoch in range(100):
        for i, data in enumerate(train_loader, 0): # train_loader 是先shuffle后mini_batch
            inputs, labels = data
            inputs = inputs.to(device)  #将数据放到GPU
            labels = labels.to(device)#将数据放到GPU
            y_pred = model(inputs)
            loss = criterion(y_pred, labels)
            print(epoch, i, loss.item())

            optimizer.zero_grad()
            loss.backward()

            optimizer.step()

  • 写回答

1条回答 默认 最新

  • 使者大牙 深度学习领域新星创作者 2023-12-19 15:19
    关注

    这里问了两个问题:

    1. 为什么数据在GPU计算,反而CPU被占满了?
    2. 为什么GPU的使用率一上一下的?

    首先回答第一个问题:我们看到CPU被占满的同时,也应该注意到内存也几乎满了,这里最可能的原因是你读取的.csv文件太大了,

    train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=8)
    

    而且你还指定加载数据的子进程数量num_workers=8,虽然增加num_workers可以提升数据加载的速度,但是过多的子进程可能会导致系统资源竞争(如CPU、内存或I/O资源),反而降低性能(就好像让一堆人拥挤着同时过一个小门,还不如有序排队一个一个过的效率高)。因此,选择合适的num_workers值通常需要根据具体的硬件环境和数据集大小进行调整。

    也就是说,CPU占用率过高根本不是因为模型在计算数据,而是在进行数据加载。 解决的方法是降低num_workers的值,试试4或者2甚至0

    第二个问题原因非常简单,因为对GPU来说这个计算任务太简单了(这个模型只有3个全连接层+激活函数),GPU很快就算完了,所以大部分时间在闲置,就看到了GPU的占用率是这种“梳子”形曲线。

    我在这篇文章中对比过GPU和CPU在大矩阵上的计算速度【PyTorch&TensorBoard实战】GPU与CPU的计算速度对比(附代码) GPU在并行计算上真的拥有巨大优势!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 修改了问题 12月18日
  • 创建了问题 12月18日

悬赏问题

  • ¥20 思科:Router c3600 MN-4E插槽
  • ¥15 16进制修改视频的元数据
  • ¥15 岛津txt格式文件转nirs格式
  • ¥15 石墨烯磁表面等离子体
  • ¥15 angular 项目无法启动
  • ¥15 安装wampserver,图标绿色,但是无法进入软件
  • ¥15 C++ MFC 标准库 加密解密解惑
  • ¥15 两条数据合并成一条数据
  • ¥15 Ubuntu虚拟机设置
  • ¥15 comsol三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项