Skip to content

fix: 1.1.2 修复 Conda 入口并兼容新版 tegrastats 温度与功耗格式 - #5

Merged
massif-01 merged 1 commit into
RMinte:mainfrom
massif-01:fix/v1.1.2-conda-tegrastats-formats
Oct 13, 2026
Merged

massif-01 merged 1 commit into
RMinte:mainfrom
massif-01:fix/v1.1.2-conda-tegrastats-formats

Conversation

@massif-01

Copy link
Copy Markdown
Member

问题与表现

本 PR 修复 1.1.1 在另一台 Jetson 部署时暴露的两个兼容性问题,版本更新为 1.1.2。基于已包含此前修复的上游 main,只提交本轮增量。

1. 已安装 Conda,却无法进入安装流程

原安装脚本先在 check_requirements 中要求 PATH 已包含 conda,之后才进入 init_conda。因此,Conda 已装在用户目录但尚未加入登录 shell 的 PATH 时,会被当成缺少依赖而退出。原初始化分支还会执行 conda init bash,要求用户加载 .bashrc 或重新打开终端后再跑一遍。

根因是“查找、加载、使用”的顺序错误,而不是需要重新安装 Conda。

2. 新版 tegrastats 的合法输出被旧解析规则丢弃

现场记录出现双值温度、三值功耗,例如:

tj@56.968C/56.968C
VDD_GPU_SOC 5147mW/5147mW/5147mW

旧温度匹配要求单个 C 后立即结束 token;旧功耗匹配要求整个 token 恰好为两个值。上述合法输出因此无法进入原有温度和功耗字段;有其他有效内容的帧可能仍被接受,但相应字段为空。

修复依据:先确认各位置含义,再扩展格式

现场示例的各位置数值相等,无法靠这些例子判断字段含义。本次静态核对了 NVIDIA 官方发行包中的 /usr/bin/tegrastats,没有安装或执行该工具:

  • 所检查的 36.4.7、38.4.0 工具使用单值温度和两值功耗格式。
  • NVIDIA 39.2.1 官方工具包包含双值温度、三值功耗格式。包来源可在官方软件包索引复核。
  • 温度输出路径的首值来自本次传感器读取,第二值通过保存 max(previous_max, current) 得到;顺序是 当前温度/本次采集进程累计最高温度。
  • 功耗输出路径先计算当前功耗,再按 average += (current - average) / count 更新均值,并单独维护最高值;输出顺序是 当前功耗/平均功耗/本次采集进程累计最高功耗。INA2xx、INA3221 和直接电源读取路径顺序一致。

39.2 官方说明页仍描述旧格式。新增最高值的结论来自发行包的计算及输出路径,不能把它表述为说明页已经明确记载,也不能仅凭格式相符声称已确认现场安装版本。

可复核的函数位置与说明保存在本 PR 的 1.1.2 格式说明。

实现与保留的合同

Conda:在当前脚本中完成查找和加载

  1. 保留用户权限、其他系统命令和项目文件检查,将 Conda 检查放到负责加载它的 init_conda。
  2. 优先使用 PATH 中的 Conda;找不到时依次检查用户目录下的 miniconda3、anaconda3、miniforge3 的 bin/conda。
  3. 调用选定工具的 shell.bash hook 并在当前脚本中加载,供后续 conda activate 使用。
  4. 找不到工具、hook 执行失败或加载失败时返回失败;不执行 conda init,不写入 .bashrc 或 .profile。

既有环境复用、创建、Python 包安装和服务流程保持原样。本 PR 没有增加 Conda 自动安装、递归目录搜索或其他安装框架。

温度和功耗:接受新旧格式,返回原有字段

下表使用不同数值说明映射,避免相等值掩盖取错位置:

