利用GPU进行训练

文章目录

一、GPU训练模型

GPU只能够训练三种变量,分别是:

网络模型
数据(输入,标注targets)
损失函数

使用方式是.cuda()

除了以上的三种,在别的地方是引用不上cuda的。

使用方式:

1.网络模型

bash 复制代码
#创建网络模型
class Sen(nn.Module):
    def __init__(self):
        super(Sen, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1 ,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4, 64),
            nn.Linear(64, 10)
        )
    def forward(self,x):
        x = self.model(x)
        return x
sen = Sen()
sen.cuda()

2、损失函数

bash 复制代码
#损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.cuda()

3、数据

bash 复制代码
    for data in train_dataloader:
        imgs, targets = data
        imgs = imgs.cuda()
        targets = targets.cuda()
        outputs = sen(imgs)
        loss = loss_fn(outputs, targets)

如果电脑上没有GPU的话,以上这么写会发生报错,更好的写法应该是加上if判断是否有GPU

例下:

bash 复制代码
if torch.cuda.is_available():
    sen.cuda()
bash 复制代码
if torch.cuda.is_available():
	loss_fn = loss_fn.cuda()
bash 复制代码
if torch.cuda.is_available():
  imgs = imgs.cuda()
  targets = targets.cuda()

这样可以保证有gpu先试用gpu,没有gpu也能够正常运行。

二、对比使用gpu和cpu进行训练所花费的时间

引入记录时间函数:

bash 复制代码
import time
bash 复制代码
start_time = time.time()
bash 复制代码
end_time = time.time()
bash 复制代码
print(f"使用gpu训练使用的时间{end_time - start_time}")

在模型训练开始与结束时候分别记录start_time和end_time:

bash 复制代码
start_time = time.time()
for i in range(epoch):
    print(f"-------第{i+1}轮训练开始-------")

    #训练步骤开始
    sen.train()
    for data in train_dataloader:
        imgs, targets = data
        imgs = imgs.cuda()
        targets = targets.cuda()
        outputs = sen(imgs)
        loss = loss_fn(outputs, targets)

        #优化器模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step = total_train_step + 1
        if total_train_step % 100 == 0:
            end_time = time.time()
            print(f"使用gpu训练使用的时间{end_time - start_time}")
            print(f"训练次数:{total_train_step},Loss:{loss.item()}")
            writer.add_scalar("train_loss", loss.item(), total_train_step)

1.使用gpu训练结果:

可以看到平均100次只使用1s。

2.使用cpu进行训练结果:

可以看到没训练100次花费时间是7s

因此使用gpu进行训练模型能大大提升算力。

三、GPU训练模型的第二种表达方式

先定义训练的设备:

bash 复制代码
device = torch.device("cpu")

再在变量当中调用

bash 复制代码
sen = Sen()
sen = sen.to(device)
bash 复制代码
#损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)
bash 复制代码
     imgs, targets = data
     imgs = imgs.to(device)
     targets = targets.to(device)

调用gpu只需要改变训练模型即可,变量当中依旧用.to(device):

bash 复制代码
device = torch.device("cuda")

':0'的写法等同于cuda

bash 复制代码
device = torch.device("cuda:0")

如果电脑上有两个不同的gpu,可以用以下调用第二个gpu进行训练

bash 复制代码
device = torch.device("cuda:1")

为了适用于不同环境,可以用以下代码来写:

bash 复制代码
device = torch.device("cuda" if torch.cuda.is_acailable() else "cpu")
相关推荐
明日清晨15 分钟前
python扫码登录dy
开发语言·python
bazhange29 分钟前
python如何像matlab一样使用向量化替代for循环
开发语言·python·matlab
jinanwuhuaguo29 分钟前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
AI人工智能+41 分钟前
基于高精度身份证OCR识别、炫彩活体检测及人脸比对技术的人脸核身系统,为通信行业数字化转型提供了坚实的安全底座
人工智能·计算机视觉·人脸识别·ocr·人脸核身
人工干智能42 分钟前
科普:python中你写的模块找不到了——`ModuleNotFoundError`
服务器·python
AI人工智能+1 小时前
一种以深度学习与计算机视觉技术为核心的表格识别系统,实现了结构化、半结构化表格的精准文字提取、布局解析与版面完整还原
深度学习·计算机视觉·ocr·表格识别
unicrom_深圳市由你创科技1 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
小敬爱吃饭1 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
宸津-代码粉碎机1 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
知行合一。。。1 小时前
Python--04--数据容器(集合)
python