最近使用新购买的服务器做训练(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")

如有错误欢迎指正

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