errm / docs /DEVELOPMENT_LOG.md
yuffish's picture
Add files using upload-large-folder tool
a741a7c verified

开发日志 - Development Log

记录项目开发历程、重要决策和关键里程碑


📅 时间线总览

2025-10 ━━ 项目初期探索
2025-11 ━━ 核心系统开发
2026-01 ━━ 文档完善和规模化准备

2026 年 1 月

2026-01-20: 文档系统完善

完成工作

  • ✅ 创建完整的代码指南(CODE_GUIDE.md)
  • ✅ 创建项目状态快照(PROJECT_STATUS.md)
  • ✅ 完善数据源说明(dataset_source.md)
  • ✅ 创建开发日志(DEVELOPMENT_LOG.md)

目标

  • 为 AI Agent 提供完整的项目理解文档
  • 方便后续快速上手和协作

2025 年 11 月

2025-11-11: Special Token v2 训练

训练配置

  • 模型版本:Special Token v2
  • Checkpoint:checkpoint-70
  • 训练数据:~100 条样本

改进点

  • 完整 merge 版本
  • 更好的 token 格式

输出

  • 权重保存在:weights_reward_sft_special_token/v2-20251110-235126/

决策

  • 使用特殊 token 格式可以更好地结构化输出
  • 但需要更多训练数据才能看到明显效果

2025-11-10: 改进版训练和 Special Token 实验

Special Token v1 训练

