答案内容由AI生成,仅供参考:
Atlas 300I A2 64G 在AC测试时带外传感器概率性获取不到温度问题分析与解决方案
问题概述
在使用 Atlas 300I A2 64G NPU卡进行AC重启测试时,出现带外传感器概率性无法读取温度数据的问题。同时,NPU卡的序列号、固件版本等基础信息无法正常显示,但功耗信息仍可正常获取。此问题发生在 OpenUBMC 25.09 高可用版本环境中,且重复出现,影响系统监控完整性与可靠性。
现象详细描述
| 项目 | 实际结果 |
|---|---|
| 温度传感器读取 | 概率性失败,部分NPU温度未显示或为0°C |
| 序列号、固件版本等信息 | NPU界面无法显示 |
| 功耗读取 | 正常,数据显示准确 |
| compute日志 | 未发现SMBus通信错误,仅有标准响应数据 |
| app.log异常日志 | 存在同步属性设置失败错误:The property Health of the object NPU_1_01010502 is a synchronous property and cannot be set |
根本原因分析(基于上下文信息推断)
结合知识图谱、文档切片以及类似历史问题,该问题由多个潜在因素复合导致:
1. NPU对象与NPUCard对象的数据来源不一致
- Atlas 300I A2卡的温度、健康状态等信息来源于 NPU对象(如
NPU_1),而 Atlas 300I Duo/Pro 等其他型号则通常依赖 NPUCard对象。 - 根据文档【7】和【5】:
- 当驱动未加载时,NPU对象的温度默认值为
0,不会触发异常调速或告警。 - 而 NPUCard对象 会在读取失败时返回
32768或32767(表示传感器异常),从而触发监控系统的容错机制。
- 当驱动未加载时,NPU对象的温度默认值为
- 因此,在AC上电初期、驱动尚未加载完成前,NPU对象返回0°C是“合法”的软性缺省值,但监控系统误认为这是有效数据,导致显示异常或判断滞后。
推论:AC重启后,BMC快速尝试从NPU对象读取温度,但此时OS侧驱动尚未初始化完成,NPU对象无法提供真实温度,返回0,造成“温度丢失”。
2. 信息采集时序竞争(Race Condition)
- AC重启后,BMC启动速度快于OS及NPU驱动加载。
- Compute组件在 NPU驱动未完全初始化前 即开始通过带外(SMBus)或混合方式访问
NPU对象的属性(如 Temperature、SerialNumber、FirmwareVersion)。 - 若此时NPU设备内部MCU还未完成初始化或未向BMC暴露完整数据接口,则会导致短暂读取失败或返回空/默认值。
尽管log中无SMBus错误(说明通信链路正常),但返回的数据可能为空或无效。
例:日志中部分响应如 0D 00 00 21 ... 表明收到了低层响应,但高层逻辑并未正确解析出有效值。
3. Health 等同步属性设置冲突
在 app.log 中频繁出现如下错误:
ERROR: app_preloader.lua(212): ... kepler.class.SetSyncPropertyError: The property Health of the object NPU_1_01010502 is a synchronous property and cannot be set
说明:
Health属性被标记为 同步属性(synchronous property),即必须通过特定流程(如调用服务接口)更新,不能直接写入。- Compute组件试图直接修改该属性值,违反了对象模型约束,引发异常。
- 虽不直接导致温度读取失败,但表明 对象生命周期管理存在缺陷,可能影响整体状态同步。
4. CSR配置中缺少关键恢复或重试策略
- 尽管用户已尝试增加“写延迟”以缓解初始化问题,但仅靠硬件延迟无法解决软件层对未就绪设备的过度激进轮询。
- 缺少以下策略配置:
- 读取失败后的退避重试机制(Debounce / Retry with backoff)
- 状态依赖判断(仅当NPU驱动上报Ready后再发起完整采集)
- Fallback机制(当带内不可用时,强制依赖带外MCU信息)
已验证解决方案与建议
解决方案一:升级并确认适配 OpenUBMC 25.09 闭源组件
- 根据【文档1】回复:
“当时我用的openUBMC 25.06基线,升级到25.09基线就可以了,25.09基线的闭源组件compute有适配”
- 结论:
- 仅导入CSR文件不足以支持A2卡监控。
- 必须确保 compute组件已更新至支持Atlas 300I A2的新版本,否则其内部
npu_service.lua、NPUCard.lua无法正确定义NPU对象的采集路径。
建议:确认当前环境中 compute 组件是否为官方适配版本(如 25.09.1+),可联系华为技术支持获取配套固件包。
解决方案二:调整采集策略 —— 优先使用 NPUCard 带外信息
- 建议修改配置,使温度、序列号、固件版本等关键信息从 带外MCU接口的NPUCard对象 获取,而非依赖需OS驱动支持的NPU对象。
- 依据【搜索结果1】
NPU卡适配指南明确定义了如下属性应从 带外管理协议 获取:
| 属性 | 来源 |
|---|---|
PowerWatts |
|
Core0TemperatureCelsius |
|
Core1TemperatureCelsius |
|
SerialNumber |
|
FirmwareVersion |
建议操作:
- 检查CSR文件中
NPUCard_1是否配置了RefChip指向正确的MCU对象(如Chip_Dmini_xxxx)。 - 验证
StorageType是否设为MCU,确保信息来源非依赖OS驱动。
解决方案三:添加初始化等待逻辑与退避机制
在 compute 组件的 NPUCard.lua 或 npu_service.lua 中增加如下策略:
-- 示例伪代码:延迟采集或检测驱动状态
if not is_npu_driver_ready(npu_id) then
log.warn("NPU driver not ready, skip temperature fetch for ", npu_id)
retry_after(5000) -- 5秒后重试
else
read_temperature_via_out_of_band()
end
或采用 MedianDebounce_Temperature 一类的防抖策略(见KG中 Temperature 实体描述),避免短暂0值污染监控系统。
解决方案四:修复 Health 属性设置错误
- 禁止直接设置
NPU_xxx.Health属性。 - 应通过调用标准接口(如
UpdateHealthState())来更新健康状态。 - 修改相关脚本(如
app_preloader.lua)中的SetProperty调用,改为事件通知方式。
解决方案五:确认CoolingRequirement配置完整性
参考【文档5】历史调速失败问题:
“社区代码提供的csr文件没有配置CoolingArea,添加后可以正常调速”
说明:
- 即使功能看似仅涉及“信息读取”,CoolingRequirement、CoolingArea、Sensor Mapping 等配置若缺失,可能导致整个调温链路初始化异常。
- 检查以下项是否存在且正确关联:
CoolingRequirement_xxx.SensorName→NPUx AICORE TempCoolingRequirement_xxx.MonitoringValue→ 正确绑定至传感器TemperatureType = 9(对应 NPUAiCore,见 KG 中TemperatureType定义)
推荐排查步骤清单
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1 | 确认 compute 组件版本为 OpenUBMC 25.09 官方适配版 |
|
| 2 | 检查CSR文件中 NPUCard_1 是否存在且配置 Model="Atlas_300I_A2"、RefChip 正确 |
|
| 3 | 查看 /bmc/kepler/.../NPUCard_1 是否返回 Core0TemperatureCelsius、SerialNumber 等字段 |
|
| 4 | 检查 NPU_1 对象的 Temperature 值是否为 0 或缺失 |
|
| 5 | 在AC重启后观察:npu_service.lua 是否在驱动加载前过早采集 |
|
| 6 | 添加日志输出:is_npu_driver_loaded() 的检测结果 |
|
| 7 | 修改配置:将传感器数据源从 NPU_xxx.Temp 改为 NPUCard_xxx.Core0TemperatureCelsius |
附加说明
温度异常值含义对照表(来源:【7】)
| 数值 | 含义 | 说明 |
|---|---|---|
0 |
驱动未加载或未返回 | A2卡特有,不触发告警,易造成误判 |
32767 |
设备返回温度失败 | NPU芯片侧未读到温度 |
32768 |
BMC 通信失败 | 与MCU/SMBus交互失败 |
Atlas 300I A2 卡使用
0作为未就绪标志,与其他NPU卡不同,需在策略层面特殊处理。
总结
| 问题原因 | 是否可解决 | 措施 |
|---|---|---|
| compute组件未适配A2卡 | 升级至官方25.09闭源版本 | |
| 信息源依赖NPU对象(需驱动) | 改用NPUCard对象(带外MCU) | |
| AC重启后采集过早 | 添加延迟、健康检查、退避机制 | |
| Health属性非法写入 | 修复脚本,禁用直接SetProperty | |
| CSR缺CoolingArea等结构 | 完善CoolingRequirement配置 |
后续建议
- 联系华为技术支持 提供
compute组件适配包。 - 参照《NPU卡适配指南》 完整配置
NPUCard对象属性。 - 在测试流程中加入驱动状态探测环节,避免“看得到设备却读不到数据”的伪故障。
- 推动将Atlas 300I A2纳入Devmon统一管理框架(见KG中
NPU描述),实现更健壮的生命周期控制。
最终目标:实现无论AC重启与否,所有NPU信息均能从带外可靠获取,摆脱对OS驱动的强依赖。
相关链接: