【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置

  • 写在最前面
  • 一、查看哪几块显卡能用
  • 二、使用指定gpu运行代码
    • 1、指定使用GPU0运行脚本(默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推)
    • 2、指定使用多张显卡运行脚本
  • 三、如何使用
    • 1、单块显卡使用
    • 2、多GPU训练
      • 使用`DataParallel`
      • 使用`DistributedDataParallel`
      • 两种方法的对比
      • 注意事项
      • 选择合适的方法
    • 参考资料
  • 四、小结
    • 关键点小结
    • 配置多GPU并行和数据加载器
      • 1. 设置`CUDA_VISIBLE_DEVICES`
      • 2. 配置PyTorch设备和模型
      • 3. 优化数据加载器
    • 整合后的代码示例


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

深度学习(Deep Learning)已经成为众多领域中的重要技术,尤其在图像识别、自然语言处理、语音识别等方面表现出色。然而,深度学习模型的训练通常需要大量的计算资源,因此高性能计算(HPC)和GPU(图形处理单元)显卡变得至关重要。

在大型机构分配的服务器集群中,需要使用GPU的程序默认都会在第一张卡上进行,如果第一张卡倍别人占用或者显存不够的情况下,程序就会报错说没有显存容量,所以能够合理地利用GPU资源能帮助你更快更好地跑出实验效果。

本篇博客将介绍在服务器上进行深度学习炼丹(即训练模型)时如何配置代码,以及如何在Python中指定特定的GPU显卡来运行代码。

参考:https://cloud.tencent.com/developer/article/2352733

一、查看哪几块显卡能用

在进行深度学习任务之前,需要配置服务器环境。

登陆服务器,查看gpu是否可用,并确定CUDA版本

用ssh命令登录服务器(账号密码略),输入命令:nvidia-smi,查看gpu是否可用。

在我的这个案例中,可用显卡为:

  • 可用显卡: GPU 0, GPU 1, GPU 2, GPU 3
  • 部分使用中的显卡: GPU 4, GPU 5
  • 高负载使用中的显卡: GPU 6, GPU 7

GPU 0 到 GPU 3 目前几乎未被使用,温度和内存利用率都很低,适合用于新任务。GPU 4 和 GPU 5 在中等负载下,但仍有一定余量。GPU 6 和 GPU 7 负载较高,建议避免使用或等负载减小后再使用。

在这里插入图片描述

二、使用指定gpu运行代码

1、指定使用GPU0运行脚本(默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推)

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

2、指定使用多张显卡运行脚本

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,2,3"
# 注意:这两行代码必须在文件的最开头,在加载各种包之前

三、如何使用

1、单块显卡使用

在python文件中,定义需要加速的模型之后,加上:

model = ......
model.train(True) or model.train(False) # 看你是要训练还是测试
model.to('cuda') # 或者model.cuda()
# 后面需要输入model的变量也是需要.to('cuda')或者.cuda()的,不然会报错既用了cpu又用gpu,不兼容

2、多GPU训练

假如:为了让你的PyTorch代码在多块显卡(0,1,2,3)上运行,你可以使用torch.nn.DataParallel或者torch.nn.parallel.DistributedDataParallel来进行多GPU训练。

使用DataParallel

DataParallel 是一个相对简单的方法,它可以在多块GPU上进行数据并行处理。下面是如何使用DataParallel的方法:

import torch
import torch.nn as nn
import torch.optim as optim# 假设你有一个简单的模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = nn.Linear(100, 10)def forward(self, x):return self.fc(x)# 创建模型
model = SimpleModel()# 将模型转换为DataParallel,并指定使用的显卡
model = nn.DataParallel(model, device_ids=[0, 1, 2, 3])# 将模型移至GPU
model = model.cuda()# 创建一个优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)# 创建数据
inputs = torch.randn(64, 100).cuda()
labels = torch.randn(64, 10).cuda()# 训练步骤
outputs = model(inputs)
loss = nn.MSELoss()(outputs, labels)
loss.backward()
optimizer.step()

使用DistributedDataParallel

DistributedDataParallel 是一种更高级的方法,通常在大规模分布式训练中使用,但在单机多卡上也可以提升性能。下面是如何使用DistributedDataParallel的方法:

  1. 启动代码
    在使用DistributedDataParallel时,你需要使用多进程方式启动程序。可以通过torch.multiprocessing或命令行启动。

  2. 代码修改

import torch
import torch.distributed as dist
import torch.multiprocessing as mp
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP# 简单模型定义
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = nn.Linear(100, 10)def forward(self, x):return self.fc(x)def setup(rank, world_size):# 初始化进程组dist.init_process_group("nccl", rank=rank, world_size=world_size)torch.cuda.set_device(rank)def cleanup():dist.destroy_process_group()def train(rank, world_size):setup(rank, world_size)# 模型model = SimpleModel().to(rank)ddp_model = DDP(model, device_ids=[rank])optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)inputs = torch.randn(64, 100).to(rank)labels = torch.randn(64, 10).to(rank)outputs = ddp_model(inputs)loss = nn.MSELoss()(outputs, labels)loss.backward()optimizer.step()cleanup()if __name__ == "__main__":world_size = 4mp.spawn(train,args=(world_size,),nprocs=world_size,join=True)

