【深度学习】服务器炼丹代码配置、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.mzph.cn/web/36140.shtml

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

相关文章

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先,导入了 NumPy 库,并将其简称为 np 。要知道,NumPy 乃是用于科学计算的关键库,作用非凡。接着,从 mindspore.dataset 当中导入了 vision 模块。此外,还从 mindspore.dataset 里引…

小阿轩yx-Nginx 网站服务

小阿轩yx-Nginx 网站服务 由俄罗斯的 lgor Sysoev 开发其稳定、高效的特性逐渐被越来越多的用户认可 Nginx 服务基础 Nginx (发音为[engine x])专为性能优化而开发 最知名的优点 稳定性低系统资源消耗以及对 HTTP 并发连接的高处理能力(单台物理服务器可支持 30000~50000个…

抗击.michevol勒索病毒:保障数据安全的新策略

导言: 在今天高度互联的数字化环境中,数据安全面临着越来越复杂和普遍的威胁,勒索病毒如.michevol已成为了用户和企业普遍面临的风险。本文91数据恢复将探讨.michevol勒索病毒的特点、感染方式以及创新的防御策略,旨在帮助读者更…

车载双向认证框架设计

最近工作需要,手写了一个双向认证库,可以用在Java、Android上,不限于PC/手机、车载平台。首先我们来看看双向认证的原理机框架设计思路,最后会给出下载链接大家可以体验或者源码参考。 因为可以和FlexNet网络库(参考我…

mac安装navicate

1.下载好之后点击安装包安装 2.一般情况下会提示安全性什么的,点击允许即可,然后会出现如下界面,点击安装即可. 3.点击打开 4.然后出现如下界面,点击Enter 5.将安装包拖入即可. 6.等待安装即可 7.安装完成后会在启动台看到Navicat16 的图标 8.然后打开软件界面如下:

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…

树莓派Pico

树莓派Pico是树莓派基金会推出的一款基于RP2040微控制器的微型计算机板,它是专为需要高性能微控制器的应用场景设计的,特别适合于需要实时控制、低功耗和小型化解决方案的项目。以下是树莓派Pico的详细介绍: ### 核心特点: - **基…

统信系统实战(2):安装redis

在系统中未发现redis,需要安装。 网上资料上说需要去redis官网下载,但是发现不管是github账号还是自己注册的sso账号,都各种提示有问题。 继续找资料,发现可以直接通过下载链接下载,指令如下: wget http://download.redis.io/releases/redis-6.0.6.tar.gz 成功下载,…

仓颉开发入门初体验

作者:黄林晴 顺便吆喝一声,如果你计算机、软件工程、电子等相关专业本科及以上学历,欢迎来共事。前端/后端/测试均可投,技术大厂。 前言 在刚刚召开的华为开发者大会(HDC 2024)上,华为内部研…

如何在Java中使用Levenshtein距离实现字符串相似度匹配

在许多应用中,我们需要根据用户输入的问题找到最匹配的已知问题。Levenshtein距离(编辑距离)是一个强大的工具,可以帮助我们衡量两个字符串之间的差异,并进一步计算它们的相似度。本文将使用一个具体的例子来展示如何在…

从架构设计的角度分析ios自带网络库和AFNetworking

总结(先说明文章分析出的一些‘认知’) 从本文中,我们可以总结出一些框架设计上的“认知”: 对于通用的常规配置信息方面的设计,我们可以通过定义一个“类似于NSURLSessionConfiguration、NSURLRequest”的类来完成设…

【算法专题--栈】后缀表达式求值 -- 高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路 ⭐案例图解 四、总结与提炼 五、共勉 一、前言 后缀表达式求值 这道题,可以说是--栈专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中&…

什么是ArchiMate?有优缺点和运用场景?

一、什么是ArchiMate? ArchiMate是一种由The Open Group发布的企业级标准,它是一种整合多种架构的可视化业务分析模型语言,也属于架构描述语言(ADL)。ArchiMate主要从业务、应用和技术三个层次(Layer)&…

QT在visual studio环境打开控制台窗口

明确需求 在VS环境中开发QT应用,有时遇到BUG想看日志,但是默认VS环境没有显示控制台窗口可看日志。 解决方法 对工程名单击右键。 点击属性,在打开界面按照如下图操作。 设置完成后弹出的控制台窗口如下图。

[Cloud Networking] VLAN

1 为什么需要 VLAN(Virtual Local Area Network) VLAN是一个逻辑网络,VLAN将设备/用户进行逻辑分组,VLAN需要在Switch上创建。为什么需要这样呢?为何不能所有设备都在同一个网络? 如下网络,如果设备过多,…

【日记】怎么上了一天班饭都没得吃(659 字)

正文 今天算是混得最惨的一天了。 下午开始,柜面主管出差,她找了个代班,好家伙,代班直接不下来,于是整个营业室就只有我一个人了。所有客户逮着我一个人薅。我才下来一个月啊…… 明天她还不回来,要下周一&…

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏: 1、制造一面砖块组成的墙 在关卡中放置一个cube,放这地面上,将其转换成蓝图类,改名BP_Cube,更换砖块的贴图,按住alt键进行拷贝,堆出一面墙,复制出来的会很多,全选移动…

报餐小程序可以运用在饭堂的哪方面

随着科技的快速发展,智能化、信息化的管理方式逐渐渗透到我们日常生活的方方面面。在饭堂管理中,报餐小程序的应用为传统的餐饮管理方式带来了革命性的变革。本文将探讨报餐小程序在饭堂管理中的应用及其带来的优势。 一、报餐小程序的基本功能 报餐小程…

数据资产管理的艺术:构建智能化、精细化的数据资产管理体系,从数据整合、分析到决策支持,为企业提供一站式的数据资产解决方案,助力企业把握数字时代的新机遇

一、引言 在数字化浪潮席卷全球的今天,数据已经成为企业最重要的资产之一。如何高效、安全地管理这些海量数据,从中提取有价值的信息,并将其转化为决策支持,是每个企业都必须面对的挑战。本文将探讨数据资产管理的艺术&#xff0…

新风口不再是直播,云微客带你领略短视频矩阵的魅力

只要你细心观察,就能发现很多品牌都在做短视频矩阵,正是凭借大量的短视频矩阵账号带来的流量曝光,这些品牌才能覆盖数以万计的客户人群,才能每天不断地产生新订单。 有很多人觉得矩阵不就是多注册账号吗?其实短视频矩阵…