日报 — 2026-03-12

今日概览

  • 做了什么: 修复 VLA/RoboTwin 评估环境的 torch/torchvision 版本不匹配和 curobo CUDA 扩展 ABI 兼容性问题,并改进 GPU 监控工具 gpumon.py 的终端宽度与进程显示逻辑
  • 怎么做的: 逐层排查依赖链错误(torchvision 升级 → curobo JIT 编译路径修复 → checkpoint 路径核查),通过设置 CUDA_HOME+CPATH 指向 conda 内部 CUDA 头文件目录从源码重新编译 curobo
  • 有什么用: 解决了 torch 2.7.1 环境下两个关键依赖冲突,评估脚本可以正常启动并运行到模型加载阶段,为后续机器人策略评估扫清了环境障碍

在天河服务器上调试 VLA 机器人评估环境的多层依赖问题,同时优化 GPU 监控工具的显示逻辑

今日任务

架构与策略

  • 🔄 VLA eval.sh 运行环境修复 — 修复 bash eval.sh place_dual_shoes demo_clean pi05_robotwin2 demo_clean 0 2 运行失败:依次解决 torchvision 版本不匹配(0.21.0→0.22.1)、curobo CUDA 扩展 ABI 不兼容(源码重编译),剩余 checkpoint_id=5000 路径不存在问题待解决(可用 checkpoint:15000/25000/29999)

实现与修复

  • 🔄 gpumon.py 显示逻辑优化 — 修复 GPU 监控工具输出超宽(>100列)和进程重复显示问题;AI 实现了全局去重,但用户纠正为每进程在每张 GPU 上只显示一次,会话中断,任务未完全完成

问题与解决方案

关键问题

1. curobo 预编译 .so 文件与 torch 2.7.1 ABI 不兼容(undefined symbol: torchInternalAssertFail),JIT 重新编译因缺少 ninja 和 CUDA 头文件而失败

解决方案: 安装 ninja,设置 CUDA_HOME 为 conda 环境根目录,CPATH 指向 envs/RefineVLA/targets/x86_64-linux/include/,执行 pip install -e . 从源码重编译 curobo

关键洞察: conda 安装的 CUDA toolkit 头文件在 envs//targets/x86_64-linux/include/ 而非 /usr/local/cuda/include/;编译 CUDA 扩展时必须将 CUDA_HOME 和 CPATH 指向此路径

2. torch 2.7.1+cu126 与 torchvision 0.21.0 版本不匹配,torchvision::nms 算子注册失败

