pytorch -- GPU优化写法套路

1. GPU优化的点

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

  1. .cuda方式
    代码:
import torch.optim
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# 1. 准备数据集
train_data = torchvision.datasets.CIFAR10('data',train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10('data',train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 数据集大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print('训练数据集的长度为{}'.format(train_data_size))
print('测试数据集的长度为{}'.format(test_data_size))# 2 利用DataLoader加载数据集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)# 3 搭建神经网络
# 3 搭建神经网络
class Tudui(nn.Module):def __init__(self):super().__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(1024,64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x# 4 创建网络模型
tudui = Tudui()
# --------------------------
if torch.cuda.is_available():tudui = tudui.cuda()# 5 损失函数
loss_fn = nn.CrossEntropyLoss()
# ---------------------------
if torch.cuda.is_available():loss_fn = loss_fn.cuda()# 6 优化器 1e-2=1x10^(-2)
learning_rate = 0.01
optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)# 7 设置训练网络的一些参数
total_train_step = 0 # 记录训练次数
total_test_step = 0 # 记录测试次数
epoch = 10 #训练轮数
# 添加tensorboard
writer = SummaryWriter('logs_model')
for i in range(epoch):print('-----------第{}轮训练开始-----------'.format(i+1))# 训练开始# 训练步骤开始 dropout batchNorm仅对某些层次有作用tudui.train()for data in train_dataloader:imgs, targets = data# ---------------------------if torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()output = tudui(imgs) #训练模型的预测输出loss = loss_fn(output,targets)# 优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print('训练次数是{}时,loss是{}'.format(total_train_step,loss.item()))# 加了item() tensor变成了数字writer.add_scalar('train_loss',loss.item(),total_train_step)# 训练完一轮,看是否训练好,有没有达到想要的需求,测试数据集中跑一篇看准确率或者损失# 测试步骤开始tudui.eval()total_test_loss = 0total_accuracy = 0# 测试不需要对梯度进行调整with torch.no_grad():for data in test_dataloader:imgs,targets = data# ---------------------------if torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()outputs = tudui(imgs)loss = loss_fn(outputs,targets)total_test_loss += loss.item()accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracyprint('整体测试集上的loss是{}'.format(total_test_loss))print('整体测试集上的正确率是{}'.format(total_accuracy/test_data_size))writer.add_scalar('test_loss',total_test_loss,total_test_step)writer.add_scalar('test_accuracy', total_accuracy, total_test_step)total_test_step+=1torch.save(tudui,'tudui_{}.pth'.format(i))print('模型已保存')writer.close()

3…to(device)方式

device = torch.device("cpu")
# 第一张显卡
torch.device("cuda")
torch.device("cuda:0")
# 第二张
torch.device("cuda:1")

代码:

import torch.optim
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# 定义训练的设备
device = torch.device('cuda')# 1. 准备数据集
train_data = torchvision.datasets.CIFAR10('data',train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10('data',train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 数据集大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print('训练数据集的长度为{}'.format(train_data_size))
print('测试数据集的长度为{}'.format(test_data_size))# 2 利用DataLoader加载数据集
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)# 3 搭建神经网络
# 3 搭建神经网络
class Tudui(nn.Module):def __init__(self):super().__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(1024,64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x# 4 创建网络模型
tudui = Tudui()
# --------------------------
# if torch.cuda.is_available():
#     tudui = tudui.cuda()
tudui = tudui.to(device)# 5 损失函数
loss_fn = nn.CrossEntropyLoss()
# ---------------------------
# if torch.cuda.is_available():
#     loss_fn = loss_fn.cuda()
loss_fn = loss_fn.to(device)# 6 优化器 1e-2=1x10^(-2)
learning_rate = 0.01
optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)# 7 设置训练网络的一些参数
total_train_step = 0 # 记录训练次数
total_test_step = 0 # 记录测试次数
epoch = 10 #训练轮数
# 添加tensorboard
writer = SummaryWriter('logs_model')
for i in range(epoch):print('-----------第{}轮训练开始-----------'.format(i+1))# 训练开始# 训练步骤开始 dropout batchNorm仅对某些层次有作用tudui.train()for data in train_dataloader:imgs, targets = data# ---------------------------# if torch.cuda.is_available():#     imgs = imgs.cuda()#     targets = targets.cuda()imgs = imgs.to(device)targets = targets.to(device)output = tudui(imgs) #训练模型的预测输出loss = loss_fn(output,targets)# 优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print('训练次数是{}时,loss是{}'.format(total_train_step,loss.item()))# 加了item() tensor变成了数字writer.add_scalar('train_loss',loss.item(),total_train_step)# 训练完一轮,看是否训练好,有没有达到想要的需求,测试数据集中跑一篇看准确率或者损失# 测试步骤开始tudui.eval()total_test_loss = 0total_accuracy = 0# 测试不需要对梯度进行调整with torch.no_grad():for data in test_dataloader:imgs,targets = data# ---------------------------# if torch.cuda.is_available():#     imgs = imgs.cuda()#     targets = targets.cuda()imgs = imgs.to(device)targets = targets.to(device)outputs = tudui(imgs)loss = loss_fn(outputs,targets)total_test_loss += loss.item()accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracyprint('整体测试集上的loss是{}'.format(total_test_loss))print('整体测试集上的正确率是{}'.format(total_accuracy/test_data_size))writer.add_scalar('test_loss',total_test_loss,total_test_step)writer.add_scalar('test_accuracy', total_accuracy, total_test_step)total_test_step+=1torch.save(tudui,'tudui_{}.pth'.format(i))print('模型已保存')writer.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++实现XOR加解器

#include <Windows.h> #include <iostream> #include <fstream> #include <string>// 加解密函数&#xff0c;使用XOR运算 void XORCrypt(char* data, int size, const std::string& key) {int keyLength key.length();for (int i 0; i < siz…

日志系统项目实现

日志系统的功能也就是将一条消息格式化后写入到指定位置&#xff0c;这个指定位置一般是文件&#xff0c;显示器&#xff0c;支持拓展到数据库和服务器&#xff0c;后面我们就知道如何实现拓展的了&#xff0c;支持不同的写入方式(同步异步)&#xff0c;同步:业务线程自己写到文…

万卡集群:字节搭建12288块GPU的单一集群

文章目录 论文Reference 论文 MegaScale: Scaling Large Language Model Training to More Than 10,000 GPUs 论文链接&#xff1a;https://arxiv.org/abs/2402.15627 从结构上讲&#xff0c;网络是基于Clos的“胖树”结构。其中一个改进是在顶层交换机上把上行与下行链路分开&…

三、《任务列表案例》前端程序搭建和运行

本章概要 整合案例介绍和接口分析 案例功能预览接口分析 前端工程导入 前端环境搭建导入前端程序 启动测试 3.1 整合案例介绍和接口分析 3.1.1 案例功能预览 3.1.2 接口分析 学习计划分页查询 /* 需求说明查询全部数据页数据 请求urischedule/{pageSize}/{currentPage} 请…

stm32触发硬件错误位置定位

1.背景 1. 项目中&#xff0c;调试过程或者测试中都会出现程序跑飞问题&#xff0c;这个时候问题特别难查找。 2. 触发硬件错误往往是因为内存错误。这种问题特别难查找&#xff0c;尤其是产品到了测试阶段&#xff0c;而这个异常复现又比较难的情况下&#xff0c;简直头疼。…

初学JavaScript总结

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;需要给他注入灵魂&#xff0c;所以接下来需要学习JavaScript&#xff0c;这门语言会让页面能够和用户进行交互。JavaScript又称为脚本语言&#xff0c;可以通过脚本实现用户和页面的…

每日shell脚本之打印99乘法表

每日shell脚本之打印99乘法表 #!/bin/bash for i in $(seq 1 9); dofor j in $(seq 1 9); doecho -n "$i * $j $(($i * $j)) "doneecho done

Programming Abstractions in C阅读笔记:p306-p307

《Programming Abstractions in C》学习第75天&#xff0c;p306-p307总结&#xff0c;总计2页。 一、技术总结 1.Quicksort algorithm(快速排序) 由法国计算机科学家C.A.R(Charles Antony Richard) Hoare&#xff08;东尼.霍尔&#xff09;在1959年开发(develop), 1961年发表…

Mac 制作可引导安装器

Mac 使用U盘或移动固态硬盘制作可引导安装器&#xff08;以 Monterey 为例&#xff09; 本教程参考 Apple 官网相关教程 创建可引导 Mac OS 安装器 重新安装 Mac OS 相关名词解释 磁盘分区会将其划分为多个单独的部分&#xff0c;称为分区。分区也称为容器&#xff0c;不同容器…

VR虚拟现实技术应用到猪抗原体检测的好处

利用VR虚拟仿真技术开展猪瘟检测实验教学确保生猪产业健康发展 为了有效提高猪场猪瘟防控意识和检测技术&#xff0c;避免生猪养殖业遭受猪瘟危害&#xff0c;基于VR虚拟仿真技术开展猪瘟检测实验教学数据能大大推动基层畜牧养殖业持续稳步发展保驾护航。 一、提高实验效率 VR虚…

鲲鹏arm64架构下安装KubeSphere

鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…

基于大模型思维链(Chain-of-Thought)技术的定制化思维链提示和定向刺激提示的心理咨询场景定向ai智能应用

本篇为个人笔记 记录基于大模型思维链&#xff08;Chain-of-Thought&#xff09;技术的定制化思维链提示和定向刺激提示的心理咨询场景定向ai智能应用 人工智能为个人兴趣领域 业余研究 如有错漏欢迎指出&#xff01;&#xff01;&#xff01; 目录 本篇为个人笔记 记录基…

价格腰斩,腾讯云2024优惠活动云服务器62元一年,多配置报价

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…

【排坑】搭建 Karmada 环境

git clone 报错 问题&#xff1a;Failed to connect to github.com port 443:connection timed out 解决&#xff1a; git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 问题&#xff1a;fetching http…

老化的电动车与高层电梯楼的结合,将是巨大的安全隐患

中国是全球最大的电动汽车市场&#xff0c;其实中国还是全球最大的电动两轮车市场&#xff0c;而电动两轮车的老化比电动汽车更快&#xff0c;电动汽车的电池寿命可以达到10年&#xff0c;而电动两轮车的电池寿命只有3-5年&#xff0c;而首批电动两轮车至今已老化得相当严重&am…

【Pytorch深度学习开发实践学习】【AlexNet】经典算法复现-Pytorch实现AlexNet神经网络(1)model.py

算法简介 AlexNet是人工智能深度学习在CV领域的开山之作&#xff0c;是最先把深度卷积神经网络应用于图像分类领域的研究成果&#xff0c;对后面的诸多研究起到了巨大的引领作用&#xff0c;因此有必要学习这个算法并能够实现它。 主要的创新点在于&#xff1a; 首次使用GPU…

AI语音识别的技术解析

从语音识别算法的发展来看&#xff0c;语音识别技术主要分为三大类&#xff0c;第一类是模型匹配法&#xff0c;包括矢量量化(VQ) 、动态时间规整(DTW)等&#xff1b;第二类是概率统计方法&#xff0c;包括高斯混合模型(GMM) 、隐马尔科夫模型(HMM)等&#xff1b;第三类是辨别器…

golang gin单独部署vue3.0前后端分离应用

概述 因为公司最近的项目前端使用vue 3.0&#xff0c;后端api使用golang gin框架。测试通过后&#xff0c;博文记录&#xff0c;用于备忘。 步骤 npm run build&#xff0c;构建出前端项目的dist目录&#xff0c;dist目录的结构具体如下图 将dist目录复制到后端程序同级目录…

嵌入式软件bug从哪里来,到哪里去

摘要&#xff1a;软件从来不是一次就能完美的&#xff0c;需要以包容的眼光看待它的残缺。那问题究竟为何产生&#xff0c;如何去除呢&#xff1f; 1、软件问题从哪来 软件缺陷问题千千万万&#xff0c;主要是需求、实现、和运行环境三方面。 1.1 需求描述偏差 客户角度的描…