third_party 目录说明
本目录用于存放 IB_Robot 对上游第三方依赖的受控定制内容。
当前目录下主要维护的是 LeRobot 的补丁栈:
third_party/
└── patches/
└── lerobot/
├── INDEX.yaml
└── v0.5.1/
├── 0001-*.patch
├── 0002-*.patch
├── ...
├── manifest.yaml
├── series.txt
├── series.master-parity-candidates.txt
└── series.openharmony-5.1.0-musl.txt
设计目标
third_party 不是简单的“源码备份目录”,而是把对上游依赖的本地改造以 可审计、可选择、可复现 的方式管理起来。
以 third_party/patches/lerobot/ 为例,这套机制主要解决三个问题:
- 在不直接长期分叉上游仓库的前提下,为
libs/lerobot叠加 IB_Robot 所需改造。 - 针对不同平台或运行场景,按条件选择需要应用的补丁,而不是所有主机都打同一套补丁。
- 将旧分支中沉淀的功能迁移拆分为独立 patch,便于逐个验证、逐个纳管。
LeRobot 补丁栈总览
1. INDEX.yaml
位置:third_party/patches/lerobot/INDEX.yaml
作用:
- 作为 LeRobot patch stack 的上层索引。
- 指定当前激活的上游 tag,例如
active_tag: v0.5.1。 - 将 tag 字符串映射到实际目录,例如
v0.5.1 -> third_party/patches/lerobot/v0.5.1/。 - 记录该 tag 对应的上游 commit 与默认分支名。
它是整个补丁栈的入口。scripts/setup/lerobot_patches.sh 不会直接硬编码某个 tag 目录,而是先通过 scripts/setup/lerobot_resolve_active.py 解析 INDEX.yaml,再进入对应版本目录。
2. <tag>/000x-*.patch
例如:
0001-python-compat-syntax-and-metadata.patch0004-openharmony-lazy-import-policy-stack.patch0005-compat-add-npu-device-detection.patch0011-knowledge-distillation.patch
这些文件是 真正修改 LeRobot 源码的补丁单元。
它们具有以下特点:
- 由
git format-patch导出,是标准 mailbox patch。 - 设计给
git am直接应用,而不是普通git diff文本。 - 一个 patch 对应一个相对独立的逻辑改动,便于审查、回滚和组合。
按内容大致可以分成几类:
Python 兼容性补丁
0001:把 Python 3.12-only 语法和元数据降到 Python 3.11 可用。0002:继续把最低 Python 版本要求降到 3.10。0003:为 Python 3.10 回补typing.Unpack兼容层。
这类 patch 解决的是“能否安装、能否解释执行”的问题,不直接增加业务功能。
平台运行时补丁
0004:为 OpenHarmony 板端推理路径做 lazy import,减少板端运行时依赖压力。
这类 patch 面向特定平台运行时,重点是裁剪不必要的训练期或数据集依赖。
设备能力补丁
0005:给 LeRobot 的device_utils.py增加npu识别与选择能力。
这类 patch 主要解决设备发现与设备选择问题,是 Ascend/NPU 接入的基础能力。
训练栈迁移补丁
0009:自适应样本加权的前置改造。0010:weighted training 与量化约束相关扩展。0011:知识蒸馏训练支持。0014:训练过程 TensorBoard 日志。
这类 patch 主要作用在训练配置、训练脚本和 policy training forward 路径上。
模型与工具扩展补丁
0012:恢复mt_act模型族。0013:恢复 attention visualization 等研发工具。
这类 patch 更偏模型能力恢复或研发辅助工具,不一定进入默认运行时补丁栈。
3. <tag>/series*.txt
这些文件是 补丁装配顺序表,决定“按什么顺序尝试应用哪些 patch”。
series.txt
默认补丁序列。
它代表常规 setup.sh / 默认环境下使用的补丁候选集合,但是否最终应用,还要继续经过 manifest.yaml 的条件过滤。
series.master-parity-candidates.txt
主线迁移候选序列。
它用于保存从旧 lerobot_ros2 历史中抽取出来、但暂时 不进入默认补丁栈 的功能 patch。适合做 feature migration 和 master parity 验证。
series.openharmony-5.1.0-musl.txt
OpenHarmony 5.1.0 musl 运行时专用序列。
目前只包含板端实际验证所需的最小 patch 集合,用于尽可能保持上游 Python 3.12 行为,同时只修复板端推理真正依赖的问题。
4. <tag>/manifest.yaml
这是 每个 tag 目录下最核心的元数据文件。
它负责描述:
- 当前 patch 栈绑定到哪个上游 tag 和 commit 范围。
- 这些 patch 的来源分支、参考 commit、应用方式。
- 支持哪些 profile,例如
openharmony、ascend、training、distillation。 - 每个 patch 的用途与适用条件。
可以把它理解成“补丁栈契约”。
其中最关键的是 patches: 段。每个 patch 都会声明:
file:patch 文件名。purpose:这个 patch 为什么存在。applies_to:该 patch 在什么条件下才允许应用。
applies_to 目前支持:
python_minpython_maxprofiles
这意味着:
series.txt只定义“候选顺序”。manifest.yaml决定“当前主机是否真的应该应用这个 patch”。
例如:
- Python 兼容补丁只应在低版本 Python 主机上生效。
- OpenHarmony lazy-import 补丁只应在
openharmonyprofile 下生效。 - 训练相关 patch 不应无条件打到纯推理场景。
实际应用流程
LeRobot patch stack 的生效路径大致如下:
scripts/setup/lerobot_patches.sh读取third_party/patches/lerobot/INDEX.yaml。scripts/setup/lerobot_resolve_active.py解析当前激活 tag。- 进入对应目录,例如
third_party/patches/lerobot/v0.5.1/。 - 根据目标 profile 选择一条
series*.txt。 - 使用
scripts/setup/lerobot_filter_series.py按manifest.yaml中的python_min/python_max/profiles过滤 patch。 - 对保留下来的 patch 按顺序执行
git am。
因此:
- 目录中的 patch 不会无条件全部应用。
- 同一个 tag 目录下可以同时维护多条 patch profile。
- 平台差异由
series*.txt + manifest.yaml联合表达,而不是复制多份源码。
为什么要这样做
相比直接长期维护一个打满补丁的 libs/lerobot 分支,这种方案的优点是:
- 可审计:每个改动都是独立 patch,有清晰的标题、作者、用途和适用边界。
- 可裁剪:不同主机只应用自己需要的 patch。
- 可迁移:旧功能可以逐个迁移、逐个验证,而不是一次性整包回灌。
- 可升级:未来升级到新的 LeRobot tag 时,可以新建一个 tag 目录并逐步搬运 patch。
当前目录的建议理解方式
如果只看 third_party/patches/lerobot/v0.5.1/,可以把里面的文件理解为三层:
000x-*.patch:真正的代码改动。series*.txt:针对不同场景的 patch 装配清单。manifest.yaml:patch 的契约、用途和适用范围说明。
再往上一层:
INDEX.yaml:整个 LeRobot patch stack 的版本入口与激活开关。
维护约定
- 新增 LeRobot 改动时,优先以新 patch 的形式纳入
third_party/patches/lerobot/<tag>/。 - patch 编号在同一个 tag 目录下全局递增,不要求连续回填空号。
- 变更 patch 后,通常需要同步更新:
series*.txtmanifest.yamlscripts/setup/tests/test_lerobot_filter.sh
- 不应仅因为本地改了
libs/lerobot,就在根仓直接提交新的 submodule gitlink;更推荐把改动导出为受控 patch。
相关文件
third_party/patches/lerobot/INDEX.yamlthird_party/patches/lerobot/v0.5.1/manifest.yamlthird_party/patches/lerobot/v0.5.1/series.txtthird_party/patches/lerobot/v0.5.1/series.master-parity-candidates.txtthird_party/patches/lerobot/v0.5.1/series.openharmony-5.1.0-musl.txtscripts/setup/lerobot_patches.shscripts/setup/lerobot_resolve_active.pyscripts/setup/lerobot_filter_series.py