ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Telegraf `amd_rocm_smi` 插件监控 AMD GPU:从 rocm-smi 二进制到可查询指标

使用 Telegraf `amd_rocm_smi` 插件监控 AMD GPU:从 rocm-smi 二进制到可查询指标 使用 Telegrafamd_rocm_smi插件监控 AMD GPU从 rocm-smi 二进制到可查询指标【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本篇技术指南围绕 Telegraf 内置的amd_rocm_smi输入插件展开讲解如何通过调用 AMD ROCm 平台的rocm-smi命令行工具把 GPU 的显存占用、核心与显存频率、温度、功耗、风扇转速、利用率等硬件状态采集为amd_rocm_smi测量值。读完本文你将掌握插件的安装前提、bin_path与timeout两个核心配置、全部输出字段与标签的含义、手动排查命令以及 ROCm 版本差异带来的解析风险。插件概览amd_rocm_smi输入插件负责从 AMD ROCm 平台的 GPU 上收集统计信息涵盖显存与 GPU 使用率、温度、功耗、频率等指标。它最早随 Telegraf v1.20.0 引入属于 hardware、system 类别可在所有支持平台上使用只要目标主机安装了 ROCm 环境。该插件的定位与思路来自nvidia-smi插件通过调用显卡厂商官方提供的命令行工具把其输出转换为统一的指标格式。整个采集链路在仓库中可以完整追溯插件主实现amd_rocm_smi.go插件示例配置sample.conf插件注册入口all/amd_rocm_smi.go单元测试amd_rocm_smi_test.go[!IMPORTANT]rocm-smi二进制是采集的前提必须预先安装在系统上。插件本身并不直接读取/sys/class/drm或驱动接口而是以子进程方式调用rocm-smi并解析其 JSON 输出。安装前提与二进制定位前提条件rocm-smi二进制是插件的数据来源由 AMD ROCm 平台的 python_smi_tools 提供需要随 ROCm 一起安装到目标主机。插件在启动阶段会做一次二进制探测逻辑位于 amd_rocm_smi.go 的Start方法如果配置了bin_path先通过os.Stat检查该路径是否存在若未配置或路径不存在则回退到exec.LookPath(rocm-smi)即在系统$PATH中查找若仍找不到返回包装为internal.StartupError的错误。也就是说bin_path并非强制项只要rocm-smi能被$PATH找到插件即可正常工作。一个细节默认值也写在源码里从插件注册代码 amd_rocm_smi.go 可以看到即使不写任何配置插件也会使用两个内置默认值inputs.Add(amd_rocm_smi, func() telegraf.Input { return ROCmSMI{ BinPath: /opt/rocm/bin/rocm-smi, Timeout: config.Duration(5 * time.Second), } })其中BinPath默认指向 ROCm 的常规安装位置/opt/rocm/bin/rocm-smiTimeout默认 5 秒。这两项都可在 TOML 配置中覆盖具体见下文。配置说明在telegraf.conf中启用插件最小配置如下与 sample.conf 完全一致# Query statistics from AMD Graphics cards using rocm-smi binary [[inputs.amd_rocm_smi]] ## Optional: path to rocm-smi binary, defaults to $PATH via exec.LookPath # bin_path /opt/rocm/bin/rocm-smi ## Optional: timeout for GPU polling # timeout 5s两个配置项说明配置项类型默认值说明bin_pathstring/opt/rocm/bin/rocm-smi注册时默认实际解析时优先使用该路径否则回退到$PATHrocm-smi可执行文件的路径。适用于二进制不在标准位置、或希望锁定特定版本的情形timeoutduration5s每次执行rocm-smi轮询 GPU 的超时时间。该值会传给internal.StdOutputTimeout见 amd_rocm_smi.go超时后本次采集失败并返回错误全局配置与启动错误行为插件支持 Telegraf 统一的全局配置能力如 namepass、fieldpass、tagpass、别名 alias 等详见 docs/CONFIGURATION.md。此外插件还支持startup_error_behavior选项用于控制启动阶段出现错误例如找不到rocm-smi二进制时的行为可用取值与文档 docs/includes/startup_error_behavior.md 一致error发生启动错误时 Telegraf 停止并退出。这是默认行为ignoreTelegraf 忽略该插件的启动错误并禁用它但继续运行其他所有插件retry当前版本不可用该取值对 amd_rocm_smi 插件无效。该选项的行为在测试 amd_rocm_smi_test.go 中有直接验证测试先把PATH清空再传入不存在的BinPath分别断言error与ignore两种模式下的错误类型差异。采集原理一次完整的 rocm-smi 调用为什么不用-a全量选项插件在 pollROCmSMI 中手动拼接参数而非使用rocm-smi -a。源码注释解释了原因在 ROCm v4.3.x 时代-a选项并不能提供全部所需信息因此插件逐项列出需要的参数rocm-smi -o -l -m -M -g -c -t -u -i -f -p -P -s -S -v \ --showreplaycount --showpids --showdriverversion --showmemvendor \ --showfwinfo --showproductname --showserial --showuniqueid --showbus \ --showpendingpages --showpagesinfo --showmeminfo all \ --showretiredpages --showunreservablepages --showmemuse --showvoltage \ --showtopo --showtopoweight --showtopohops --showtopotype --showtoponuma \ --json这些参数分别对应温度、风扇、显存、利用率、时钟频率、功耗、产品信息、序列号、总线、固件、电压、拓扑等维度的输出最终统一加上--json以获得结构化结果。命令执行通过internal.StdOutputTimeout完成受上文timeout配置约束。JSON 到指标的解析rocm-smi的 JSON 输出顶层是一个以card0、card1… 为键、以system为系统信息键的对象。解析过程位于 gatherROCmSMI先按gpu结构与sysInfo结构分别做两次json.Unmarshal再交给genTagsFields生成指标。gpu结构体amd_rocm_smi.go映射了大量原始字段例如Temperature (Sensor edge) (C)、sclk clock speed:、VRAM Total Memory (B)等。以测试样本 vega-10-XT.json 为例真实输出形如{ card0: { GPU ID: 0x6861, Unique ID: 0x2150e7d042a1124, Temperature (Sensor edge) (C): 39.0, sclk clock speed:: (1269Mhz), Fan speed (%): 13, VRAM Total Memory (B): 17163091968, VRAM Total Used Memory (B): 17776640, Card model: 0xc1e, Card vendor: Advanced Micro Devices, Inc. [AMD/ATI] }, system: { Driver version: 5.9.25 } }genTagsFields[amd_rocm_smi.go](https://link.gitcode.com/i/3c0995786d2c4a92988cfd1d245b6e14#L182-L231中有几个值得注意的映射细节每个cardN键都会被转换为 tagnamecardN同时优先用Device ID填充gpu_id缺失时回退到GPU ID以兼容旧版输出memory_free不是直接读取的字段而是由VRAM Total Memory (B)减去VRAM Total Used Memory (B)计算得出驱动版本5.9.25会去掉所有点号变成整数5925时钟字段如(1269Mhz)通过strings.Trim(..., (Mhz))去掉单位后转为整数utilization_memory优先使用GPU Memory Allocated (VRAM%)缺失时才回退到GPU memory use (%)数值转换统一走setIfUsed辅助函数amd_rocm_smi.go解析失败或为空值的字段会被静默跳过不产生指标。输出指标详解每个 GPU 会产出一条测量值measurementamd_rocm_smi。TagsTag含义namerocm-smi输出的条目名通常是card0、card1等gpu_id根据rocm-smi输出的 GPU ID优先使用 Device ID其次 GPU IDgpu_unique_idGPU 的唯一 ID部分平台/驱动下可能为N/A见测试样本 mi100 场景Fields字段类型单位driver_versioninteger去点后的驱动版本号fan_speedinteger风扇转速百分比memory_totalinteger显存总量Bmemory_usedinteger显存已用量Bmemory_freeinteger显存空闲量B由 total − used 计算temperature_sensor_edgefloat边缘传感器温度摄氏度temperature_sensor_junctionfloat结温传感器温度摄氏度temperature_sensor_memoryfloat显存传感器温度摄氏度utilization_gpuintegerGPU 利用率百分比utilization_memoryinteger显存利用率百分比clocks_current_sminteger当前 SMShader时钟MHzclocks_current_memoryinteger当前显存时钟MHzclocks_current_displayinteger当前显示引擎时钟MHzclocks_current_fabricinteger当前 Fabric 时钟MHzclocks_current_systeminteger当前 SoC 系统时钟MHzpower_drawfloat当前功耗瓦card_seriesstring显卡系列名card_modelstring显卡型号标识card_vendorstring显卡厂商名示例输出来自 README.md 的真实采集样例line 协议格式amd_rocm_smi,gpu_id0x6861,gpu_unique_id0x2150e7d042a1124,hostali47xl,namecard0 clocks_current_memory167i,clocks_current_sm852i,driver_version51114i,fan_speed14i,memory_free17145282560i,memory_total17163091968i,memory_used17809408i,power_draw7,temperature_sensor_edge28,temperature_sensor_junction29,temperature_sensor_memory92,utilization_gpu0i 1630572551000000000多卡场景与不同 ROCm 版本的行为差异插件没有写死单卡假设测试用例覆盖了多张卡的输出。例如 mi100_rocm602.json 对应 4 张 MI100 卡测试 TestGatherValidJSON 断言每张卡都会独立产出一条带各自gpu_id、gpu_unique_id、nametag 的指标。同样地rx6700xt_rocm430.json、rx6700xt_rocm571.json、rx6700xt_rocm602.json、rx6700xt_rocm612.json分别覆盖了同一张消费级显卡在多个 ROCm 版本下的输出差异。值得注意的是字段存在性差异例如 ROCm 6.1.2 的 rx6700xt 样本中clocks_current_sm为 0而部分样本缺少utilization_memory或clocks_current_fabric。这正是下面“限制与注意事项”中所述风险的具体体现。Troubleshooting如何排查采集问题如果插件采集不到数据或报错文档建议直接手动运行rocm-smi检查完整输出rocm-smi -o -l -m -M -g -c -t -u -i -f -p -P -s -S -v --showreplaycount --showpids --showdriverversion --showmemvendor --showfwinfo --showproductname --showserial --showuniqueid --showbus --showpendingpages --showpagesinfo --showretiredpages --showunreservablepages --showmemuse --showvoltage --showtopo --showtopoweight --showtopohops --showtopotype --showtoponuma --showmeminfo all --json排查要点确认rocm-smi可执行且--json输出能被正常解析对比 testdata 中的样例结构确认bin_path指向正确或rocm-smi在$PATH中若rocm-smi本身执行缓慢适当调大timeout若向社区提交 issue请附上上述命令的完整输出以及 ROCm 版本号。限制与注意事项官方文档明确列出了以下几点局限使用时需要知悉该插件只在有限的 ROCm 版本和少量 GPU 型号上开发与测试过目前最新的已验证 ROCm 版本为4.3.0根据设备与驱动版本的不同rocm-smi能提供的信息量会有差异某些字段会随驱动升级而出现或消失rocm-smi的 JSON 输出并非完全同构且未来可能继续变化因此升级 ROCm 后解析与反序列化可能开始失败。这一点在测试用例覆盖多个 ROCm 版本4.3.0、5.7.1、6.0.2、6.1.2的字段差异上已有印证插件灵感来源于当时的nvidia-smi插件设计。与 nvidia-smi 插件的对照作为参考amd_rocm_smi的设计继承了当时nvidia-smi插件的思路两者都依赖厂商官方 CLI 工具输出并将其映射为统一的 tag field 指标。如果你同时监控 NVIDIA 与 AMD 异构 GPU 集群可以分别启用inputs.nvidia_smi与inputs.amd_rocm_smi再结合 tagpass/fieldpass 等全局配置见 docs/CONFIGURATION.md按需裁剪字段。小结amd_rocm_smi插件是一个依赖系统rocm-smi二进制的轻量采集器通过一组显式参数获取 GPU 全量 JSON 快照再映射为包含 3 个标签、19 个字段的amd_rocm_smi测量值。配置上只需关注bin_path与timeout使用时最重要的运维习惯是在升级 ROCm 后复测一次rocm-smi --json输出并同步验证字段是否仍然齐全。相关的源码、测试样本与配置均可在本仓库plugins/inputs/amd_rocm_smi/目录下继续深入阅读。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表