输入 返回结果
tj@56.968C temperature.tj = 56.968
tj@56.968C/61.25C 仍返回当前值 56.968,保持浮点类型
VDD_GPU_SOC 5147mW/4900mW current = 5147、average = 4900、unit = "mW"
VDD_GPU_SOC 5147mW/4900mW/6000mW 仍返回上述前两值,保持整数,不新增最高值字段

原有无单位功耗 token 继续支持;三值 token 同样要求各位置单位一致。完整 token 边界、残缺值/错误后缀/额外值拒绝、重复 rail 的 current/average 冲突处理均保留。合法零值仍为零;缺失或非法功耗保持空对象,不补零、不延续上一帧。

HTTP 路由、Socket.IO 的 tegrastats_update 事件、正常 TJ 字段及 JSON 类型、遥测合同版本和采集周期不变。此前的数据身份、自洽快照、重启隔离、输出管道所有权、GPU 释放重试和信号退出修复未被改写。

验证结果

全部验证为本地离线验证,Python 3.12.3:

验证 结果与证明范围
从当前源码构建 1.1.2 wheel,在临时隔离目录使用 --no-index --no-deps 安装后跑离线回归 182 passed、0 failed、0 skipped,约 22 秒;原有 170 项回归保留,新增 12 项,仅同步既有健康检查的版本号断言
新增 Conda 测试 5 项:PATH 优先、三个常见用户安装目录、找不到工具;验证 hook 加载后可调用激活函数,且不写用户终端配置
新增格式及传输测试 7 项:单/双值温度、带单位/无单位三值功耗、错误 token,以及真实解析器到采集替身、HTTP 和 Socket.IO 的贯通输出
数据身份与缺失数据的贯通验证 缓存重复发送保持原序号;相同数值的新输入推进序号;下一帧缺失功耗时 HTTP 与 Socket.IO 均为空功耗
独立复审补充的完整安装入口检查 保留脚本顶层参数解析、main 和 ERR trap,仅替换部署阶段:正常 hook 加载并按 --env-name 激活成功;hook 失败退出码为 1,不进入后续阶段。两项均通过,不计入上述 182 项
发布隔离分支的定向复核 本 PR 分支再运行新增 12 项,12 passed;运行模块及测试文件与此前验证的候选一致
Bash 语法、补丁和包内容 bash -n scripts/install.sh 与 git diff --check 通过;本轮增量补丁可还原对应源码;wheel 内运行模块与源码一致,包版本和发行版本均为 1.1.2

复核命令(已有本地测试依赖时):

PYTHONPATH=src PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q tests/offline
bash -n scripts/install.sh

测试脚本已检查副作用边界,没有盲跑整个 tests/ 目录,也没有执行真实安装流程。Conda 使用命令替身;采集进程和 GPU 使用替身;HTTP/Socket.IO 使用内存测试客户端。测试中的既有 datetime.utcnow() 弃用警告不在本轮修复范围。

提交范围、验收边界与回退

本 PR 共 8 个文件:安装入口、解析器、两处版本号、两个新增测试文件、一处既有版本断言,以及本轮格式说明。旧 1.1.1 修复已在基线中;本地工作树的其他修改、wheel、证据归档和临时环境没有带入提交。

本地复审未发现阻断问题,可以进入手动真机验收。这不等于部署已经通过:现场真实 Conda 的激活、实际 tegrastats 原始行与 HTTP/Socket.IO 的一致性、驱动和服务退出行为,以及现场 Python 环境仍待用户手动确认。

本轮没有连接设备、启动真实采集、安装到 Orin、重启服务,也没有修改天山 OS、TJ 绑定、风扇或热模型。

需要回退时,由操作者使用现场保留的上一版本源码/环境,按既有流程切换并重新启动服务;仅修改磁盘文件不会替换已运行进程。回退到 1.1.1 也会恢复本 PR 所修复的 Conda 入口和新版格式限制,因此应保留上一环境及其配置,再进行手动验收。

@massif-01
massif-01 merged commit ddaa558 into RMinte:main Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant