跳到主要内容

MTDCGM 诊断指南

概述

Moore Threads Validation Suite(MTVS),即 MTDCGM Diagnostics,是 MTDCGM 提供的 GPU 诊断工具,由多个插件组成,涵盖部署检查、硬件诊断和压力测试。您可以在业务上线前检查系统健康状态,也可以在故障发生后辅助定位问题。MTVS 支持交互式和脚本式运行,并提供从基础环境检查到长时间压力测试的多个诊断级别。

如果故障正在发生,请先按照 MT GPU 故障排查指南保留现场信息,再返回本文运行 MTDCGM 诊断。

适用范围

MTDCGM 诊断适用于以下场景:

  • 在业务上线前验证系统环境和 GPU 状态;
  • 根据需要执行快速检查、深度诊断或长时间压力测试;
  • 通过交互模式手动诊断,或通过脚本模式集成集群调度和运维系统;
  • 在 GPU 作业失败前发现潜在问题,降低作业失败率和停机时间。
使用限制

以下场景不在 MTDCGM 诊断的适用范围内:

  1. 替代完整的现场故障排查和整机硬件诊断;
  2. 主动修复检测到的问题;
  3. 单独作为硬件返修、退换或节点重新上线的判定依据;
  4. 通过单次诊断结果排除间歇性故障。

前提条件

运行诊断前,请确认:

  • 使用 root 权限运行诊断;
  • PATH 包含 MTDCGM 命令路径,LD_LIBRARY_PATH 包含 MUSA 和 MTDCGM 动态库路径。配置方法参见 安装 MTDCGM
  • dcgmi 可以连接到正在运行的 mt-hostengine 或其他 MTDCGM 后台服务。

运行级别和测试

不同诊断级别包含的测试如下。以配备 8 块 S5000 GPU 的系统为例,r2、r3 和 r4 的参考时长分别约为 1 分钟、15 分钟和 30 分钟。

插件测试名称r1(Short)r2(Medium)r3(Long)r4(Extra Long)
Softwaresoftware
PCIe + MTLinkpcie
GPU Memorymemory
Targeted Stresstargeted_stress
Targeted Powertargeted_power
MTBandwidthmtbandwidth
Memory Stressmemtest

具体诊断时长取决于 GPU 数量、MUSA SDK 和固件版本、启用的插件及插件参数。请以目标环境中的实际运行时间为准;更换软件栈后应重新测量,不要直接沿用其他环境的时长。


快速入门

命令行参数

使用以下选项选择诊断对象、测试和输出方式:

短命令选项长命令选项参数说明
-g--groupgroupId指定要查询的设备组 ID
--hostIP/FQDN连接到指定的 IP 或 FQDN。对于 Unix 套接字,在文件名前加 unix:// 前缀。默认为 localhost
-h--helpgroupId显示帮助信息
-r--rundiag运行诊断。编号更高的测试包含其下所有测试:
1:快速(系统验证,System Validation)
2:中等(扩展系统验证,Extended System Validation)
3:长时间(系统硬件诊断,System HW Diagnostics)
4:扩展(更长时间的系统硬件诊断,Longer-running System HW Diagnostics)
-p--parameterstest_name.variable_name=variable_name设置本次运行诊断所需的参数
-i--gpuListentityId逗号分隔的待运行 GPU ID 列表
-v--verbose显示每个测试的信息和告警
--statsonfail仅在失败时输出统计文件
--debugLogFiledebug file记录诊断的日志文件,默认 mtvs.log
--statspath将插件统计信息写入指定路径
-d--debugLeveldebug level设置调试级别(NONE、FATAL、ERROR、WARN、INFO、DEBUG、VERB)。默认:DEBUG
-j--json以 JSON 格式输出诊断结果
--iterationsiterations明确诊断要执行的迭代次数(必须大于 0)

示例命令

测试和参数

以下命令指定 targeted_power 测试及其参数:

dcgmi diag -r targeted_power -p targeted_power.is_allowed=true\;targeted_power.target_power=300.0

迭代执行

使用 --iterations 设置测试套件的迭代次数:

dcgmi diag -r pcie --iterations 3

日志

默认日志保存在执行诊断命令或启动 mt-hostengine 的目录中。使用以下命令可以输出 JSON 格式的诊断结果:

