跳到主要内容

MTDCGM 诊断指南

概述​

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

如果故障正在发生,请先按照 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 的二进制文件,如 dcgmi 或 mt-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/2 和 index/2 + 1)
p2p_bw_concurrent_p2p_disabledP2P DisabledDevice <-> Device Bandwidth,直接相邻的两个 GPU 同时做带宽测试(dindex/2 和 index/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 插件的目标运行时长,不是每个测试用例的独立超时时间。插件会等待当前用例执行完成后,再判断是否超过目标时长,因此实际运行时间可能略长。达到目标时长后,尚未开始的用例不会执行,也不会在汇总结果中分别显示为 Skip 或 Not Run。如果已执行的用例没有检测到错误,Memtest 总体结果仍可为 Pass。如需确保所有选定用例都已执行,请设置足够长的 test_duration,并通过详细日志确认。

支持的参数​

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

示例命令​

运行 4 级诊断,默认会运行 test7 和 test10:

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。
  • GPU 故障排查:在诊断前保留故障现场,并根据故障范围继续排查。