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

本文介绍了如何使用Python库pynvml监控NVIDIA显卡,自动检测并选择剩余显存最多的GPU进行模型训练,避免手动指定GPU导致的不便。作者提供了基础用法和高级教程,包括设置显卡工作模式以及在程序中集成自动选择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 * 1024
    
    
    pynvml.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).gpu
        gpuMemoryRate = pynvml.nvmlDeviceGetUtilizationRates(handle).memory
    
        print("第 %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     # WDDM
        gpuMode = 1     # TCC
        pynvml.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 pynvml
    pynvml.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)  # 单位GB
            if memory_free > max_free_mem:
                gpu_id = i
                max_free_mem = memory_free
        device = 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 device


available_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信息

<think>我们正在讨论如何在终端中停止正在运行的模型训练机器学习/深度学习)。用户的问题非常明确:他们想知道在终端中如何停止一个正在训练中的模型。分析问题:模型训练通常是通过运行一个Python脚本(或其他语言)启动的,该脚本会持续运行直到完成指定训练轮数(epochs)或达到停止条件。但有时用户需要手动提前终止训练,例如发现模型性能不再提升、需要修改代码或释放计算资源等情况。解决方案:在终端中停止正在运行的进程,最直接的方法是使用键盘快捷键或命令行工具发送中断信号。常见方法:1.**使用键盘快捷键**:在运行训练脚本的终端窗口中,按下`Ctrl+C`组合键。这会发送一个`SIGINT`(中断信号)给正在运行的进程,通常会导致进程终止。这是最常用的方法。2.**使用命令行工具**:-如果训练进程在后台运行,或者用户打开了多个终端,可以使用`ps`命令查找进程ID(PID),然后用`kill`命令终止进程。-步骤:a.查找进程:在终端中运行`psaux|grep你的脚本名`(例如`psaux|greptrain.py`)b.找到对应的进程ID(PID)c.使用`kill-9PID`强制终止进程(`-9`表示发送`SIGKILL`信号,强制终止)3.**使用任务管理器工具**:如`htop`或`top`,可以可视化地查看进程并终止。注意事项:-使用`Ctrl+C`通常可以安全终止进程,因为Python可以捕获`SIGINT`信号并执行一些清理操作(如保存检查点)。但是,如果程序没有处理该信号,可能会直接退出而不保存当前状态。-使用`kill-9`是强制终止,不会给程序清理的机会,可能会导致数据丢失(如未保存的模型权重)。因此,建议先尝试`Ctrl+C`或`killPID`(不带`-9`),给程序一个优雅退出的机会。针对深度学习框架(如TensorFlow/PyTorch)的训练:-这些框架通常会在每个epoch结束后保存检查点(checkpoint),所以即使使用`Ctrl+C`终止,通常也能保存最近一次的模型状态。-有些训练脚本会设置信号处理器(signalhandler)来捕获`SIGINT`信号,并在终止前保存模型。示例代码(如何在Python中捕获信号进行优雅退出):用户可以在自己的训练脚本中加入以下代码,以便在收到`SIGINT`时保存模型并退出:```pythonimportsignalimportsysdefsignal_handler(sig,frame):print('收到中断信号,正在保存模型并退出...')#在这里保存模型#例如:torch.save(model.state_dict(),'interrupted_model.pth')sys.exit(0)signal.signal(signal.SIGINT,signal_handler)```这样,当用户按下`Ctrl+C`时,程序会先执行`signal_handler`函数,保存模型后再退出。总结:在终端中停止训练的最简单方法是按下`Ctrl+C`。如果进程在后台,则使用`ps`和`kill`命令。为了数据安全,建议在训练脚本中实现信号处理逻辑。相关问题:根据用户的问题,我们可以生成一些相关问题,帮助用户更深入地理解。</think>### 如何在终端停止模型训练机器学习/深度学习训练过程中,需要停止正在运行的训练任务时,可通过以下方法实现: #### 一、常规中断方法 1. **直接中断(推荐)** 在运行训练命令的终端窗口中,按 `Ctrl + C` 组合键。这是最常用的方法,会发送 `SIGINT` 信号终止进程。 **效果**: - 立即停止训练 - 部分框架(如PyTorch)会自动保存当前检查点(checkpoint) - 终端会显示 `KeyboardInterrupt` 提示 2. **后台进程终止** 若训练在后台运行(使用 `&` 或 `nohup`): ```bash # 查找进程ID ps aux | grep "your_train_script.py" # 终止进程(示例) kill -9 12345 # 12345替换为实际PID ``` #### 二、框架特定方案 1. **PyTorch 优雅退出** 在代码中添加信号处理逻辑,实现安全退出: ```python import signal import sys def handler(signum, frame): print("保存检查点并退出...") torch.save(model.state_dict(), "interrupt_checkpoint.pt") sys.exit(0) signal.signal(signal.SIGINT, handler) ``` 2. **TensorFlow/Keras** 使用 `Callback` 实现中断后自动保存: ```python class InterruptCallback(tf.keras.callbacks.Callback): def on_train_batch_end(self, batch, logs=None): if <停止条件>: self.model.stop_training = True self.model.save("interrupt_model.h5") ``` #### 三、服务器环境注意事项 1. **GPU资源释放** 中断后需确认GPU内存释放: ```bash nvidia-smi # 查看GPU进程 kill -9 <PID> # 清理残留进程 ``` 未释放的GPU进程可能导致后续训练失败[^4]。 2. **终端复用工具** 若使用 `tmux` 或 `screen`: ```bash tmux attach -t session_name # 进入会话 Ctrl+C # 在会话内中断 ``` > **重要提示**: > 直接强制终止(`kill -9`)可能导致模型损坏,建议优先使用 `Ctrl+C` 或代码中的安全退出逻辑。训练关键任务时,应设置定期保存检查点的回调函数[^1]。 --- ### 相关问题 1. 如何在模型训练中实现自动定期保存检查点(checkpoint)? 2. 终端中断训练后,如何从上次保存的检查点恢复训练? 3. 服务器上出现 GPU 内存未释放的问题该如何解决? 4. 如何监控深度学习训练过程中的资源占用(GPU/内存)? 5. 使用 `tmux` 或 `screen` 管理长时间训练任务有哪些最佳实践? [^1]: 在深度学习训练模型过程中使用GPU加速 [^4]: 租服务器训练深度学习模型
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值