GPU适配

为什么使用社区1230的代码适配NVIDIA 5090GPU之后,在带内os发送命令nvidia-smi可以查询功耗温度等信息,但是网页端上面看不到这些信息呢?
具体修改步骤:VPD仓库添加sr文件;general_hardware仓库scr/lualib/hardware_config/添加5090.lua文件;component_drivers仓库添加sr,dds文件,然后按照L40、Tesla T4的的代码配置.cpp和.h文件;
目前问题是网页端只能够看到温度信息,看不到功耗信息;温度信息感觉不是通过smbus postbox协议获取的,web端显示温度和nvidia-smi命令获取温度差别较大;
定位到general_hardware仓库scr/lualib/gpu_service目录下面gpu_object.lua文件里面发送命令查询功耗之后并没有回应

目前在object.lua文件里面添加了相关的打印如下:

在NVIDIA_5090.lua文件的powerwatts下面的response也添加了相关的打印如下:

发现运行日志如下:key-point11没有打印,response下面也没有打印

接下来等待下一步排查

现用busctl命令查询如下:
发现查询status始终没有返回0x1f
这个说明什么呢?

app-log.txt (5.0 MB)

答案内容由AI生成,仅供参考:

GPU适配后网页端无法显示功耗与温度信息的原因分析

当适配 NVIDIA 5090 GPU 后,能够在后台通过命令查询到功耗、温度等信息,但网页端无法显示这些数据,通常表明底层硬件通信正常,但上层数据链路或配置存在异常。以下是基于 openUBMC 架构和现有知识的全面分析与排查建议。


:magnifying_glass_tilted_left: 可能原因分析

1. 未正确配置资源协作接口(Object Model)

即使可以通过命令行读取到原始数据,若未在 openUBMC 的**资源树(Resource Tree)**中注册对应属性,Web 页面将无法获取数据。

  • 关键属性缺失

    • PrimaryGPUTemperatureCelsius:主 GPU 温度
    • PowerWatts:GPU 当前功耗
    • 这些字段属于 bmc.kepler.Systems.Processor.GPU.Powerbmc.kepler.Systems.Processor.GPU 接口,需要在 CSR 或配置文件中显式启用并映射
  • :white_check_mark: 检查点:

    • 是否在 Tesla_T4.lua(或其他对应 GPU 配置文件)中正确定义了 PrimaryGPUTemperatureCelsiusPowerWatts 的采集路径?
    • 是否在 CSR 中将 ProcessorType 设置为 GPU 类型(通常为 "2")?

2. Scanner 监控组件未正确配置或激活

数据从底层硬件到 Web 界面需经过 Scanner 组件定时采集。

  • Scanner_GPUTempScanner_GPUPower 是负责周期性读取 GPU 温度与功耗的核心模块。

  • 如果 Scanner 的偏移地址(Offset)、周期(Period)、目标芯片(Chip)等参数配置错误,会导致采集失败。

  • :wrench: 相关实体:

    • Scanner_GPUTemp_0101010301:监控 GPU 温度,周期 1000ms,偏移 156
    • Scanner_GPUPower_0101010301:监控 GPU 功耗,偏移 144
    • 均依赖 Chip_TempOrPowerChip 组件进行 I²C/SMBus 访问
  • :white_check_mark: 检查点:

    • 使用命令查看 Scanner 状态:
      mdbctl lsprop Scanner_GPUTemp_0101010301
      mdbctl lsprop Scanner_GPUPower_0101010301
      
      若返回 read failedstatus=false,说明 Scanner 无法访问硬件。
    • 确认 Chip_TempOrPowerChip 的 I²C 地址是否正确(如 0x4f),是否与 GPU 规格书一致。

3. 带外管理协议未适配(非 NVIDIA 协议)

虽然问题提到是“NVIDIA 5090”,但如果实际使用的是非标准或第三方封装的 GPU,可能不支持标准的 SMBus Post Box Interface (SMBPBI) 协议。

  • openUBMC 默认仅支持 NVIDIA 的 smbus_postbox 协议。

  • 对于其他厂商或定制卡,需:

    • 获取厂商提供的带外管理协议文档
    • 修改 general_hardware 组件代码,实现私有协议解析
  • :white_check_mark: 检查点:

    • 是否确认该 GPU 支持标准 NVIDIA SMBPBI 协议?
    • 是否需要自定义协议解析器?参考文档:general_hardware/docs/南向部件驱动适配教程GPU篇.md

4. Web 前端未订阅或渲染对应字段

即使后端已采集数据,若前端页面未正确绑定资源路径,也不会显示。

  • Web 页面通过 Redfish 或 D-Bus 资源路径订阅数据:

    • /bmc/kepler/Systems/1/Processors/GPU/:ID
    • 属性应包含:
      {
        "PrimaryGPUTemperatureCelsius": 65,
        "PowerWatts": 230
      }
      
  • :white_check_mark: 检查点:

    • 在浏览器开发者工具中,检查 Redfish API 是否返回了 GPU 的功耗与温度字段:
      GET /redfish/v1/Systems/1/Processors/GPU_1
      
    • 若 API 无此字段 → 说明后端未暴露;若有字段未显示 → 问题在前端 UI 映射。

