训练模型过程中优雅的指定GPU

目前训练模型大部分在单机多卡的环境下,我们通常会指定一个GPU来训练模型。在不指定GPU情况下,默认使用GPU0来训练,但是很不巧GPU0被别人占了一半显存,导致OOM错误。每次跑模型都要去看下哪张卡显存最大,然后再来修改代码,指定GPU,是不是超级烦人呢!😶‍🌫️,今天就介绍一个每次都由程序自动选择剩余最大的显存的GPU来训练。

1. Quick Start

  • step1: 安装依赖包
    安装管理NVIDIA显卡的python依赖包pynvml
    pip install nvidia-ml-py
    
  • 使用pynvml监控GPU
    import psutil
    import pynvml #导包UNIT = 1024 * 1024pynvml.nvmlInit() #初始化
    gpuDeriveInfo = pynvml.nvmlSystemGetDriverVersion()
    print("Drive版本: ", str(gpuDeriveInfo, encoding='utf-8')) #显示驱动信息gpuDeviceCount = pynvml.nvmlDeviceGetCount()#获取Nvidia GPU块数
    print("GPU个数:", gpuDeviceCount )for i in range(gpuDeviceCount):handle = pynvml.nvmlDeviceGetHandleByIndex(i)#获取GPU i的handle,后续通过handle来处理memoryInfo = pynvml.nvmlDeviceGetMemoryInfo(handle)#通过handle获取GPU i的信息gpuName = str(pynvml.nvmlDeviceGetName(handle), encoding='utf-8')gpuTemperature = pynvml.nvmlDeviceGetTemperature(handle, 0)gpuFanSpeed = pynvml.nvmlDeviceGetFanSpeed(handle)gpuPowerState = pynvml.nvmlDeviceGetPowerState(handle)gpuUtilRate = pynvml.nvmlDeviceGetUtilizationRates(handle).gpugpuMemoryRate = pynvml.nvmlDeviceGetUtilizationRates(handle).memoryprint("第 %d 张卡:"%i, "-"*30)print("显卡名:", gpuName)print("内存总容量:", memoryInfo.total/UNIT, "MB")print("使用容量:", memoryInfo.used/UNIT, "MB")print("剩余容量:", memoryInfo.free/UNIT, "MB")print("显存空闲率:", memoryInfo.free/memoryInfo.total)print("温度:", gpuTemperature, "摄氏度")print("风扇速率:", gpuFanSpeed)print("供电水平:", gpuPowerState)print("gpu计算核心满速使用率:", gpuUtilRate)print("gpu内存读写满速使用率:", gpuMemoryRate)print("内存占用率:", memoryInfo.used/memoryInfo.total)"""# 设置显卡工作模式# 设置完显卡驱动模式后,需要重启才能生效# 0 为 WDDM模式,1为TCC 模式gpuMode = 0     # WDDMgpuMode = 1     # TCCpynvml.nvmlDeviceSetDriverModel(handle, gpuMode)# 很多显卡不支持设置模式,会报错# pynvml.nvml.NVMLError_NotSupported: Not Supported"""# 对pid的gpu消耗进行统计pidAllInfo = pynvml.nvmlDeviceGetComputeRunningProcesses(handle)#获取所有GPU上正在运行的进程信息for pidInfo in pidAllInfo:pidUser = psutil.Process(pidInfo.pid).username()print("进程pid:", pidInfo.pid, "用户名:", pidUser, "显存占有:", pidInfo.usedGpuMemory/UNIT, "Mb") # 统计某pid使用的显存pynvml.nvmlShutdown() #最后关闭管理工具
    

2. Advanced Tutorial

使用 pynvml 写一个自动化脚本,使其在程序开始时自动选择显存最大的GPU

def select_best_gpu():import pynvmlpynvml.nvmlInit()  # 初始化gpu_count = pynvml.nvmlDeviceGetCount()if gpu_count == 0:device = "cpu"else:gpu_id, max_free_mem = 0, 0.for i in range(gpu_count):handle = pynvml.nvmlDeviceGetHandleByIndex(i)memory_free = round(pynvml.nvmlDeviceGetMemoryInfo(handle).free/(1024*1024*1024), 3)  # 单位GBif memory_free > max_free_mem:gpu_id = imax_free_mem = memory_freedevice = f"cuda:{gpu_id}"print(f"total have {gpu_count} gpus, max gpu free memory is {max_free_mem}, which gpu id is {gpu_id}")return deviceavailable_device = select_best_gpu()# 方法1:直接通过os全局设置GPU
import os
if available_device.startswith("cuda"):os.environ['CUDA_VISIBLE_DEVICES'] = available_device.split(":")[1]# 方法2:在模型处指定
model = Model()   # 初始化模型
model.to(available_device)

注意:以上方法一定放到程序最开始处,否则指定GPU可能会失败,通常在import torch后,通过os指定GPU就会失败

3. REFERENCE

python查看gpu信息

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

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

相关文章

假期作业2

进程间的7种通信方式: 1、无名管道: 即没有名字的管道,是一个特殊的文件,并且存储在内存上,不在文件系统中展示。只能适用于亲缘进程间的通信,需要在fork之前将管道文件打开,创建子进程后&…

【成品论文30页】2024美赛C题完整1-4问完整解答+答疑服务+完整数据集代码

2024美赛C题 也包括心理和环境因素。理解这些因素对于运动员、教练和观众来说都至关重要,因为它们直接影响着比赛的结果和整体体验。 技术水平和体能因紊 网球比赛中得分的波动首先受到运动员的技术水平和体能因素的影响。技术水平高的运动员往往能够以更加精准和有…

UnityShader(十四)纹理