两种方法的对比

  • DataParallel:简单易用,适用于轻量级并行处理,但扩展性较差,在大规模分布式训练中性能不如DistributedDataParallel
  • DistributedDataParallel:适用于大规模训练,可以获得更好的性能,但代码复杂度略高,需要使用多进程启动。

注意事项

  1. 模型和数据要发送到指定的设备:确保模型和数据都发送到指定的GPU,否则可能会报错。
  2. 同步BN:在多GPU环境下,使用同步批标准化(Batch Normalization)可能需要特殊处理。

选择合适的方法

  • 对于简单的多GPU训练任务,使用DataParallel
  • 对于需要高性能、扩展性强的任务,使用DistributedDataParallel

参考资料

  • PyTorch DataParallel Documentation
  • PyTorch DistributedDataParallel Documentation

这两种方法可以帮助你在多块显卡上高效地运行你的深度学习代码,选择适合你的需求的方法,来实现模型的多GPU训练。

四、小结

关键点小结

  1. 设置CUDA_VISIBLE_DEVICES: 指定多个GPU设备,使得代码只看到这些设备。
  2. 多GPU并行: 使用torch.nn.DataParallel包装模型,利用多个GPU。
  3. 数据加载优化: 设置num_workers参数优化数据加载,减少CPU负载。

这段代码展示了如何在PyTorch中配置多GPU训练和优化数据加载。这样可以有效利用多GPU的计算能力,并优化CPU资源使用。

为了将多GPU并行训练设置在代码中的适当位置并优化数据加载器,你需要在运行的第一个文件的开头设置os.environ["CUDA_VISIBLE_DEVICES"],并根据设备情况设置模型的多GPU并行。以下是如何进行这些设置的步骤和示例代码。

配置多GPU并行和数据加载器

1. 设置CUDA_VISIBLE_DEVICES

在运行的第一个文件的最前面,添加设置环境变量的代码。这会使得后续的代码只看到指定的GPU设备:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,6,7"

2. 配置PyTorch设备和模型

根据设备情况,使用torch.nn.DataParallel进行多GPU并行:

import torch
import torch.nn as nn
import torch.optim as optim# 定义设备
globalDevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 假设你有一个cnn模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv = nn.Conv2d(3, 16, 3, 1)self.fc = nn.Linear(16 * 26 * 26, 10)def forward(self, x):x = self.conv(x)x = torch.relu(x)x = x.view(x.size(0), -1)x = self.fc(x)return xcnn = CNN().to(globalDevice)# 如果有多个GPU,使用DataParallel
if torch.cuda.device_count() > 1:print(f"Using {torch.cuda.device_count()} GPUs")net = nn.DataParallel(cnn)
else:print("Using single GPU or CPU")net = cnn

3. 优化数据加载器

使用num_workers参数优化数据加载,通常设置为CPU核心数的一半或略低于核心数。对于高效的训练,可以设置为20或40,这取决于你的CPU能力和任务需求。

from torch.utils.data import DataLoader, Dataset# 假设你有一个简单的数据集
class SimpleDataset(Dataset):def __init__(self, size):self.size = sizedef __len__(self):return self.sizedef __getitem__(self, idx):return torch.randn(3, 28, 28), torch.tensor(1)dataset = SimpleDataset(1000)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=20)

整合后的代码示例

以下是整合后的代码示例,涵盖了从配置GPU、定义模型、设置数据加载器到运行训练过程的完整流程。

