GPU 在训练大模型的过程中暂停

GPU停止工作现象

在这里插入图片描述

GPU训练上一个模型用了5个小时,我在训练下一个模型的时候,发现GPU停止工作了。
虽然GPU显存占用了24G,但是GPU没有运行任何数据。
基本也可以排除是报错原因,首先训练已经启动了,已经训练了一批数据,而且现在显存还是处于占用状态。

我猜测应该是长时间运行,导致温度过高,GPU停止工作。毕竟之前已经连续运行了很长一段时间了。

使用下述命令,查看GPU的温度:

nvidia-smi -q -d temperature

输出信息:

==============NVSMI LOG==============

Timestamp                                 : Mon May 12 08:52:44 2025
Driver Version                            : 560.35.05
CUDA Version                              : 12.6

Attached GPUs                             : 1
GPU 00000000:01:00.0
    Temperature
        GPU Current Temp                  : 87 C
        GPU T.Limit Temp                  : N/A
        GPU Shutdown Temp                 : 98 C
        GPU Slowdown Temp                 : 95 C
        GPU Max Operating Temp            : 93 C
        GPU Target Temperature            : 84 C
        Memory Current Temp               : N/A
        Memory Max Operating Temp         : N/A

以下是对GPU温度相关信息的解释:

  • Timestamp: 显示查询的时间戳,即2025年5月12日星期一08:49:17。
  • Driver Version: 显示当前安装的NVIDIA驱动版本为560.35.05。
  • CUDA Version: 显示当前支持的CUDA版本为12.6。

关于连接的GPU的信息:

  • Attached GPUs: 表示系统中连接了1个GPU。
  • GPU 00000000:01:00.0: 这里列出了具体的GPU信息。

对于该GPU的温度细节:

  • GPU Current Temp: 当前GPU的核心温度是87摄氏度。这是一个需要注意的数值,因为这个温度已经相当高。
  • GPU T.Limit Temp (GPU目标温度): N/A(未提供),这可能意味着没有设置特定的目标温度或者工具无法读取这一信息。
  • GPU Shutdown Temp (GPU关机温度): 98摄氏度。当GPU温度达到这个值时,为了保护硬件免受损害,系统会自动关闭GPU。
  • GPU Slowdown Temp (GPU减速温度): 95摄氏度。如果GPU温度达到这个值,系统将开始降低GPU的工作频率以减少热量产生。
  • GPU Max Operating Temp (GPU最大工作温度): 93摄氏度。这是GPU在正常操作下允许的最高温度。
  • GPU Target Temperature: 84摄氏度。这是理想的操作温度或目标温度,当前温度(87摄氏度)略高于此值。
  • Memory Current Temp 和 Memory Max Operating Temp: 对于显存的当前温度和最大工作温度均为N/A,表明这些信息要么不适用,要么不可用。

GPU当前运行温度为87摄氏度,接近但尚未达到导致性能下降或自动关机的温度阈值。然而,考虑到最佳实践和硬件寿命,建议采取措施降低其工作温度,比如改善散热条件、确认风扇是否正常运作、确保环境温度适宜等。长期处于高温状态下可能会缩短GPU的使用寿命,并影响性能。

应对方案 sleep

在做这种批量运行的模型训练的时候,可以在上一个模型训练完成之后,休眠一段时间,让GPU降温。
pipeline1.sh 是我写的一个大模型批量训练的脚本:

bash pipeline1.sh Qwen/Qwen2.5-7B-Instruct qwen dataset_name1 > logs/qwen_dataset_name1_pipeline1.log 2>&1

sleep 1200

bash pipeline1.sh Qwen/Qwen2.5-7B-Instruct qwen dataset_name2 > logs/qwen_dataset_name2_pipeline1.log 2>&1

每一个模型训练之后,都休息1200秒

温度检查的脚本:

下述的解决方案更实用,GPU温度降低到某个值之后,才开始下一个模型训练:

# 上一个模型训练

while [ $(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader) -gt 70 ]; do
  sleep 60
done
# GPU 温度降至 70°C 以下后再启动下一作业

# 下一个模型训练

chatgpt的回答

概览

通过硬件和软件层面的综合优化,你可以有效降低 GPU 的运行温度并避免长时间训练过程中的意外停机。主要策略包括:

  1. 优化机箱和环境气流(增设或重定位风扇、清理灰尘、更换导热硅脂,甚至采用水冷方案);
  2. 利用 NVIDIA 工具设置功率和温控上限(开启常驻模式、设置功率/温度限制、使用动态风扇曲线);
  3. 在训练管道中降低持续峰值负载(混合精度训练、梯度累积、按需冷却停顿);
  4. 实施实时温度监控与自动化作业控制(脚本或 AI 驱动的散热管理),以防止热降频或自动关机。

1. 改善物理散热与气流

1.1 优化机箱气流

  • 在机箱前部/底部安装进风风扇,后部/顶部安装出风风扇,形成前进后出的气流路径,将热空气快速排出。

1.2 定期清洁与维护

  • 定期开箱清理灰尘,用压缩空气清理风扇叶片和散热鳍片;
  • 每隔 1–2 年更换一次 GPU 导热硅脂,以恢复散热效率。

1.3 考虑水冷方案

  • 对于持续高负载场景,可选用一体式封闭水冷(AIO)或定制水冷系统,有效将 GPU 温度控制在低于风冷极限的水平。

2. 利用 NVIDIA 软件控制

2.1 开启常驻模式

保持驱动常驻,可避免每次作业重启时自定义功率和温度设置被重置:

sudo nvidia-smi -pm ENABLED

2.2 限制功率上限

降低功耗可显著减少热量输出,例如将功率上限设为 250W:

sudo nvidia-smi -i 0 -pl 250

2.3 设置目标温度与风扇曲线

通过驱动将温控目标设为 80°C,接近时风扇自动提速:

nvidia-smi --gpu-target-temp=80

3. 训练管道优化

3.1 采用混合精度与梯度累积

  • 使用 NVIDIA AMP(自动混合精度)可降低显卡计算强度;
  • 通过梯度累积在不改变全局 batch 大小的前提下,分批次微调,进一步降低持续功耗与热量。

3.2 安排冷却间歇

在连续训练作业间插入短暂休息,并在重启前检测温度:

while [ $(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader) -gt 70 ]; do
  sleep 60
done
# GPU 温度降至 70°C 以下后再启动下一作业

4. 主动监控与智能调控

4.1 实时监控脚本

  • 使用简单脚本或监控系统(如 Prometheus、Ganglia)记录温度,一旦超阈值自动降频或暂停作业,避免无声停机。

4.2 AI 驱动的散热管理

  • 部分前沿系统可预测温度峰值,动态调节风扇转速或水泵功率,实现更高效的散热保护。

5. 考虑云端或专业机房

如本地散热始终受限,可将大规模训练迁往配备工业级空调和电力管理的 GPU 云实例,从而彻底摆脱硬件散热瓶颈。

推荐阅读

如果微调过程中程序崩溃了,如果你使用的是 llamafactory微调,建议你阅读下述文章:
llamafactory SFT 从断点恢复训练

### YOLOv5 训练过程中的暂停与继续机制 YOLOv5 的训练框架设计考虑到了长时间运行的任务可能会遇到的各种情况,因此提供了较为完善的断点续训功能[^1]。 #### 配置环境 为了确保能够顺利实现训练暂停和恢复,在开始之前需确认已安装好官方推荐版本的所有依赖库,并配置好了 CUDA 和 cuDNN 环境以便利用 GPU 加速计算性能。此外,还需下载对应版本的预训练权重文件作为初始化参数。 #### 解决方法概述 当希望中途停止当前正在进行中的模型训练并能在未来某个时间点重新启动该进程时,可以采取如下措施: ##### 设置需要接续训练的结果 在执行 `train.py` 脚本前,通过命令行参数指定保存检查点(checkpoint)的位置以及频率。这允许程序定期自动备份最新的网络状态到磁盘上,从而使得后续可以从最近一次保存的状态加载数据来继续未完成的工作。 ```bash python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml --weights yolov5s.pt --save-period 1 ``` 上述命令中 `--save-period 1` 表示每轮 epoch 后都会创建一个新的 checkpoint 文件用于可能发生的中断后的恢复工作。 ##### 修改训练代码以支持从checkpoint恢复 为了让训练脚本能识别是否存在先前已经存在的 checkpoint 并从中读取必要的信息来进行续训,则可以在调用 `train()` 函数之前加入一段逻辑判断是否有可用的历史记录存在。如果有,则直接载入这些历史数据;如果没有则按照常规流程新建一个全新的会话。 ```python from pathlib import Path import torch resume = str((Path('runs/train/exp') / 'last.pt').resolve()) # 自定义路径指向最后一个epoch产生的checkpoint if Path(resume).exists(): ckpt = torch.load(resume, map_location='cpu') else: resume = '' # 将resume变量传递给train函数内部处理... trainer.train(data=coco_data, weights=yolov5_weights, epochs=total_epochs, resume=resume) ``` 这样做的好处在于即使因为某些原因导致训练突然终止(比如电源故障),只要机器重启后再次运行相同的 Python 命令即可无缝衔接之前的进度而无需重头再来一遍整个迭代周期。 #### 工作原理简介 YOLOv5 实现这一特性的关键是依靠 PyTorch 提供的一套 API 来管理模型参数及其优化器的状态字典(state_dict),并通过序列化的方式将其持久化存储于本地硬盘之中形成所谓的 checkpoints 。每当满足一定条件(如达到设定的时间间隔或完成了特定数量批次的数据处理)就会触发一次这样的存档动作。而在下一轮次准备就绪之时再反向解析回内存空间内重建起完整的上下文环境,进而实现了真正意义上的“热插拔”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieshenai

为了遇见更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值