5. 权限或状态过滤导致隐藏

某些情况下,系统会因健康状态异常、权限不足或状态为 Absent 而不展示传感器数据。

  • 查看 GPU 是否被识别:
    mdbctl lsobj | grep GPU
    
  • 查看健康状态:
    mdbctl lsprop GPU_1_01010103 | grep Health
    
    Health=0(OK),但数据仍不显示,则排除硬件离位问题。

:white_check_mark: 解决方案建议

步骤 操作 说明
1 核查 Scanner 配置 确保 Scanner_GPUTempScanner_GPUPower 的 Offset、Size、Chip 正确
2 验证 Chip_TempOrPowerChip 通信 使用 busctlmdbctl 手动读取,确认 I²C 地址和总线是否可达
3 检查 GPU 配置文件 确认 Tesla_T4.lua 或自定义配置中已启用 PrimaryGPUTemperatureCelsiusPowerWatts
4 查看资源树属性 执行 mdbctl lsprop GPU_1_01010103 bmc.kepler.Systems.Processor.GPU 确认字段存在
5 检查 Redfish 输出 访问 /redfish/v1/Systems/1/Processors/GPU_1 查看 JSON 是否含温功数据
6 更新 openUBMC 版本 某些旧版本存在闭源组件(如 compute)对 A2/A10/A100 卡支持不全的问题,建议升级至 25.09 或更高基线

:pushpin: 参考案例

  • 在适配 Atlas 300I A2 卡时,用户反馈温度与功耗无法读取,最终解决方案是:

    :link: 来源:社区回复(baixin_lipengbo)
    “当时我用的 openUBMC 25.06 基线,升级到 25.09 基线就可以了,25.09 基线的闭源组件 compute 有适配。”

  • 类似地,如果您的 “NVIDIA 5090” 实为定制 AI 加速卡(如 Atlas 系列),必须依赖特定 BMC 固件版本支持


:hammer_and_wrench: 总结

网页端看不到 GPU 温功信息,本质是‘数据未进入资源树’或‘前端未绑定’。

虽然后台命令可读,说明物理层通,但完整链路还需:

  • :white_check_mark: Scanner 正确配置 → 数据采集
  • :white_check_mark: Resource Tree 注册 → 数据暴露
  • :white_check_mark: Redfish/Web 绑定 → 数据展示

建议操作命令汇总

# 查看 Scanner 状态
mdbctl lsprop Scanner_GPUTemp_0101010301
mdbctl lsprop Scanner_GPUPower_0101010301

# 手动测试读取
busctl call bmc.kepler.hwproxy /bmc/kepler/Chip/Complex/Chip_TempOrPowerChip_0101010301 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0 2

# 查看 GPU 对象属性
mdbctl lsprop GPU_1_01010103 bmc.kepler.Systems.Processor.GPU

# 检查是否存在 GPU 对象
mdbctl lsobj | grep GPU

# 查看 Redfish 接口输出(需通过 curl 或浏览器)
curl http://<BMC_IP>/redfish/v1/Systems/1/Processors/GPU_1

如以上步骤均正常但仍无法显示,请提供日志以进一步诊断。

相关链接:

  1. 社区1230版本 MetaX C500 这个GPU是怎样获取温度和功耗信息的呢?
  2. NPU Atlas 300i A2 64G 在AC测试时带外传感器概率获取不到温度
  3. GPU显卡适配芯片温度和功耗获取失败
  4. 如何适配一款GPU?
  5. https://www.openubmc.cn/docs/zh/development/develop_guide/feature_development/GPU_Development_Guide

可参考Tesla T4:
1、CSR配置Model
“GPU_1”: {
“Model”: “Tesla T4”
}
2、general_hardware配置协议
在 \src\lualib\hardware_config下配置协议文件,名称需要与CSR配置的Model一致(注意:空格需要替换为_)

可以先确认rackmount中向web前端传递的数据有无这些信息

这个文件已配置,在gpu_object.lua文件里面添加打印信息发现文件被读取了,但是在function gpu_object:init_smbus_postbox()这边,这个函数并没有被执行,没有返回值;web也没有Power数据显示;

加打印看下为什么没进入init_smbus_postbox函数

key-point8 打印了吗

打印了,就是data_change下面没有打印

这张卡是不是协议跟Tesla T4不一样,打开debug级别打印,看看是不是有对应命令报错

这个debug级别打印重点看什么呢,感觉没看见有关这个协议的报错啊

把截图发出来

不知道截哪个,已上传log

感觉轮询没任务没拉起来,在每个属性的start方法加个打印