高性能服务器总是重启的原因记录
摘要:通过事件查看器分析发现是系统意外重启(事件ID41),主要原因可能是电源功率不足或CPU过热。在训练时CPU占用率达100%会触发过热保护,通过限制CPU使用率(设置环境变量和线程数)暂时解决了重启问题。彻底解决还需排查电源供电能力和散热系统。文中提供了Windows日志分析方法和Python/TensorFlow限制CPU使用的代码示例。
最近使用新购买的服务器做训练(python)总是会遇到重启的问题,并且其训练速度和效果也比不上一般的工作站。经过和AI分析之后,目前感觉解决了这个问题。(欢迎讨论,小白记录贴,不是很懂计算机方面的知识)
服务器配置:
-
主板:GIGABYTE M271-CE1-00(支持双路EPYC)
-
CPU:2× AMD EPYC 7763(每颗280W TDP,共560W)
-
GPU:A100(300-400W TDP)
服务器配置查找方法:
# 在PowerShell中运行
Get-WmiObject -Class Win32_ComputerSystem | Select-Object Model, Manufacturer
Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores
# 在CMD中运行
nvidia-smi
首先通过系统时间日志查找重启原因,方法如下:
打开事件查看器:
按 Win + R 键,输入 eventvwr.msc 然后回车
或者在开始菜单搜索"事件查看器"
查看关键日志:
在左侧面板展开 Windows 日志
重点查看:
系统:寻找重启前后的错误和警告
应用程序:寻找 NVIDIA 相关的错误
筛选关键事件:
在右侧点击"筛选当前日志"
在"<所有事件 ID>"中输入:41,1074,6006,6008,1001 这些ID分别代表:
41: 意外重启
6008: 异常关机
1001: Windows 错误报告
经过筛选发现基本上是41
事件ID 41的含义
事件ID 41意味着Windows在完全没有准备的情况下被强制重启了。这不是软件蓝屏,而是更底层的硬件问题。结合A100训练时重启的背景,可能性排序如下:
1. 电源问题(可能性最高)
-
电源功率不足:A100在训练峰值时功耗极大,如果电源额定功率不够,就会触发过功率保护而重启。
-
电源老化或故障:电源单元(PSU)本身出现问题,无法稳定供电。
-
电路过载:服务器所在的电路无法承受峰值电流。
2. 散热问题(可能性很高)
-
GPU过热:A100在训练时温度急剧上升,触发了硬件 thermal protection。
-
CPU或系统过热:整个系统散热不良。
3. 硬件故障
-
GPU显存ECC错误:多位ECC错误导致GPU被重置。
-
主板或电源接口问题。
极大可能是温度以及电源不稳定的原因。
然后再运行过程我发现每次出现重启基本上是因为CPU占用率达到了100%,此时温度的原因更明显。
1. CPU过热保护(可能性最高)
-
原因:双路AMD EPYC 7763(共128核)在100%负载时产生巨大热量:
-
每颗EPYC 7763 TDP为280W,两颗共560W
-
100%负载时实际功耗可能更高
-
散热系统无法及时散热,触发过热保护
-
2. 电源问题(可能性很高)
-
原因:CPU 100%负载时峰值功耗超出电源承载能力
-
即使不用GPU,双路EPYC 7763 + 1TB内存的峰值功耗也很可观
3. 主板VRM(电压调节模块)过热
-
原因:为两颗高端EPYC供电的主板供电模块过热
但是一时没有很好的办法,于是想办法在训练过程中限制CPU的使用率,以及限制单个用户的CPU使用率。目前来看没有再重启了。后续彻底解决还需排查。
并且限制CPU的使用率之后训练速度还神奇的升高了,更确认是主板温度过高导致降频运行了。
限制方法:
import os
import torch
import torch.nn as nn
# 限制CPU使用
os.environ['OMP_NUM_THREADS'] = '64'
os.environ['MKL_NUM_THREADS'] = '64'
torch.set_num_threads(64)
# 您的训练代码在这里...
print(f"使用CPU核心数: {torch.get_num_threads()}")
# 模拟训练负载
model = nn.Linear(1000, 1000)
data = torch.randn(64, 1000)
for epoch in range(100):
output = model(data)
loss = output.mean()
loss.backward()
if epoch % 10 == 0:
print(f"Epoch {epoch}, Loss: {loss. Item():.4f}")
import os
import tensorflow as tf
import psutil
# ====== 精确选择88个核心 ======
total_cores = 128
cores_to_use = 88 # 2/3的核心
# 选择要使用的核心编号(这里选择前88个核心)
selected_cores = list(range(cores_to_use))
# 设置进程亲和性
try:
p = psutil.Process()
p.cpu_affinity(selected_cores)
print(f"进程已绑定到CPU核心: {p.cpu_affinity()}")
print(f"使用核心数量: {len(p.cpu_affinity())}")
except Exception as e:
print(f"设置CPU亲和性失败: {e}")
# TensorFlow线程配置
tf.config.threading.set_intra_op_parallelism_threads(cores_to_use)
tf.config.threading.set_inter_op_parallelism_threads(8)
print(f"TensorFlow配置: 内部并行线程={cores_to_use}, 外部并行线程=8")
如有错误欢迎指正
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)