解决方案: 升级 torchvision 至 0.22.1+cu126(pip install torchvision==0.22.1 –index-url https://download.pytorch.org/whl/cu126

关键洞察: torch 2.7.x 必须搭配 torchvision 0.22.x;torchvision .so 文件链接的是 torch C++ ABI,大版本升级后必须同步升级

一般问题

3. checkpoint 路径 policy/pi05/checkpoints/pi05_robotwin2/demo_clean/5000/assets/ 不存在,deploy_policy.yml 默认 checkpoint_id=5000,但实际可用为 15000/25000/29999

解决方案: 会话中断未解决;需将 deploy_policy.yml 中 checkpoint_id 改为可用值(如 29999)或通过 eval.sh 参数传入

关键洞察: eval.sh 传入的 checkpoint_id 参数需与实际训练产物对应,yml 默认值 5000 仅为占位符

4. gpumon.py 输出宽度超过终端宽度,进程在多 GPU 下重复出现

解决方案: 重写进程表逻辑,限制输出为 80 列,过滤 multiprocessing worker/wandb-core 等子进程噪声

关键洞察: AI 将需求理解为全局去重(每进程出现一次),实际需求是每 (进程, GPU) 对去重(每进程在每张 GPU 上各出现一次)

人类思路 vs AI 思路

战略层面

gpumon.py 进程去重粒度的理解

角色 思路
人类 人类清楚区分了「进程与 GPU 的多对多关系」:期望每个 (进程, GPU) 对只显示一次,而非全局每进程只显示一次
AI AI 实现全局去重——每进程只出现一次,GPU 列用逗号连接所有使用的卡号(如 0,1,5,7)

差异分析: AI 的方案丢失了进程与具体 GPU 的对应关系;人类需求在保留多卡对应的同时去除冗余行

实现层面

依赖环境调试的主导权

角色 思路
人类 人类采用迭代驱动策略:每次修复一个错误后重跑脚本观察新错误,多次主动拒绝 AI 的工具调用(find 命令、ExitPlanMode)以控制节奏
AI AI 负责逐层根因分析和技术执行,能够识别 torch→torchvision→curobo 的完整依赖链并提出修复方案

差异分析: 人类掌握执行节奏和范围控制,AI 提供诊断和实现能力;分工明确但人类的多次干预延长了调试周期

AI 局限性

重要局限

  • AI 误解 gpumon.py 的去重粒度需求,将「每 (进程, GPU) 对去重」实现为「全局每进程去重」,需用户明确纠正才发现错误

一般局限

  • CUDA 头文件路径排查需多次尝试(pip nvidia 包路径 → 系统 /usr/local/cuda → conda targets 目录),AI 未能根据环境结构一次定位正确路径
  • AI 在路径不确定时倾向于使用 find 全局搜索,该行为被用户拒绝;应优先利用已知环境结构(conda env 布局)推断路径

今日收获

核心收获

  • conda 环境中安装 CUDA toolkit 时,头文件位于 envs//targets/x86_64-linux/include/(而非 /usr/local/cuda/include/);编译 CUDA 扩展需设置 CUDA_HOME=<conda_env_root> 和 CPATH=<targets_include>
  • torch 大版本升级后,所有依赖 torch C++ ABI 的 CUDA 扩展(torchvision、curobo 等预编译 .so 文件)都需要重新编译或升级版本;torch 2.7.x 对应 torchvision 0.22.x
  • curobo 的预编译 .so 文件与当前 torch 不兼容时,删除 .so 后用 pip install -e . 从源码重建是可行的快速修复路径,关键是正确设置 CUDA 编译环境

会话摘要

RoboBrain GPU Monitor

🔄 gpumon.py 终端宽度限制与进程显示去重优化 15:48:28.705 | claude_code 用户展示了 gpumon.py 的超宽输出与进程重复问题,要求修复。AI 重写进程表逻辑,将宽度限制为 80 列并实现全局进程去重。用户随即纠正:正确需求是每进程在每张 GPU 上只显示一次而非全局去重,会话被中断,二次修复未能完成。

VLA RoboTwin pi05

🔄 eval.sh 依赖链修复:torchvision 升级 + curobo 源码重编译 + checkpoint 路径问题发现 02:34:02.614 | claude_code 按计划升级 torchvision 至 0.22.1 成功后,出现 curobo CUDA 扩展 ABI 不兼容错误。AI 安装 ninja,删除旧 .so 文件,在 conda 环境 targets/x86_64-linux/include/ 目录中找到 CUDA 头文件,设置 CUDA_HOME+CPATH 后成功从源码编译 curobo。再次运行脚本后发现 checkpoint_id=5000 路径不存在(实际可用 15000/25000/29999),会话在分析参数映射时被中断。

🔄 eval.sh 首次报错分析:torch/torchvision 版本不匹配诊断与修复计划 02:23:18.758 | claude_code 用户运行 eval.sh 出现 torchvision::nms 算子不存在错误。AI 确诊为 torch 2.7.1 与 torchvision 0.21.0 版本不匹配,制定升级 torchvision 至 0.22.1 的计划。用户选择升级方案但拒绝了 AI 直接执行的 ExitPlanMode,会话以等待用户指令结束。

Token 用量

总览

指标 数值
总 Token 1,970,396
输入 Token 62
输出 Token 3,342
Cache 创建 199,634
Cache 读取 1,767,358
Cache 命中率 89.9%
总费用 (USD) $2.2153

模型明细

模型 输入 输出 Cache 创建 Cache 读取 费用 占比
claude-opus-4-6 62 3,342 199,634 1,767,358 $2.2153 100.0%