dcgmi diag -r pcie -j
...
{
"category": "Integration",
"tests": [
{
"name": "pcie",
"results": [
{
"entity_group": "GPU",
"entity_group_id": 1,
"entity_id": 0,
"info": [
"GPU to Host bandwidth:\t\t13.53 GB/s",
"Host to GPU bandwidth:\t\t12.05 GB/s",
"bidirectional bandwidth:\t23.69 GB/s",
"GPU to Host latency:\t\t0.791 us",
"Host to GPU latency:\t\t1.201 us",
"bidirectional latency:\t\t1.468 us"
],
"status": "Pass"
}
],
"test_summary": {
"status": "Pass"
}
}
]
}
...

如何区分命令失败、测试失败和 Skip,参见 FAQ 中的“诊断和故障处理”


插件详情

MTVS 使用不同插件执行部署检查、硬件诊断和压力测试。下表概述各插件的主要用途:

插件主要用途
Deployment检查 MUSA 计算环境是否已准备就绪,以及 MTML 动态库能否正常加载
PCIe - GPU 带宽对主机与 GPU、GPU 与 GPU 之间的通信进行压力测试,并测量带宽与延迟
GPU Memory验证 GPU 显存的完整性和读写功能,检测硬件故障和显存损坏
Targeted Power使 GPU 功耗接近 TDP 并保持一段时间,验证 GPU 在功耗负载下能否正常工作
Targeted Stress使 GPU 保持指定的性能和压力水平,验证持续负载下的稳定性
Memtest使用多种测试模式检查 GPU 显存
MTBandwidth测量单台主机中 GPU 的通信带宽

以下各节进一步说明插件的测试内容、参数和失败条件。

Deployment 插件

Deployment 插件用于检查 MUSA 计算环境是否已准备就绪,以及 MTML 动态库能否正常加载。

前置条件

  • LD_LIBRARY_PATH 必须包含 MUSA 和 MTDCGM 的路径,可以执行如下命令:

    export LD_LIBRARY_PATH=/usr/local/musa/lib:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH=/usr/local/mtdcgm/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
  • 如果要使用 MTDCGM 的二进制文件,如 dcgmimt-hostengine,则可以配置 PATH 环境变量:

    export PATH=/usr/local/mtdcgm/bin:${PATH}

失败条件

出现以下情况时,插件运行失败:

  • 目标节点被操作系统阻塞(例如 cgroups)或当前用户缺乏读/写权限;
  • 无法加载 MTML 库 libmtml.so
  • 无法加载 MUSA 运行时库。

PCIe - GPU 带宽插件

PCIe 插件对主机与 GPU、GPU 与 GPU 之间的通信进行压力测试。测试会在写入数据时检查 P2P 正确性、错误和重放,并测量带宽与延迟。

子测试

插件包含多项带宽和延迟测试。子测试按 pinned/unpinned(页锁定/非页锁定)或 P2P enabled/P2P disabled(启用 P2P/禁用 P2P)成对配置,每对测试的内容相同。Pinned/unpinned 表示在主机与 GPU 之间复制数据时,分别使用页锁定或非页锁定内存。

MTLink 可用时,GPU 之间通过 MTLink 通信;未启用 MTLink 时,GPU 之间通过 PCIe 通信。

每个子测试都有一个标签(tag),用于指定配置参数和识别输出统计信息。

下表中,“子测试标签”列列出各子测试的标签;“配置”列说明子测试使用 pinned/unpinned 内存,或启用/禁用 P2P。P2P enabled/P2P disabled 测试分别启用或禁用 GPU 之间不经过 PCIe 总线的直接读写。

