日报 — 2026-03-20
今日概览
- 做了什么: 在DCC和tianhe两台HPC设备上同步推进机器人操作与空间转录组两大方向:前者涵盖error recovery benchmark的数据质量修复、训练场景并行批量生成和Pi0.5-base LoRA微调流水线搭建;后者完成STAIG超参数公平对比修复和10x Visium数据分析脚本开发。
- 怎么做的: 通过系统性GPU诊断脚本定位并修复假阳性阈值问题;将串行场景生成改造为32 worker ThreadPoolExecutor并行(4 GPU round-robin);完成HDF5→LeRoBot格式转换和norm stats计算;通过日志与缓存交叉验证修复实验命名误导;将Visium可视化迁移至scanpy原生API。
- 有什么用: drop_in_transit假阳性率从80%降至0%,场景生成速度提升约10倍(973 scenes/41分钟),Pi0.5训练前置数据全部就绪;STAIG建立公平基准;Visium 6张可视化图正确产出。Slurm interactive job到期导致训练进程中断,需通过sbatch重新提交。
DCC
- 做了什么: 在MIHD项目修复STAIG超参数扫描的公平对比问题,并在claude-demo项目完成10x Visium 151676样本的scanpy分析脚本开发与可视化修复。
- 怎么做的: 通过读取日志和缓存文件发现pca_uni2_staig_fusion实际使用UNI而非UNI2;修改消融脚本支持gene/vision编码器参数配置;将Visium可视化从plt.savefig改为scanpy原生save参数保存。
- 有什么用: 建立PCA+UNI vs PCA+UNI2公平基准对比(ARI均值0.47),Visium 6张空间转录组图(QC、PCA、UMAP、空间表达)正确生成。
tianhe
- 做了什么: 诊断修复drop_in_transit_D0假阳性问题,将6任务训练场景生成从串行改造为32 worker并行(973 scenes/41分钟),完成Pi0.5-base LoRA微调流水线的数据准备,并短暂启动coffee/stack训练(因Slurm job到期中断)。
- 怎么做的: 编写GPU诊断脚本定位min_hold_height阈值问题;创建generate_training_scenes_parallel.py(ThreadPoolExecutor,4 GPU round-robin);通过SSH+tmux在an49/an50节点执行HDF5→LeRoBot转换、norm stats计算和训练启动;交叉分析parallel_logs与opportunity map完成失败根因文档。
- 有什么用: drop_in_transit假阳性消除(D0成功率10%→50%),973个训练scene就绪;Pi0.5的6任务数据流水线准备完成;失败根因文档为后续validator修复提供清晰方向;训练因Slurm限制中断需重提sbatch作业。
在DCC和tianhe两台HPC设备上同步推进四条主线:修复error recovery benchmark的drop_in_transit假阳性问题并以32 worker并行生成6任务973个训练场景(41分钟),搭建Pi0.5-base LoRA六任务合并数据集微调流水线(数据转换与norm stats完成,训练因Slurm job到期中断),修复STAIG超参数扫描不公平对比建立PCA+UNI/UNI2基准(ARI 0.47),以及开发10x Visium空间转录组scanpy分析脚本。
今日任务
架构与策略
- ✅ drop_in_transit_D0假阳性诊断与修复 — 通过GPU诊断脚本确认min_hold_height=0.85导致8/10机会为假阳性(物体在桌面z≈0.88>0.85),将5个error skill文件和config阈值统一提升至0.93(桌面0.80+物体高0.08+余量0.05),假阳性从80%降至0%,D0成功率从10%提升至50%(4/8)。
- ✅ 6任务训练误差场景并行批量生成 — 将串行脚本改造为支持–subtypes过滤参数的并行版本,创建generate_training_scenes_parallel.py(32 worker,4 GPU round-robin分配),在an50节点以nohup后台运行,41分钟生成973 scenes(128/130 worker成功),速度较串行提升约10倍。
- • Pi0.5-base LoRA合并数据集微调流水线搭建 — 重定向openpi05 conda环境.pth文件、向config.py添加12个merged configs(6任务各含finetune/inference),完成5任务HDF5→LeRoBot数据转换(coffee/stack/stack_three/three_piece_assembly 2000条,threading 1000条)和norm stats计算。在an49 tmux中启动coffee/stack训练,因Slurm interactive job到期所有进程被杀,需通过sbatch重新提交。
- ✅ 训练场景生成失败根因分析与文档 — 通过parallel_logs日志、opportunity map分布、meta.json交叉分析,识别5大根因(gripper_closed_norm异常P0级、drop碰撞检测不足、OSC位移响应不足、物体物理约束、threading phase不匹配),写入training_scene_failure_analysis.md,为后续validator修复提供可操作参考。
- ✅ STAIG超参数扫描公平对比修复 — 发现ablation脚本使用raw HVG 3000d而非PCA输入,且实验名称具有误导性(实际使用UNI而非UNI2)。修改脚本支持–gene_encoder和–vision_variant参数,分别以PCA+UNI和PCA+UNI2跑pseudo_k sweep,ARI均值均约0.47,建立公平基准。
- 🔄 pick_place作为第6个任务添加至训练流水线 — 修改train_pi05_merged.py、config.py和MimicGen配置(2000条D0,无D1变体)。数据生成在an49 GPU 0启动后因Slurm job到期中断(完成184/2000)。
实现与修复
- ✅ 10x Visium数据分析脚本开发与可视化修复 — 为151676样本编写scanpy分析脚本(QC、归一化、HVG、PCA/UMAP、空间可视化),修复spatial_gene_expression.png只有H&E背景无基因点的问题:将plt.savefig改为scanpy原生save参数,6张图正确生成。
- ✅ openpi Docker镜像构建与保存指南 — 阅读openpi的docs/docker.md、serve_policy.Dockerfile和compose.yml,汇总5个Dockerfile用途及对应build命令,以及docker save/load完整流程。
问题与解决方案
关键问题
1. drop_in_transit_D0仅生成极少有效场景,经诊断确认min_hold_height=0.85阈值过低,导致物体在桌面(z≈0.88)被误判为空中持有,80%机会为假阳性
解决方案: 将min_hold_height从0.85提升至0.93(桌面0.80+Milk物体高0.08+余量0.05),同步修改5个error skill文件和config;假阳性消除,D0成功率从10%提升至50%
关键洞察: pick_place任务中物体放在桌面上的z高度可超过简单设定的min_height,设计持握检测阈值必须考虑「桌面高度+物体自身高度」叠加并留足余量
2. 训练场景生成脚本完全串行,collision_eef_object subtype成功率极低(10分钟仅5个scene),6任务预计需6+小时
解决方案: 为脚本添加–subtypes过滤参数,创建ThreadPoolExecutor并行启动器(32 worker,4 GPU round-robin),41分钟完成全部973 scenes
关键洞察: MuJoCo EGL渲染是CPU密集型任务,同一节点可运行32+独立进程不冲突;subprocess-based并行比多线程更稳定,可充分利用48核CPU
3. Slurm interactive job到期后,通过SSH启动的训练进程和数据生成进程全部被杀,已进行的训练时间浪费
解决方案: 需通过sbatch提交正式job,或在allocated job内使用tmux保证进程持久性;pam_slurm_adopt策略会在job结束时kill所有相关进程,SSH nohup无法绕过
关键洞察: HPC集群Slurm资源隔离机制会强制清理job内所有进程,包括SSH连接的子进程;长时间训练任务必须用sbatch,不能依赖interactive job
4. 128/130 workers完成后仍有29个task×subtype组合完全缺失,threading仅生成3/29 subtype
解决方案: 交叉分析opportunity map与生成日志,区分两类失败:opportunity scan阶段未发现机会点 vs 生成阶段validator拒绝;优先修复gripper_closed_norm=0.00异常(P0级,可解锁8个组合)
关键洞察: 场景生成失败分为两阶段:opportunity scan(can_inject永为False)和validator拒绝;前者改can_inject条件,后者调阈值或注入参数,需区分处理
5. STAIG超参数sweep基线ARI(0.23)与聚类消融ARI(0.58)差距异常,实验名称’pca_uni2_staig_fusion’具有误导性:实际使用UNI而非UNI2,ablation脚本使用raw HVG而非PCA输入
解决方案: 修改ablation脚本新增–gene_encoder和–vision_variant参数,以PCA+UNI/UNI2重新跑sweep,ARI均值约0.47(合理范围),建立公平基准
关键洞察: 实验命名约定必须严格对应实现;命名误导会导致长期理解错误;需通过读取日志而非仅看实验名来确认实际实现
6. PickPlace任务没有MimicGen D1变体,无法按原计划生成D0+D1合并数据集
解决方案: 直接生成2000条D0数据,以总量等效替代D0+D1合并方案
关键洞察: 不同robosuite任务在MimicGen中的变体数量不一致,多任务数据策略需逐任务确认可用变体,总量等效是可行的工程决策
一般问题
7. Visium sc.pl.spatial生成的图片只显示组织H&E背景,没有基因表达点叠加
解决方案: 将sc.pl.*的保存方式从plt.savefig改为scanpy原生save参数(sc.settings.figdir + save参数),由scanpy内部pipeline处理spot渲染
关键洞察: scanpy的spatial plot必须通过其内部保存机制,绕过matplotlib直接保存会跳过spot渲染步骤
8. MUJOCO_EGL_DEVICE_ID=0与CUDA_VISIBLE_DEVICES=1不匹配导致import失败
解决方案: 将MUJOCO_EGL_DEVICE_ID改为与CUDA_VISIBLE_DEVICES一致(均设为1)
关键洞察: MUJOCO_EGL_DEVICE_ID必须是全局物理GPU ID,而非CUDA_VISIBLE_DEVICES映射后的序号
人类思路 vs AI 思路
战略层面
系统资源利用与效率优化的主动性
| 角色 | 思路 |
|---|---|
| 人类 | 用户主动察觉串行进程运行缓慢(10分钟仅5 scenes)并主动提出「现在完全可以做到32+并行」;同时察觉训练数据量仅1条异常并要求深入调查;从系统资源全局视角(48核CPU、4 GPU、充裕内存)主动驱动效率优化决策。 |
| AI | AI按串行计划执行,发现运行缓慢后仅设置30分钟定时检查并等待;对数据量异常需用户指出才启动诊断;缺乏对整体吞吐量和系统资源的主动评估。 |
差异分析: 人类从系统资源和整体效率视角主动提出优化方案;AI专注于当前任务完成性,缺乏对「可以做得更好」的主动评估意识
HPC进程持久性策略(Slurm机制理解)
| 角色 | 思路 |
|---|---|
| 人类 | 明确指出nohup via SSH不可靠,要求用tmux或Slurm保证terminal关闭后进程仍能运行,具备实际HPC使用经验,了解pam_slurm_adopt机制。 |
| AI | 最初使用nohup + & 通过SSH启动进程,没有考虑Slurm job到期的进程隔离机制。 |
差异分析: 人类了解HPC资源管理底层机制;AI只考虑了shell级别的进程后台运行,忽略了Slurm资源隔离
实验设计公平性与数据策略的直觉判断
| 角色 | 思路 |
|---|---|
| 人类 | 主动察觉ARI差距不合理(0.23 vs 0.58),直接质疑实验公平性并提出具体修复方案;在pick_place无D1变体时快速决定用2000条D0等效替代,不需要穷举技术可能性。 |
| AI | 未主动发现实验不公平性,被指出后才通过日志取证;在数据策略决策上倾向于探索更多可能性后再决策,比较保守。 |
差异分析: 人类凭实验设计全局视角快速做出实用决策;AI在执行层面应对但缺乏主动审查和快速决策意识
失败分析的目标导向深度
| 角色 | 思路 |
|---|---|
| 人类 | 要求将所有error的detector/injector/validator详细写入文档,目标是为后续修复提供可操作参考,以修复者视角要求分析深度。 |
| AI | 提供了失败subtype的统计列表和根因分类,但未主动将代码层实现细节整合进可操作的修复参考文档。 |
差异分析: 人类以「后续如何修复」为目标驱动文档内容;AI停留在现象描述层面
AI 局限性
重要局限
- 多次未能主动识别效率瓶颈并提出优化方案:串行场景生成缓慢时仅设定定时检查并等待(未提并行化);nohup SSH启动进程时未考虑Slurm job到期的资源隔离;均需用户主动指出后才改正,造成实际时间浪费。
- 未能主动发现实验配置与命名的不一致(‘pca_uni2_staig_fusion’实际使用UNI),以及meta.json统计(当前运行)与磁盘文件(历史积累)的差异,均需用户质疑后才通过日志取证确认。
一般局限
- 多次出现工具/API使用细节错误:scanpy spatial plot使用plt.savefig绕过内部渲染导致图片缺失;tyro布尔flag使用–resume=True格式导致训练脚本崩溃;MUJOCO_EGL_DEVICE_ID与CUDA_VISIBLE_DEVICES不匹配导致import失败。
- 在资源/工具不可用时(HuggingFace代理不稳定、TaskOutput工具调用失败、进度轮询)缺乏快速fallback策略,尝试多种方式失败后才给出替代建议,消耗较多时间。
今日收获
核心收获
- Slurm HPC集群的pam_slurm_adopt策略会在job结束时强制kill所有相关进程,SSH nohup无法绕过;长时间训练任务必须用sbatch提交正式job,不能依赖interactive job。
- 机器人操作场景生成的高度阈值设计必须考虑「桌面高度+物体自身高度」的叠加区间,简单设定min_height而不考虑具体物体堆叠高度会产生大量假阳性,导致有效场景极少。
- MuJoCo EGL仿真是CPU密集型任务,同一节点可运行32+独立进程不冲突;训练场景生成失败分为两阶段(opportunity scan阶段can_inject永为False vs validator拒绝),需区分处理:前者改can_inject条件,后者调阈值或注入参数。
- 实验命名约定必须严格对应实际实现;命名不一致(如’pca_uni2’实际用UNI)会导致长期实验理解错误,需通过读取日志而非仅看实验名来确认实际配置。
- MimicGen的D0/D1变体数量因任务而异(如PickPlace只有D0);设计多任务数据策略时需逐任务确认可用变体,总量等效(如2000条D0替代D0+D1各1000条)是可行的工程决策。
- 诊断数据生成问题时需区分「当前运行meta.json统计」与「磁盘历史积累文件数量」——两者差异巨大时说明问题在当前运行逻辑,而非历史遗留;并行任务日志建议每worker写独立文件,便于grep快速定位失败。
实践收获
- Scanpy的sc.pl.spatial等空间转录组可视化函数必须使用sc.settings.figdir + save参数保存,直接用plt.savefig会绕过内部图层渲染导致图片不完整。
会话摘要
Error Recovery Benchmark(场景修复与并行生成)
✅ drop_in_transit_D0假阳性修复 + 6任务训练场景串行改并行生成 + 失败根因分析 00:55:55.225 | claude_code 诊断确认min_hold_height=0.85导致大量假阳性(物体在桌面被误判为空中持有),将阈值提升至0.93后D0成功率从10%提升至50%。规划并执行6任务训练场景批量生成:先按串行方案执行发现极慢(10分钟5 scenes),用户提出并行化后AI改造为32 worker ThreadPoolExecutor(4 GPU round-robin),41分钟生成973 scenes(128/130 worker成功)。通过交叉分析parallel_logs与opportunity map识别5大失败根因(gripper_closed_norm异常P0级、drop碰撞检测不足等),输出training_scene_failure_analysis.md。
Error Recovery Benchmark(Pi0.5训练流水线)
🔄 Pi0.5-base LoRA合并数据集微调流水线:环境配置、数据转换与训练启动 01:08:53.326 | claude_code 全面调研openpi副本结构和现有数据集后,按计划执行:重定向openpi05 conda环境.pth文件、向config.py添加12个merged configs(6任务×finetune/inference)、完成5任务HDF5→LeRoBot转换和norm stats计算。在an49 tmux中启动coffee/stack训练,pick_place数据生成进行至184/2000,均因Slurm interactive job到期被杀。threading_d1因HuggingFace代理不可用暂以d0-only替代(加TODO注释)。
MIHD空间转录组
✅ STAIG超参数扫描公平对比修复:发现命名误导与gene输入不一致 14:40:59.838 | claude_code 用户发现超参数sweep基线ARI(0.23)与聚类消融(0.58)差距异常,AI通过读取日志确认pca_uni2_staig_fusion实际使用UNI而非UNI2,且ablation脚本使用raw HVG而非PCA输入。修改脚本支持–gene_encoder和–vision_variant参数后,以PCA+UNI和PCA+UNI2各跑pseudo_k sweep,两者ARI均值均约0.47,建立了公平基准。
claude-demo(Visium分析)
✅ 10x Visium 151676样本scanpy分析脚本开发与可视化修复 14:55:05.867 | claude_code 完成项目初始化(CLAUDE.md创建 + 修复错误symlink),为151676 Visium样本开发完整scanpy分析脚本(数据加载、QC、归一化、HVG、PCA/UMAP、空间可视化)。发现spatial_gene_expression.png只有H&E背景无基因点后,将所有sc.pl.*保存方式从plt.savefig改为scanpy原生save参数,6张图全部正确生成。
openpi VLA
✅ openpi项目Docker镜像构建与保存方法查询 04:50:34.000 | claude_code 阅读openpi的docs/docker.md、serve_policy.Dockerfile和compose.yml,整理了5个Dockerfile的用途及对应构建命令,以及docker save/docker load的完整导出加载流程。
Token 用量
总览
| 指标 | 数值 |
|---|---|
| 总 Token | 91,266,639 |
| 输入 Token | 55,409 |
| 输出 Token | 195,151 |
| Cache 创建 | 4,302,013 |
| Cache 读取 | 86,714,066 |
| Cache 命中率 | 95.3% |
| 总费用 (USD) | $61.6229 |
模型明细
| 模型 | 输入 | 输出 | Cache 创建 | Cache 读取 | 费用 | 占比 |
|---|---|---|---|---|---|---|
| claude-opus-4-6 | 29,725 | 121,342 | 3,083,310 | 71,441,071 | $58.1775 | 94.4% |
| claude-haiku-4-5-20251001 | 25,684 | 73,809 | 1,218,703 | 15,272,995 | $3.4454 | 5.6% |
各设备用量
| 设备 | 总 Token | 输入 | 输出 | 费用 |
|---|---|---|---|---|
| DCC | 5,601,785 | 1,456 | 12,539 | $4.3744 |
| tianhe | 84,460,618 | 53,908 | 180,837 | $56.3994 |
| TzJsDesktop | 1,204,236 | 45 | 1,775 | $0.8491 |