训练配置

  • 模型版本:Special Token v1
  • Checkpoint:checkpoint-70
  • 数据格式:使用特殊 token 标记(如 <|stage|>, <|reward|>

输出

  • 权重:weights_reward_sft_special_token/v1-20251110-234131/

观察

  • Special token 格式有助于模型理解结构化输出
  • 但需要在推理时正确解析 token

Special Token v0 训练

时间:2025-11-10 23:21

训练配置

  • 模型版本:Special Token v0
  • Checkpoint:checkpoint-7

输出

  • 权重:weights_reward_sft_special_token/v0-20251110-232149/

改进版 SFT 训练(v1)

时间:2025-11-10 23:01

训练配置

  • 模型版本:v1
  • Checkpoint:checkpoint-7
  • 数据:改进版标注数据(~100 条)

改进点

  • 使用滑动窗口标注的数据
  • 更准确的奖励组件对齐

输出

  • 权重:weights_reward_sft/v1-20251110-230134/

决策

  • 确认滑动窗口标注模式的有效性
  • 决定在扩大数据规模时继续使用此模式

2025-11-05: 基础版 SFT 训练(v0)

时间:2025-11-05 17:12

训练配置

  • 模型版本:v0(基础版)
  • Checkpoint:checkpoint-28
  • 数据:基础版标注数据(~100 条)

输出

  • 权重:weights_reward_sft/v0-20251105-171242/

里程碑

  • 🎉 首次完成端到端训练
  • 验证了整个流程的可行性:数据提取 → 标注 → 训练

观察

  • 小规模数据训练的模型性能有限
  • 需要扩大数据规模

决策

  • 继续改进标注系统
  • 准备扩大数据规模

2025 年 10 月

2025-10-xx: 改进版标注系统开发

关键改进

  1. 动态任务描述

    • 自动从 metadata JSON 提取任务描述
    • 动态插入到 GPT prompt
    • 提高标注的任务相关性
  2. 滑动窗口分析

    • 引入 WINDOW_SIZE 和 WINDOW_STRIDE 参数
    • 连续帧分析,捕捉时序动态
    • 上下文传递机制
  3. 奖励指标对齐

    • 与仿真数据对齐:5 个奖励组件
    • 6 个操作阶段定义
    • 综合指标计算

输出脚本

  • api_batch_improved.py
  • api_batch_improved_v2.py(Claude 版本)

决策依据

  • 单次标注所有帧无法捕捉运动平滑度
  • 需要时序信息来判断进度和趋势
  • 仿真数据的奖励定义更精确,应该对齐

2025-10-xx: 数据统计和分析

完成工作

  • DROID 失败轨迹统计脚本(count_failure_trajectories.py
  • 视频帧率统计脚本(check_video_framerate.py

发现

  • 总共 15,157 条 failure 轨迹
  • 主要数据源:AUTOLab (23.9%), PennPAL (16.5%)
  • Top 任务类型:Move object into container (2,699 条)

决策

  • 使用 balanced 采样策略确保任务类型覆盖
  • 优先处理高频任务类型

2025-10-xx: HuggingFace 数据集工具开发

开发工具

  • prepare_hf_dataset.py:数据集准备和采样
  • upload_to_huggingface.py:上传到 HuggingFace Hub
  • quick_start.sh:一键运行脚本

采样策略设计

  1. balanced:每个任务类别采样相同数量
  2. random:完全随机采样
  3. proportional:按原始分布比例采样

决策

  • 推荐使用 balanced 策略保证任务多样性
  • 提供灵活的配置选项

文档

  • data_sta/README_HF_DATASET.md
  • data_sta/UPLOAD_GUIDE.md

2025-10-xx: 基础标注系统开发

开发脚本

  • api.py:单视频标注(原型)
  • api_batch.py:批量视频标注(基础版)

功能

  • 从视频提取帧
  • 调用 GPT-4o API 进行标注
  • 输出 JSONL 格式

问题

  • 无法捕捉时序动态
  • 任务描述固定,不够灵活
  • 奖励指标定义不够清晰

决策

  • 需要改进标注系统 → 引入滑动窗口

2025-10-xx: 数据处理流水线开发

开发脚本

  1. video_process.py:从 TFDS 提取视频
  2. extract_frames_to_images.py:提取帧图片
  3. convert_to_sft.py:转换为 SFT 训练格式

设计决策

  1. 视频提取

    • 拼接 wrist_image_left + exterior_image_1_left
    • 15fps,h264 编码
    • 保存元数据 JSON
  2. 帧提取

    • 支持 mirror 和 flat_hash 两种存储模式
    • 生成索引文件方便追溯
  3. 格式转换

    • 两阶段转换:中间格式 → 最终格式
    • 适配 ms-swift 训练框架

2025-10-xx: 项目启动

初始目标

  • 训练一个奖励模型用于机器人操作
  • 输入:视频帧
  • 输出:阶段、奖励、失败检测

技术选型

  • 基座模型:Qwen-VL(开源 + 性能平衡)
  • 标注工具:GPT-4o(高质量 ground truth)
  • 训练框架:ms-swift(简单易用)
  • 数据集:DROID(真机数据)+ 仿真数据

关键决策

  1. 使用 GPT-4o 生成标注而非人工标注

    • 原因:成本低、速度快、可扩展
    • 风险:质量需要验证
  2. 采用 SFT 而非从头训练

    • 原因:数据量有限(数千条)
    • 风险:基座模型的 bias
  3. 真机数据 + 仿真数据混合

    • 原因:仿真数据标注精确,真机数据真实
    • 风险:域迁移问题

重要决策记录

决策 1: 使用滑动窗口标注模式

时间:2025-11-05

背景

  • 基础版一次性标注所有帧无法捕捉运动平滑度
  • 需要时序信息判断进度和趋势

决策

  • 引入滑动窗口(WINDOW_SIZE=5, STRIDE=3)
  • 上下文传递机制

结果

  • ✅ 标注质量明显提升
  • ✅ 能够捕捉运动的连续性
  • ⚠️ API 调用成本增加(但可接受)

决策 2: 对齐仿真奖励指标

时间:2025-10-xx

背景

  • 仿真数据有精确的奖励组件定义
  • GPT 标注缺乏统一标准

决策

  • 定义 5 个奖励组件:reachout, grasp, collision, fall, smooth
  • 定义 6 个操作阶段:reach, grasp, lift, move, place, retract
  • 在 prompt 中明确指导 GPT 遵循此标准

结果

  • ✅ 标注更加结构化
  • ✅ 便于与仿真数据混合训练
  • ⚠️ 需要验证 GPT 理解是否准确

决策 3: 采用 Special Token 格式

时间:2025-11-10

背景

  • JSON 格式输出有时不稳定
  • 需要更明确的结构化输出标记

决策

  • 引入特殊 token:<|stage|>, <|reward|>
  • 在训练数据中使用此格式

结果

  • ⚠️ 效果待验证(数据量太小)
  • ✅ 理论上应该有帮助
  • ❌ 推理时需要额外的 token 解析

后续行动

  • 等待大规模训练后再评估效果

决策 4: HuggingFace 数据集管理

时间:2025-10-xx

背景

  • 数据分散在本地,不便管理
  • 希望公开数据集供社区使用

决策

  • 开发 HuggingFace 数据集准备工具
  • 采用 balanced 采样策略
  • 提供完整的上传流程

结果

  • ✅ 数据管理更加规范
  • ✅ 便于后续扩展
  • ⏳ 尚未正式上传到 HuggingFace(等待大规模标注)

技术栈演进

标注工具

阶段 工具 原因
初期 GPT-4o 高质量、可扩展
中期 + Claude 备选方案
未来 + 本地 Qwen-VL 降低成本

训练框架

阶段 框架 原因
初期 ms-swift 简单易用,快速验证
未来 可能迁移到其他框架 根据需求调整

遇到的问题和解决方案

问题 1: GPT 标注不一致

现象

  • 同一视频多次标注结果不同
  • stage 有时会跳跃或倒退

分析

  • GPT 理解有随机性
  • prompt 不够明确

解决方案

  • 降低 temperature(0.1)
  • 在 prompt 中强调 stage 单调性
  • 使用滑动窗口 + 上下文传递

状态:⚠️ 部分改善,仍需人工质量评估


问题 2: 数据量不足

现象

  • 当前只有 ~100 条训练数据
  • 模型性能有限

分析

  • 标注成本和时间限制

解决方案

  • 优先扩大标注规模(目标 2500+ 条)
  • 采用 balanced 采样保证多样性

状态:⏳ 待执行


问题 3: Success vs Failure 不平衡

现象

  • 当前主要是 failure 数据
  • Success 数据严重不足

分析

  • 项目初期聚焦于失败检测
  • DROID 数据集 failure 更容易识别

解决方案

  • 从 DROID success 目录采样
  • 目标比例:success:failure = 1:2

状态:📋 待执行


经验教训

✅ 做对的事

  1. 早期建立完整流水线

    • 从数据提取到训练的端到端流程
    • 便于快速迭代
  2. 使用 GPT 生成标注

    • 成本低、速度快
    • 质量可控(通过 prompt 工程)
  3. 滑动窗口标注

    • 显著提升标注质量
    • 捕捉时序动态
  4. 完善的文档

    • 便于协作和知识传递
    • AI Agent 可快速上手

⚠️ 可以改进的

  1. 应该更早进行质量评估

    • 应该在标注 100 条后就进行人工抽检
    • 避免大规模标注后发现质量问题
  2. 应该更早扩大数据规模

    • 100 条数据训练效果有限
    • 应该尽快扩展到 1000+ 条
  3. 应该更早整合仿真数据

    • 仿真数据标注精确,应该充分利用
    • 真机 + 仿真混合训练可能效果更好

下一步计划

详见:NEXT_STEPS.md

优先级 P0

  1. ⏳ 扩大标注规模(100 → 2500+ 条)
  2. ⏳ 人工质量评估(Golden Set)
  3. ⏳ 大规模模型训练
  4. ⏳ 建立评估体系

参考资料

相关论文

  • DROID Dataset Paper
  • Vision-Language Models for Robotics
  • Reward Modeling for RL

相关项目

  • OpenVLA
  • RT-1, RT-2
  • ALOHA

附录

命名约定

  • labels_*.jsonl:标注文件
  • sft_*.json:SFT 训练数据
  • v<N>-<YYYYMMDD>-<HHMMSS>:模型版本命名
  • checkpoint-<N>:训练检查点

目录结构约定

project_root/
├── api_*.py          # API 调用脚本
├── video_*.py        # 视频处理脚本
├── extract_*.py      # 提取脚本
├── convert_*.py      # 转换脚本
├── data/             # 本地数据
├── data_sta/         # 数据统计工具
├── output/           # 输出文件
├── weights_*/        # 模型权重
├── docs/             # 文档
└── caption/          # 视频描述生成

最后更新:2026-01-20