子测试标签配置说明
h2d_d2h_single_pinnedPinnedDevice <-> Host Bandwidth,一次测试一个 GPU
h2d_d2h_single_unpinnedUnpinnedDevice <-> Host Bandwidth,一次测试一个 GPU
h2d_d2h_latency_pinnedPinnedDevice <-> Host Latency,一次测试一个 GPU
h2d_d2h_latency_unpinnedUnpinnedDevice <-> Host Latency,一次测试一个 GPU
p2p_bw_p2p_enabledP2P EnabledDevice <-> Device Bandwidth,一次测试一组 GPU(2 个)
p2p_bw_p2p_disabledP2P DisabledDevice <-> Device Bandwidth,一次测试一组 GPU(2 个)
p2p_bw_concurrent_p2p_enabledP2P EnabledDevice <-> Device Bandwidth,直接相邻的两个 GPU 同时做带宽测试(dindex/2index/2 + 1
p2p_bw_concurrent_p2p_disabledP2P DisabledDevice <-> Device Bandwidth,直接相邻的两个 GPU 同时做带宽测试(dindex/2index/2 + 1
1d_exch_bw_p2p_enabledP2P EnabledDevice <-> Device Bandwidth,每个 GPU 向比自己下标 +1 的 GPU(l2r)或下标 -1 的 GPU(r2l)同时做带宽测试
1d_exch_bw_p2p_disabledP2P DisabledDevice <-> Device Bandwidth,每个 GPU 向比自己下标 +1 的 GPU(l2r)或下标 -1 的 GPU(r2l)同时做带宽测试
p2p_latency_p2p_enabledP2P EnabledDevice <-> Device Latency,一次测试一组 GPU(2 个)
p2p_latency_p2p_disabledP2P DisabledDevice <-> Device Latency,一次测试一组 GPU(2 个)

PCIe 插件支持以下全局参数:

参数类型默认值说明
test_pinnedBoolTrue是否包含锁定内存子测试
test_unpinnedBoolTrue是否包含非锁定内存子测试
test_p2p_onBoolTrue是否以启用 P2P 运行子测试
test_p2p_offBoolTrue是否以禁用 P2P 运行子测试
max_pcie_replaysFloat80.0插件运行期间每块 GPU 的最大 PCIe 重放次数

PCIe 插件支持以下子参数:

参数默认值适用子测试说明
min_bandwidth0h2d_d2h_single_pinned、h2d_d2h_single_unpinned、h2d_d2h_concurrent_pinned、h2d_d2h_concurrent_unpinned通过测试所需的最小带宽(GB/s)
max_latency100,000h2d_d2h_latency_pinned、h2d_d2h_latency_unpinned最大延迟(微秒)

示例命令

运行 PCIe 诊断:

dcgmi diag -r pcie

运行 PCIe 诊断,并设置 H2D 和 D2H 使用 pinned memory 时的最小带宽:

dcgmi diag -r pcie -p pcie.test_pinned=true\;pcie.h2d_d2h_single_pinned.min_bandwidth=50

GPU Memory 插件

概述

GPU Memory 插件用于验证 GPU 显存的完整性和功能,检测硬件故障以及显存损坏问题。

测试组成部分

Memory 诊断插件执行以下主显存测试:

  1. 目标:测试 GPU 显存分配和读写操作。
  2. 操作:
    • 默认分配 GPU 显存的 75%;
    • 使用 MUSA Kernel 向显存写入指定 pattern;
    • 读回数据并验证;
    • 依次使用 5 组测试 pattern:0x00、0xAA、0x55、0xFF、0x00。

支持的参数

GPU Memory 插件支持以下全局参数:

参数类型默认值说明
is_allowedBooltrue是否运行此测试

主显存测试支持以下参数:

参数类型默认值说明
minimum_allocation_percentageDouble75.0要分配的 GPU 显存最小百分比(0-100)

示例命令

运行基础 Memory 测试:

dcgmi diag -r memory -p memory.is_allowed=true

设置 Memory 测试的最小显存分配比例:

dcgmi diag -r memory -p memory.minimum_allocation_percentage=50

失败条件

  1. 显存分配失败(DCGM_FR_MEMORY_ALLOC):无法分配所需的最小显存;
  2. 显存不匹配(DCGM_FR_MEMORY_MISMATCH):写入数据与读回数据不一致。

Targeted Power 插件

概述

Targeted Power 属于 3 级及以上诊断。该插件使 GPU 功耗接近 TDP 并保持一段时间,用于验证 GPU 在功耗负载下能否正常工作。

测试组成部分

该插件依赖 MUSA,并使用根据经验确定的 GEMM 矩阵大小,在每块 GPU 上同时持续执行大型矩阵乘法,使 GPU 保持繁忙并维持高功耗。

支持的参数

Targeted Power 插件支持以下全局参数:

参数类型默认值说明
test_durationDouble120.0持续时间(秒)
sustain_durationDouble120.0达到目标功耗之后需要持续的时间(秒)
target_powerDoubleTDP - 1目标功耗(瓦)
target_power_min_ratioDouble75.0通过所需的目标功耗最小百分比
use_dgemmBoolTrue使用 64 位精度而非 32 位
is_allowedBoolFalse是否运行此测试

示例命令

运行 10 分钟的 Targeted Power 测试:

dcgmi diag -r targeted_power -p targeted_power.is_allowed=true\;targeted_power.test_duration=600.0

运行 3 级诊断,以及 5 分钟的 Targeted Power 测试:

dcgmi diag -r 3 -p targeted_power.is_allowed=true\;targeted_power.test_duration=300.0

运行 Targeted Power,并将目标功耗设置为 200 W:

dcgmi diag -r targeted_power -p targeted_power.is_allowed=true\;targeted_power.target_power=200.0

运行 4 级诊断,跳过 Targeted Power:

dcgmi diag -r 4 -p targeted_power.is_allowed=false

使用单精度用例运行 Targeted Power 测试:

dcgmi diag -r targeted_power -p targeted_power.is_allowed=true\;targeted_power.use_dgemm=false

失败条件

  • 如果测试期间的功耗未达到 target_power(默认为 TDP - 1)的 target_power_min_ratio(默认为 75%),测试失败。

Targeted Stress 插件

概述

Targeted Stress 属于 3 级及以上诊断。该插件持续调度矩阵运算并调整工作负载,使 GPU 保持指定的性能和压力水平。

该插件按指定性能目标施加压力,而不是使 GPU 始终以最大压力运行,从而在受控条件下验证 GPU 的持续负载稳定性。

测试组成部分

Targeted Stress 插件会执行以下操作:

  1. 矩阵乘法:使用 muBLAS 持续运行 GEMM(通用矩阵乘法),并根据配置在单精度(SGEMM)和双精度(DGEMM)之间交替。
  2. 性能控制:监测 GPU 的实际性能并调整工作负载,使性能保持在指定目标(GFLOPS)。
  3. 多流处理:为每块 GPU 使用多个 MUSA Stream 对操作进行流水线处理,在维持目标压力的同时提高 GPU 利用率。
  4. 性能验证:检查实际性能是否达到目标性能的最小比率阈值,并计入内存传输开销。
  5. 健康监测:持续监测温度、PCIe 重放和其他标准错误状况。

支持的参数

参数类型默认值说明
test_durationDouble30.0持续时间(秒)
target_stressDouble100.0目标 GFLOPS
target_perf_min_ratioDouble0.95达到/目标性能的最小比率
temperature_maxDouble允许的最高温度(°C)
is_allowedBool配置为 false是否运行此测试
use_dgemmBoolTrue使用 DGEMM 而非 SGEMM
musa_streams_per_gpuDouble8.0每块 GPU 的 MUSA Stream 数
ops_per_stream_queueDouble100.0每个流队列排队的操作数
max_pcie_replaysDouble160.0允许的最大 PCIe 重放次数

示例命令

运行两分钟的 Targeted Stress:

dcgmi diag -r targeted_stress -p targeted_stress.test_duration=120.0

运行 Targeted Stress,并将目标性能设置为 200 GFLOPS:

dcgmi diag -r targeted_stress -p targeted_stress.target_stress=200.0

使用单精度运行 Targeted Stress:

dcgmi diag -r targeted_stress -p targeted_stress.use_dgemm=False

运行 Targeted Stress,并将通过阈值设置为目标性能的 90%:

dcgmi diag -r targeted_stress -p targeted_stress.target_perf_min_ratio=0.90

运行 Targeted Stress,并将温度上限设置为 85 摄氏度:

dcgmi diag -r targeted_stress -p targeted_stress.temperature_max=85.0

失败条件

  • 如果测试期间的实际性能低于目标性能(target_stress,默认为 100 GFLOPS)的最小比率阈值(target_perf_min_ratio,默认为 95%),测试失败。

  • 如果测试期间的 PCIe 重放次数超过 max_pcie_replays(默认为 160),测试失败。

Memtest 诊断插件

概述

Memtest 插件参考 memtest86 实现,使用多种测试模式检查 GPU 显存。每种模式都是一项独立测试,可以分别启用或禁用。

测试组成部分

注意

各项测试的运行时间为单次迭代的平均时间,以 S5000 GPU 为参考。

测试编号测试模式说明
Test0Walking 1 bit遍历所有内存地址位,并在每个地址写入 1,以检测线性地址错误。
Test1Address check在每个内存地址写入该地址值,再读回并验证,以检查内存单元的读写一致性。
Test2Moving inversions, ones&zeros使用全 1 和全 0 模式执行移动反转测试,以检测内存单元和数据线问题。
Test3Moving inversions, 8 bit pat使用 8 位宽模式执行移动反转算法,以检测 8 位错误。
Test4Moving inversions, random pattern使用随机模式执行移动反转算法,以检测随机错误。
Test5Block move, 64 moves在显存中移动数据块并检查数据完整性,以检测块错误。
Test6Moving inversions, 32 bit pat使用 32 位宽模式执行移动反转算法,以检测 32 位错误。
Test7Random number sequence使用随机数填充显存并检查数值稳定性,以检测随机错误。
Test8Modulo 20, random pattern结合 Modulo 20 算法和随机数据模式,利用随机数据触发不稳定内存单元中的错误,以检测受缓存或缓冲影响而未被其他测试发现的问题,包括移动反转算法无法检测的潜在错误。
Test9Bit fade test, 2 patterns分别使用全 1 和全 0 模式初始化显存,静置一段时间后检查数据位是否变化,以检测长期稳定性问题。
Test10Memory stress生成随机模式并重复执行 1000 次读写操作,以压力测试显存稳定性并检测错误。该 Kernel 以实现全局显存与 GPU 之间的最大带宽为目标。
注意

默认情况下,Test7 和 Test10 交替运行 10 分钟。检测到任何错误时,诊断失败。

test_duration 是整个 Memtest 插件的目标运行时长,不是每个测试用例的独立超时时间。插件会等待当前用例执行完成后,再判断是否超过目标时长,因此实际运行时间可能略长。达到目标时长后,尚未开始的用例不会执行,也不会在汇总结果中分别显示为 SkipNot Run。如果已执行的用例没有检测到错误,Memtest 总体结果仍可为 Pass。如需确保所有选定用例都已执行,请设置足够长的 test_duration,并通过详细日志确认。

支持的参数

参数类型默认值
test0Boolfalse
test1Boolfalse
test2Boolfalse
test3Boolfalse
test4Boolfalse
test5Boolfalse
test6Boolfalse
test7Booltrue
test8Boolfalse
test9Boolfalse
test10Booltrue
test_durationseconds600

示例命令

运行 4 级诊断,默认会运行 test7test10

dcgmi diag -r 4

运行 4 级诊断,并运行 Memtest 的所有测试用例,目标时长为 1 小时:

dcgmi diag -r 4 \
-p memtest.test0=true\;memtest.test1=true\;memtest.test2=true\;memtest.test3=true\;memtest.test4=true\;memtest.test5=true\;memtest.test6=true\;memtest.test7=true\;memtest.test8=true\;memtest.test9=true\;memtest.test10=true\;memtest.test_duration=3600

迭代运行 10 次 4 级诊断,其中 Memtest 仅运行 test0

dcgmi diag \
--iterations 10 \
-r 4 \
-p memtest.test0=true\;memtest.test7=false\;memtest.test10=false\;memtest.test_duration=60

MTBandwidth 插件

概述

MTBandwidth 属于 3 级及以上诊断,用于测量单台主机中 GPU 的通信带宽。

测试组成部分

MTBandwidth 使用 Copy Engine 或 Kernel Copy 测量不同链路上各种 memcpy 模式的带宽,并通过 mtbandwidth 报告当前实测值。达到最大峰值带宽可能需要针对系统进一步调优。测试仅在单台主机内的 GPU 上执行。

支持的产品

MTBandwidth 支持以下 GPU:

  • MTT S5000

支持的参数

参数类型默认值说明
testcasesstring-以逗号分隔的特定测试用例列表(例如 0,1,2
is_allowedBoolFalse是否运行此测试

示例命令

运行 MTBandwidth 的默认参数:

dcgmi diag -r mtbandwidth -p mtbandwidth.is_allowed=true

运行 MTBandwidth 中的测试用例 1:

dcgmi diag -r mtbandwidth -p mtbandwidth.is_allowed=true\;mtbandwidth.testcases=1

运行 MTBandwidth 中的测试用例 1、2、3:

dcgmi diag -r mtbandwidth -p mtbandwidth.is_allowed=true\;mtbandwidth.testcases=1,2,3

在 3 级诊断中明确运行 MTBandwidth:

dcgmi diag -r 3 -p mtbandwidth.is_allowed=true

失败条件

  • 如果找不到 mtbandwidth 可执行程序,测试失败。

  • 如果 mtbandwidth 执行过程中出现错误,测试失败。


相关文档

  • 功能概述:了解后台健康检查与主动健康检查的区别。
  • XID 参考手册:根据诊断过程中出现的 XID 判断影响范围和处置措施。
  • FAQ:选择诊断级别,区分命令失败、测试失败和 Skip
  • MT GPU 故障排查指南:在诊断前保留故障现场,并根据故障范围继续排查。