目录 前言: 单张纹理实现效果: 效果: 前言: 纹理最初的目的是用一张图片来控制模型的外观。使用纹理映射技术我们可以把一张图“贴”在模型表面,逐纹素(文素的名字是为了和像素进行区分)控制…

CentOS 7中搭建FTP文件共享服务器的完整步骤

CentOS 7中搭建FTP文件共享服务器的完整步骤 要求:设置不允许匿名用户登录,只允许本地用户登录,且将活动范围限制在其家目录。 系统环境: 服务器:172.20.26.167-CentOS7.6 客户端:172.20.26.24-CentOS7…

c语言游戏实战(8):飞机大作战

前言: 飞机大作战游戏是一种非常受欢迎的射击类游戏,玩家需要控制一架战斗机在屏幕上移动,击落敌机以获得分数。本游戏使用C语言编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前,我们需要先了…

泰克示波器(TBS2000系列)触发功能使用讲解——边沿触发

# Trigger区域 触发区域用于对触发功能进行配置。示波器的触发功能用于采集(Acquire)那些在瞬间出现的信号,便于我们分析观察,此时可以当做逻辑分析仪使用。触发区域按钮包括:menu、Level\Force Trig三个。 目录 1.1 …

leetcode121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目思路1思路2 题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计…

python爬虫6—高性能异步爬虫

如果有多个URL等待我们爬取,我们通常是一次只能爬取一个,爬取效率低,异步爬虫可以提高爬取效率,可以一次多多个URL同时同时发起请求 异步爬虫方式: 一、多线程、多进程(不建议):可以…

计算机科学导论(2)计算机如何存储音频

文章目录 0. 声音的物理特性1. 音频采集2. 模拟到数字转换(A/D转换)3. 编码和压缩4. 存储音频存储是指将声音信号转换为数字形式并保存在存储介质上的过程。这一过程涉及到声音的采集、模拟到数字的转换(A/D转换)、编码和最终存储。现代音频存储技术使得我们能够以高保真度…

HarmonyOS案例:摇杆游戏

本案例主要演示如何通过一系列的动画效果以及运算实现摇杆控制组件同步运动的功能,界面简陋无需在意。 欢迎大家的阅读和评价,也欢迎大佬们批评、指正,我将继续努力,奉上更加专业的、高效的代码案例。 import curves from ohos.c…

Objective-C中里氏替换原则

里氏替换原则是面向对象设计的基本原则之一,它指出子类对象可以在任何需要父类对象的地方使用,而不会产生意外的行为。 // 父类 interface Animal : NSObject - (void)sayHello; endimplementation Animal - (void)sayHello {NSLog("Animal says he…

一篇文章了解系统眼中的键盘--以一个简单的系统分析从按键的输入到字符的显示

键盘输入 实现使用的设备 intel架构32位CPU, 思路为嵌入式系统工程师,使用的操作系统是《30天自制操作系统》里面的系统进行讲解 硬件实现 按键 使用单片机等的引脚可以获取电平状态从而获得按键的状态(单片机是一种集成到一块硅片上构成的一个小而完善的微型计算机系统, 用…

每日OJ题_算法_模拟②_力扣495. 提莫攻击

目录 力扣495. 提莫攻击 解析代码 力扣495. 提莫攻击 495. 提莫攻击 难度 简单 在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。 当提莫攻击艾希&#xff0c…

分享一个WPF项目

最近在学习WPF开发方式,找到一些项目进行拆解学习;本位主要分享一个WPF项目,叫做WPFDevelopers,在git上大约有1.3K星,话不多说,先看看效果: 这个项目开发可以编译启动后直接查看样例、Xaml、Cha…

LeetCode:LCP 24. 数字游戏(对顶堆求中位数 Java)

目录 LCP 24. 数字游戏 题目描述: 实现代码与解析: 原理思路: LCP 24. 数字游戏 题目描述: 小扣在秋日市集入口处发现了一个数字游戏。主办方共有 N 个计数器,计数器编号为 0 ~ N-1。每个计数器上分别显示了一个数…

《计算机网络简易速速上手小册》第9章:物联网(IoT)与网络技术(2024 最新版)

文章目录 9.1 IoT 架构与通信协议 - 打造智能世界的秘诀9.1.1 基础知识9.1.2 重点案例:使用 Python 和 MQTT 实现智能家居照明系统准备工作Python 脚本示例发布者(灯光控制)订阅者(灯光状态接收): 9.1.3 拓…

快速Diff算法-Vue3

快速Diff算法 快速 Diff 算法在实测中性能最优。它借鉴了文本 Diff 算法中的预处理思路,先处理新旧两组子节点中相同的前置节点和相同的后置节点。当前置节点和后置节点全部处理完毕后,如果无法简单地通过挂载新节点或者卸载已经不存在的节点来完成更新…

AD24-Class、飞线、PCB Nets的管理及添加、层的管理

一、Class 1、Class介绍 2、Class添加与显示 ①添加 ②显示通过Panels-PCB,即可将创建的类显示再左上方窗口 3、Class的编辑管理 ①概述 ②颜色更改 二、飞线 1、概述 2、 飞线的打开、关闭 打开:Alt左上角滑动 N:可以针对性的显示和隐…

Linux:使用grep和more索日志内容排查Bug

grep # 搜索文件内容显示行号 grep -n "要搜索的关键词" 文件名more 快捷键: 空白键(space)下一页b键 (back)上一页 示例 # 从第 20 行开始显示文档内容 more 20 文件名参考 linux查看命令 more 、les…

深度学习环境配置:Anaconda 安装和 pip 源

conda是一种通用包管理系统,与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。 Anaconda则是一个打包的集合,里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,就是把很多常用…