You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
编译期 selector 绑定 + plan 再校验(plan.py:387);PolicyABI + fingerprint(plan.py:229);hot-path 分配 / 地址稳定预算(spec.py:539、runtime.py:254);显式校验的 term DAG(plan.py:435);ManagedKernelBinding 拒绝向 task 代码暴露 backend / env / model handle(runtime.py:370)。
Finding 1(major,可维护性)— reward term 数学实现两遍,跨两个 tensor 框架
文件
if name == ... 分支数
框架
managed_reference.py
11
numpy
managed_fused.py
0
复用 reference
managed_device.py
11
torch
同一组 11 个 term 名(tracking_lin_vel、tracking_ang_vel、forward_progress、under_speed、lin_vel_z、base_height、pose、upper_body_pose、penalty_close_feet_xy、feet_phase、alive)在两个文件里各写一遍。
漂移风险:修改任一 reward 语义必须同步改两个文件、两种框架。生产路径(device)与 oracle 路径(reference)一旦不同步,differential test 是否覆盖到该 term 决定了错误能否被发现。
整改要求(可测)
reward term 数学单一定义,两个 profile 由同一份源码派生(或由代码生成保证一致)。
Part of #850. 审阅维度 1:从工业生产级仓库标准看 manager-based API 的结构化、可复用性、可维护性、可扩展性、接口划分清晰度与解耦程度。
全部结论在 PR worktree(head
25343d46)上实测到file:line。先说做对的部分
这些不是客套,是整改时不应回退的既有资产:
1. 通用层没有被 task / backend 污染
grep -rn -i "g1\|mjwarp\|walk_flat" src/unilab/manager/*.py仅 3 处命中,且全部是 docstring 或错误信息文本:通用 manager 层没有任何
if backend == ...分支。这在同类重构里是少见的克制,符合 CLAUDE.md「backend-specific 逻辑留在 backend / env 适配层」。2. G1 pilot 的冷路径确实共享,不是复制粘贴
managed_fused.py:70-90从managed_reference导入 19 个符号:selector、state requirement、kernel config、reset template、profile 校验、observation 宽度全部单一定义。「三份实现 = 三倍重复」的说法不成立,应予纠正。
3. 其他值得保留的机制
编译期 selector 绑定 + plan 再校验(
plan.py:387);PolicyABI+ fingerprint(plan.py:229);hot-path 分配 / 地址稳定预算(spec.py:539、runtime.py:254);显式校验的 term DAG(plan.py:435);ManagedKernelBinding拒绝向 task 代码暴露 backend / env / model handle(runtime.py:370)。Finding 1(major,可维护性)— reward term 数学实现两遍,跨两个 tensor 框架
if name == ...分支数managed_reference.pymanaged_fused.pymanaged_device.py同一组 11 个 term 名(
tracking_lin_vel、tracking_ang_vel、forward_progress、under_speed、lin_vel_z、base_height、pose、upper_body_pose、penalty_close_feet_xy、feet_phase、alive)在两个文件里各写一遍。漂移风险:修改任一 reward 语义必须同步改两个文件、两种框架。生产路径(device)与 oracle 路径(reference)一旦不同步,differential test 是否覆盖到该 term 决定了错误能否被发现。
整改要求(可测)
Finding 2(major,可扩展性)— 扩展点是「改 kernel 分支」而非「注册实现」
TermDefinition(manager/spec.py)字段恰为key、version、phase、role、parameters、state_requirements、output、mutation_templates、required_capabilities——无 callable。find src/unilab -type d \( -name mdp -o -name terms \)→ 空。未识别 reward 名在热路径抛错(
managed_reference.py分支链末端),而非编译期。一个 task 有 4,570 行 pilot 代码,却只对应 5 个
TermDefinition。详细分析与 mjlab 对照见 #852,本 issue 只登记其对可扩展性的影响。
整改要求(可测)
if name ==链。Finding 3(major,可维护性)— 两个 god module
manager/device_runtime.pymanager/runtime.pydevice_runtime.py单文件同时承载:runtime lifecycle、buffer 分配与地址稳定性、stream / event 编排、telemetry 与 counters、mutation 提交、reset 阶段、graph 交互、episode length 缓冲。具体证据:
record_stream唯一调用点在device_runtime.py:1141,位于set_episode_length_buffer(def:1111)——buffer 生命周期管理与 runtime 主循环同处一个文件;stream / event 一次性构造在:881-895。整改要求(可测)
device_runtime.py拆分为职责单一的单元(至少分离 buffer/stream 所有权、telemetry、mutation 提交),单文件 ≤ 800 行。manager/内不存在 > 1000 行文件。Finding 4(minor,接口划分)— 再导出面偏大
__all__条目src/unilab/base/backend/__init__.pysrc/unilab/manager/__init__.pybase/backend/__init__.py本次 +297 行,主要是再导出。139 个公开名意味着几乎全部内部类型都成为公开 API 面,后续任何重命名都是破坏性变更。整改要求(可测)
__all__。Finding 5(minor,解耦)— reward weight 不在 manager 契约内
grep -ric weight src/unilab/manager/→ 0。reward weight 以_G1KernelConfig.reward_termstuple 形式存在于 task kernel config,未进入 plan / spec,也未进入PolicyABIfingerprint。后果:改变 reward weight 不会使 checkpoint ABI 失效,但会改变训练语义。
整改要求(可测)
Finding 6(minor,可测试性)— 关键并发不变量无断言
record_stream:生产唯一调用点device_runtime.py:1141;grep -rn "record_stream" tests/→ 0。其失效模式是 use-after-free 竞态导致偶发错值,不是崩溃,现有 counter 与两个显存上限均检测不到。:881-895):代码成立但无测试固定;若某调用点开始每步新建Stream()/Event(),warm_numeric_allocations、backend_allocations、memory_allocated、memory_reserved全部不会变化。整改要求(可测)
is比对)且创建次数固定。set_episode_length_buffer的测试;移除record_stream该测试必须失败。Roadmap
device_runtime.py,为后续所有改动降低成本。非目标