import os
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset# 设置环境变量
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,6,7"# 定义设备
globalDevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 定义简单的CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv = nn.Conv2d(3, 16, 3, 1)self.fc = nn.Linear(16 * 26 * 26, 10)def forward(self, x):x = self.conv(x)x = torch.relu(x)x = x.view(x.size(0), -1)x = self.fc(x)return x# 实例化模型
cnn = CNN().to(globalDevice)# 检查GPU数量并设置DataParallel
if torch.cuda.device_count() > 1:print(f"Using {torch.cuda.device_count()} GPUs")net = nn.DataParallel(cnn)
else:print("Using single GPU or CPU")net = cnn# 定义数据集和数据加载器
class SimpleDataset(Dataset):def __init__(self, size):self.size = sizedef __len__(self):return self.sizedef __getitem__(self, idx):return torch.randn(3, 28, 28), torch.tensor(1)dataset = SimpleDataset(1000)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=20)# 定义优化器和损失函数
optimizer = optim.SGD(net.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()# 简单的训练过程
for epoch in range(2):for inputs, labels in dataloader:inputs, labels = inputs.to(globalDevice), labels.to(globalDevice)optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()print(f"Epoch {epoch+1}, Loss: {loss.item()}")

欢迎大家添加好友交流。

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

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

相关文章

使用minio搭建oss

文章目录 1.minio安装1.拉取镜像2.启动容器3.开启端口1.9090端口2.9000端口 4.访问1.网址http://:9090/ 5.创建一个桶 2.minio文件服务基本环境搭建1.创建一个文件模块2.目录结构3.配置依赖3.application.yml 配置4.编写配置类MinioConfig.java,构建minioClient5.Fi…

FullScreen API与F11快捷键的相关问题排查与解决

前言 某个项目需要点击全屏按钮将页面中某个容器内的元素进行全屏显示便于用户操作,点击退出全屏时显示原来的页面内容 问题 1:指定元素全屏存在部分元素无法显示 记得之前看 FullScreen 相关API时有印象可以让某一元素直接全屏显示,随即…

LeetCode 算法:翻转二叉树 c++

原题链接🔗:翻转二叉树 难度:简单⭐️ 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 …

面对.rmallox勒索病毒:如何有效防范及应对

引言: 在当今数字化社会,网络安全问题日益严重,勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略,…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角,看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

Oracle 23ai的Windows平台版本发布了

Oracle 23ai free的版本之前只有Linux平台的版本,刚刚增加了Windows平台的版本,这里尝一下鲜。 关于号主,姚远: Oracle ACE(Oracle和MySQL数据库方向)华为云最有价值专家《MySQL 8.0运维与优化》的作者拥有…

UI设计必备的6个网站,赶紧收藏!

6个UI设计必备网站,找素材、找灵感一步到位,赶紧收藏起来吧! 1、菜鸟图库 UI图片素材-UI图片模板免费下载 - 菜鸟图库 菜鸟图库提供了超多免费设计素材,在这里你可以找到平面、UI、电商等设计类素材,还有大量的高清背…

AI视频教程下载-数据分析中的提示工程:Python、Pandas、ChatGPT

Prompt Engineering for Data Analysis Python, Pandas, ChatGPT ChatGPT与Python:无需编程。借助ChatGPT、Python、Pandas及提示工程进行数据分析与数据可视化 "利用Python、Pandas和ChatGPT进行数据分析的提示工程"是一门开创性的课程,它通…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作:Pointw…

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序,pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…

[Go Web] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施,不限定于某种注册中心,或数据库ORM等,所以您可以十分轻松地将任意库集成进项目里,与Kratos共同运作。 API -&…

老无忧,成熟人士都在玩的社交app

随着互联网向不同年龄群体的进一步渗透,越来越多大龄人士逐步在传统以年轻人为主的平台中搭建起自己的空间,对缔结社交关系的需求也变得强烈起来。老无忧无忧交友app应运而生,于2024年6月1日正式上线(以下简称“老无忧”&#xff…

校园圈子小程序系统搭建需求和需要哪些功能?APP小程序H5前后端源码交付

功能:小程序授权登陆,支持app双端,小程序,h5,pc端,手机号登陆,发帖,建圈子、发活动。可置顶推荐帖子,关注、粉 丝、点赞等。可作为圈子贴吧、小红书、校园社区、表白墙、…

【Lua小知识】Vscode中Emmylua插件大量报错的解决方法

起因 Vscode写Lua用的好好的,最近突然出现了大量报错。 看报错是有未定义的全局变量,这里查日志才发现是由于0.7.5版本新增诊断启用配置,所以导致了原先好的代码,现在出现了大量的报错。 解决方案一 最直接的方法当然是在配置中直…

java周测总结(3)

1、什么是I0流? 是一串流动的字符,从先进先出的方式要求信息的通道。 2、什么是序列化?什么是反序列化? 序例化是将对象的状态存储到特定的存储介质中的过程反序例化是将特定的有合者公质中数据重新构建对象的过程。 3、Java中线程在哪个包下…

Python基于逻辑回归分类模型、决策树分类模型、随机森林分类模型和XGBoost分类模型实现乳腺癌分类预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在当今医疗健康领域,乳腺癌作为威胁女性健康的主要恶性肿瘤之一,其早期诊断与精…

点击获取2024SIAL西雅国际食品展上海展后报告

随着2024年SIAL 西雅展(上海)的圆满落幕,我们不仅见证了一场食品与饮料行业的国际盛会,更是感受到了上海这座城市独有的魅力与活力。在这里,我们回顾了上海展的辉煌成就,同时,我们也满怀期待地展…

Hadoop版本演变、分布式集群搭建

Hadoop版本演变历史 Hadoop发行版非常的多,有华为发行版、Intel发行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP),这些发行版都是基于Apache Hadoop衍生出来的。 目前Hadoop经历了三个大的版本。 hadoop1.x:HDFSMapReduce hadoop2.x…

# [0628] Task04 DQN 算法及进阶

easy-rl PDF版本 笔记整理 P6 - P8 joyrl 比对 补充 P7 - P8 相关 代码 整理 待整理 !! 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链接: https://pan.baidu.com/s/1i…

C++笔记:实现一个字符串类(构造函数、拷贝构造函数、拷贝赋值函数)

实现一个字符串类String&#xff0c;为其提供可接受C风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。 声明依赖文件 其中ostream库用于打印标准输入输出&#xff0c;cstring库为C风格的字符串库 #include <iostream> #include <cstring> 声明命…