Repository navigation
Conversation
There was a problem hiding this comment.
AI Review
🟡 建议修改
发现有明确证据的问题,建议核对并处理。
已确认 6 个问题,其中 4 个已添加到对应代码行。
变更概览
本次变更主要包含:
- 本批新增 model_examples/OpenPi/README.md,提供在 HCU 容器环境中部署 OpenPI 训练的文档说明,包括基础镜像与容器创建、源码与 TurboPhysAI 安装、Python 依赖安装,以及 LIBERO 数据集和 PI0.5 权重下载(含断点续传脚本)等步骤。
- 新增 OpenPi 示例 README,提供权重下载(含断点续传与重试)、应用 Transformers 补丁、JAX 权重转 PyTorch、归一化统计计算及 tokenizer 下载的操作步骤,并说明 Python 3.10 的 datetime.UTC 兼容设置。
- 新增 model_examples/OpenPi/README.md,提供端到端示例文档:PaliGemma tokenizer 下载、独立 BLAS 包的安装脚本(解压并以软链接提供 librocblas 库路径),以及通过 turbo-physai run 按显式配置或模型名方式启动 torchrun 训练的命令与目录结构说明。
- 新增 OpenPi 示例资源的 norm_stats.json 与 requirements.txt,声明 openpi 运行所需 JAX/Flax 等第三方依赖的确切版本
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py |
新增 · +94/-0 | P2 × 1 |
turbo_physai/optimizations/models/openpi/network.py |
新增 · +36/-0 | P2 × 1 |
turbo_physai/optimizations/models/openpi/torch_runtime/hip_libraries.py |
新增 · +63/-0 | P2 × 1 · P3 × 1 |
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py |
新增 · +101/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/torch_runtime/siglip_lookup.py |
新增 · +71/-0 | P3 × 1 |
model_examples/OpenPi/README.md |
新增 · +520/-0 | — |
turbo_physai/optimizations/models/openpi/deferred_metric_sync.py |
新增 · +317/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +244/-0 | — |
turbo_physai/optimizations/models/openpi/numa_topology.py |
新增 · +219/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +186/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/gate_lookup.py |
新增 · +176/-0 | — |
turbo_physai/optimizations/models/openpi/startup_hooks.py |
新增 · +168/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +164/-0 | — |
turbo_physai/optimizations/models/openpi/rope_trig_cache.py |
新增 · +132/-0 | — |
turbo_physai/optimizations/models/openpi/clip_grad_scale.py |
新增 · +118/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +116/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_backward_candidate.py |
新增 · +112/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py |
新增 · +103/-0 | — |
turbo_physai/optimizations/models/openpi/common.py |
新增 · +102/-0 | — |
turbo_physai/optimizations/models/openpi/batched_adamw.py |
新增 · +99/-0 | — |
其余 45 个文件未逐项展开。
无法定位到 diff 行的问题(2)
P3 · 候选配置列表被覆盖,schedule/split 候选从未参与基准
- 文件:
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py(无法安全定位到当前 diff 行) - 触发条件:每次命中新配置执行校准搜索循环时(首次调用对应的 softmax 入口)。
- 证据与影响:先将 schedule、split 候选构建进 options 并 += 追加,但随后一行 options = [dict(kind='oneexp', x=16, w=4)] 直接整体重新赋值覆盖,for c in options 实际只遍历 oneexp 一项,前两组候选成死代码。 除 oneexp 外的调度/分块配置不会被测速或数值校验,自动调优退化为单点验证;报告中这些配置缺失,可能错过匹配且更快的 kernel,但已选配置仍经数值比对,不影响输出正确性。
- 修改建议:将覆盖赋值改为追加(options += [dict(kind='oneexp', x=16, w=4)]),使全部候选参与搜索;若确认仅需 oneexp,则删除前两行无效构建代码并更新报告逻辑。
P3 · 共享缓存文件非原子写入存在并发导入竞态
- 文件:
turbo_physai/optimizations/models/openpi/torch_runtime/siglip_lookup.py(无法安全定位到当前 diff 行) - 触发条件:多进程/多 rank 同时启用 siglip_gelu_lookup 并共享同一缓存目录,首次或并发调用本构建路径时
- 证据与影响:按 digest 命名后无条件执行 p.write_text(code),write_text 以截断方式写且非原子,未检查文件已存在、无锁或临时文件,随后立即 spec.loader.exec_module(mod) 导入同一文件 一个进程截断写入期间另一进程导入同名文件,可能读到不完整内容,训练启动时偶发模块加载或语法错误并中断
- 修改建议:先写入临时文件再 os.replace 原子替换,写前检查已存在则跳过重写;必要时对共享目录加文件锁
审查信息
- 变更统计:65 个文件,+4780/-0。
- 覆盖情况:共 65 个文件,已完整审查 65 个。
- 候选问题:8 项;证据复核过滤:2 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
| (root/f'gate_unmatched_rank{rank}_{key[:12]}.json').write_text(json.dumps({'key':key,'source':source},indent=2)) | ||
| return result | ||
| assert tuner.device_props.cc=='gfx938' and tuner.device_props.multi_processor_count==64 | ||
| assert all(x.dtype==torch.bfloat16 and x.is_contiguous() and x.numel()==507510784 for x in args if isinstance(x,torch.Tensor)) |
There was a problem hiding this comment.
P2 · 守卫断言命中即抛异常崩溃,未按声明回退原生调用
触发条件: 策略按 key 命中(choice 非 None),但运行硬件或张量与硬编码条件不符:非 gfx938/multi_processor_count≠64,或门控输入 numel≠507510784、非 bf16、不连续;或以 python -O 运行。
证据与影响: key 仅由源码哈希加 fp fusion 标志构成,与形状和硬件无关;choice 命中后直接执行 assert cc=='gfx938'、assert numel()==507510784 等硬编码断言,不满足即抛 AssertionError,而此时 result=original(...) 已算出却不返回。docstring 明确声明 'retain native calls for every other case'。 同一门控表达式在其他 batch/序列长度或不同硬件上运行时训练直接崩溃,而非按文档回退原生路径;python -O 下这些守卫被剥离使校验完全失效。
修改建议: 将断言改为条件回退:任一守卫不满足时记录 unmatched 信息并 return result(原生结果),仅在全部校验通过后进入查表派发路径。
| for candidate in ("ens14f0", "eth0"): | ||
| if os.path.isdir(f"/sys/class/net/{candidate}"): | ||
| return candidate | ||
| return "lo" |
There was a problem hiding this comment.
P2 · 网卡自动探测失败时静默回退到回环接口
触发条件: 未设置 OPENPI_NETWORK_IFACE,且主机网卡既无 ens14f0 也无 eth0(如 eno1/ib0 等命名)时执行进程组初始化
证据与影响: _select_interface 依次探测 ens14f0、eth0,最后 return "lo";wrapped 将该结果无条件写入 NCCL_SOCKET_IFNAME 和 GLOO_SOCKET_IFNAME,回环接口无法承载跨节点通信 多机训练时 NCCL/GLOO 绑定到回环接口,跨节点建链失败,任务挂起或报出难以定位的错误,且无任何警告提示发生了回退
修改建议: 无可用物理网卡时抛出明确错误或输出警告提示需设置 OPENPI_NETWORK_IFACE,而不是静默回退到回环接口
| cache_root = Path( | ||
| os.environ.get( | ||
| "OPENPI_TORCH_KERNEL_CACHE_DIR", | ||
| str(Path(tempfile.gettempdir()) / "openpi_turbo_kernels"), |
There was a problem hiding this comment.
P2 · 默认内核缓存位于共享临时目录,.so 可被本地用户预先替换
触发条件: 多用户共享的 GPU 节点,进程用默认缓存路径首次或后续加载内核时。
证据与影响: 默认 cache_root 为 tempfile.gettempdir()/openpi_turbo_kernels,mkdir(exist_ok=True) 后仅 library.is_file() 即返回路径供加载,无属主或完整性校验;/tmp 世界可写且目录可被他人预先创建。 恶意本地用户可预建目录或替换该 .so,后续进程将其交给加载器执行,形成本地任意代码执行。
修改建议: 缓存目录按用户隔离(如路径加入 uid 并设 0700),或返回前校验文件属主后再加载。
| return library | ||
| temporary = cache_root / f".{library_stem}-{identity}-{os.getpid()}.building.so" | ||
| command = [compiler, *_FLAGS, str(source), "-o", str(temporary)] | ||
| subprocess.run(command, cwd=source.parent, check=True) |
There was a problem hiding this comment.
P3 · OPENPI_TORCH_KERNEL_CACHE_DIR 为相对路径时编译输出路径错位
触发条件: 用户把该环境变量设为相对路径,且对应库尚未编译需触发构建。
证据与影响: subprocess.run 以 cwd=source.parent 执行编译,相对的 temporary 输出按该子进程 cwd 解析;而 os.replace(temporary, library) 按进程原工作目录解析,同一相对路径指向不同位置。 编译输出写错位置导致 os.replace 抛 FileNotFoundError,库构建失败;源码目录旁可能残留中间产物。
修改建议: 计算 cache_root 后先调用 resolve() 转为绝对路径再执行 mkdir、编译与替换。
There was a problem hiding this comment.
AI Review
🟡 建议修改
发现有明确证据的问题,建议核对并处理。
已确认 4 个问题,其中 3 个已添加到对应代码行。
变更概览
本次变更主要包含:
- 新增 OpenPI 应用说明文档,提供在 HCU 容器中创建运行环境、安装依赖、下载 LIBERO 数据集与 PI0.5 权重并接入 TurboPhysAI 优化的操作流程。
- 新增 OpenPi 示例 README 文档,说明权重分片下载(含断点续传与重试)、应用 Transformers 补丁、JAX 权重转 PyTorch、计算归一化统计及下载 PaliGemma tokenizer 等环境准备步骤,包含 Python 3.10 下补充时间常量的兼容处理。
- 本批新增 OpenPi 示例 README,包含下载 PaliGemma tokenizer、安装独立 BLAS 优化包的命令,以及通过 turbo-physai run 以显式配置或按模型名两种方式启动 8 卡训练的步骤和目录结构说明。
- 本批在 model_examples/OpenPi 下新增 OpenPi 示例所需的归一化统计配置 norm_stats.json 与独立运行依赖清单 requirements.txt,并在 turbo_physai/optimizations/models/openpi 下新增优化包的初始化模块。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
turbo_physai/optimizations/models/openpi/network.py |
新增 · +36/-0 | P2 × 1 |
turbo_physai/optimizations/models/openpi/torch_runtime/hip_libraries.py |
新增 · +63/-0 | P2 × 1 · P3 × 1 |
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py |
新增 · +101/-0 | P3 × 1 |
model_examples/OpenPi/README.md |
新增 · +520/-0 | — |
turbo_physai/optimizations/models/openpi/deferred_metric_sync.py |
新增 · +317/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +244/-0 | — |
turbo_physai/optimizations/models/openpi/numa_topology.py |
新增 · +219/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +182/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/gate_lookup.py |
新增 · +176/-0 | — |
turbo_physai/optimizations/models/openpi/startup_hooks.py |
新增 · +168/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +160/-0 | — |
turbo_physai/optimizations/models/openpi/rope_trig_cache.py |
新增 · +132/-0 | — |
turbo_physai/optimizations/models/openpi/clip_grad_scale.py |
新增 · +118/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +116/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_backward_candidate.py |
新增 · +112/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +109/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py |
新增 · +103/-0 | — |
turbo_physai/optimizations/models/openpi/batched_adamw.py |
新增 · +99/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py |
新增 · +94/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/torch_gate_shared.hip |
新增 · +88/-0 | — |
其余 41 个文件未逐项展开。
无法定位到 diff 行的问题(1)
P3 · 候选配置列表被整体覆盖,仅单一候选参与选型
- 文件:
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py(无法安全定位到当前 diff 行) - 触发条件:运行时安装执行 softmax 微基准选型时。
- 证据与影响:代码先构建 schedule/split 两类候选(options += [...]),随后紧跟 options = [dict(kind='oneexp', x=16, w=4)],将整个列表替换为单一 oneexp 候选,前两组候选未被测量即被丢弃,疑似调试期遗留的临时覆盖。 schedule/split 候选及其 launch 分支成为不可达死代码,选型退化为仅对比 oneexp 与原生实现,策略选择空间与预期不符,调优收窄。
- 修改建议:确认意图:若需多候选测速,将赋值改为追加(+=);若刻意只保留 oneexp,删除前面无效的候选构建代码。
审查信息
- 变更统计:61 个文件,+4648/-0。
- 覆盖情况:共 61 个文件,已完整审查 61 个。
- 候选问题:12 项;证据复核过滤:8 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
| for candidate in ("ens14f0", "eth0"): | ||
| if os.path.isdir(f"/sys/class/net/{candidate}"): | ||
| return candidate | ||
| return "lo" |
There was a problem hiding this comment.
P2 · 网卡探测失败时回退到回环接口,多机训练通信被绑定到 lo
触发条件: 多机训练且主机上既不存在 ens14f0 也不存在 eth0,且未设置 OPENPI_NETWORK_IFACE
证据与影响: _select_interface 遍历 ("ens14f0", "eth0") 后无条件 return "lo",wrapped 随后把该值写入 NCCL_SOCKET_IFNAME 和 GLOO_SOCKET_IFNAME 跨节点通信被强制绑定到回环接口,进程组初始化失败或挂起;单机运行时不易暴露,部署到接口命名不同的节点时出错
修改建议: 候选接口均不存在且无显式配置时不要回退到 lo,改为保留环境中已有变量、不设置,或直接抛出明确错误提示配置接口名
|
|
||
| with lock_path.open("a+b") as lock: | ||
| fcntl.flock(lock.fileno(), fcntl.LOCK_EX) | ||
| if library.is_file(): |
There was a problem hiding this comment.
P2 · 默认共享缓存目录可被预置污染并直接加载
触发条件: 多用户主机上,在目标用户首次创建缓存目录前,本地攻击者预建缺省的 /tmp/openpi_turbo_kernels 并放置同名 .so 与可写 lock 文件,随后用户首次编译触发命中。
证据与影响: cache_root 缺省取 tempfile.gettempdir()/openpi_turbo_kernels(第48行);acquire 锁后仅以 library.is_file()(第57行)判断命中即返回,不校验目录/文件属主与权限,该路径随后会被加载为本地 .so。 用户进程加载攻击者构造的 .so,等于以本机用户身份执行任意代码。
修改建议: 缺省缓存改到用户私有目录(如家目录下缓存),或返回前校验缓存目录与 .so 的属主及权限位,避免信任共享位置。
| return library | ||
| temporary = cache_root / f".{library_stem}-{identity}-{os.getpid()}.building.so" | ||
| command = [compiler, *_FLAGS, str(source), "-o", str(temporary)] | ||
| subprocess.run(command, cwd=source.parent, check=True) |
There was a problem hiding this comment.
P3 · 编译失败时残留临时构建产物
触发条件: hipcc 编译报错使 check=True 抛出 CalledProcessError,或进程在构建期间异常终止。
证据与影响: 第59行先构造 .{stem}-{identity}-{pid}.building.so 临时文件,第61行 subprocess.run 失败后直接在锁内抛出,没有 try/finally 清理,os.replace 仅在成功路径执行。 反复编译失败会在缓存目录累积无用的 .building.so,占用磁盘。
修改建议: 用 try/except 在异常时删除 temporary 文件;锁文件保持存在即可(删除会破坏 flock 语义)。
yh-vino
left a comment
There was a problem hiding this comment.
主要风险在两处:一是 sitecustomize、settrace 入口桥接、自研 NUMA,以及 kernel Group 直接改全局对象,这些都绕开了 Engine,--disable-group 关不掉,OptimizationReport 也看不到;二是默认 RuntimeConfig 依赖内网 nightly BLAS 和开发机路径,换一台机器跑不起来。另外还有大量调研期的死代码和调试输出、整段复制上游代码却没写第三方声明、支持清单没有更新。PR 描述缺少已执行的测试命令和结果、--log-report 的应用情况、精度验证结论和未完成的验证。具体见行内评论。
| ) | ||
| return None | ||
|
|
||
| _sys.settrace(synchronize_before_main) |
There was a problem hiding this comment.
直接运行 scripts/train_pytorch.py 时脚本模块是 __main__,Engine 只 patch 了另外导入的 scripts.train_pytorch。这里在模型目录里用 sys.settrace 和改写 builtins.__import__,把 patch 后的函数拷进 __main__ 命名空间。这属于 Engine 层面的机制,放在单个模型里做,Engine 的目标检查、回滚和报告都管不到。另外 _enabled_groups() 只读配置文件,不看 TURBO_PHYSAI_DISABLE_GROUPS(已验证:传 --disable-group openpi.numa 后仍返回 openpi.numa)。
改法:要支持 __main__ 目标,就在 Engine 里单独提 PR,并补上测试;本 PR 尽量改为 patch 库层面的对象(compile_stack、gemma_gate_lookup、siglip_gelu_lookup 挂在 init_logging / set_seed / build_datasets 上,本来就只是借用一个调用时机)。
There was a problem hiding this comment.
- 移除自定义 openpi.numa,改用 Turbo 内置 NUMA 配置。
- 将 gemma_gate_lookup 和 siglip_gelu_lookup 合并为 openpi.gelu_lookup,直接替换库层的 CachingAutotuner.run,不再借用 set_seed 和 build_datasets。
- 将 DDP 编译设置和 static fast path 合并到 compile_stack,不再借用 init_logging。。
- _enabled_groups() 增加了对显式禁用组的读取,并补充了测试。
- 目前的阻塞是:deferred_metric_sync 需要替换训练入口的 train_loop。直接运行官方脚本时,实际调用位于 main,因此仍依赖 startup_hooks.py 中的桥接。已删除deferred_metric_sync和startup_hooks.py
| } | ||
|
|
||
|
|
||
| def _bind_rank_before_torch_import(enabled_groups: set[str]) -> None: |
There was a problem hiding this comment.
Runner 已经有 NUMA 绑定(process.numa,按 rank 用 numactl 绑 cpunode 和 membind,并自动发现节点)。这里把 process.numa 关掉,在 sitecustomize 里另做一套绑定,openpi.numa Group 本身只检查一个环境变量。结果是 --disable-numa 和 --disable-group openpi.numa 都关不掉这里的绑定。
改法:用 process.numa: true;如果确实需要按物理核在同一 NUMA 节点的多个 rank 间拆分,单独提 PR 改进公共 NUMA 实现,然后删掉 numa.py、numa_topology.py 和这里的预绑定。
There was a problem hiding this comment.
已删除numa.py、numa_topology.py以及start_hooks.py里的numa逻辑,已打开process.numa: true
| # The following groups port the audited OpenPI runtime patch into Turbo's | ||
| # ordinary replacement path. Runtime installers are separate groups so each | ||
| # optimization can be ablated independently without a patch runner. | ||
| GEMMA_GATE_LOOKUP = group( |
There was a problem hiding this comment.
这 7 个 kernel Group 声明的目标(set_seed、build_datasets、PI0Pytorch.__init__、PaliGemmaWithExpertModel.__init__、gradient_checkpointing_enable、clip_grad_norm_、AdamW.step)只是触发时机,真正修改的是全局对象:5 个 Group 各自直接改写 CachingAutotuner.run(叠加顺序取决于谁先被调用),batched_adamw 改写 torch._fused_adamw_,clip_grad_scale 改写 torch 源码 AST 后用 exec 替换 _clip_grads_with_norm_,rope_trig_cache 还改了 PI0Pytorch.forward。这些修改不经过 Engine 的目标检查、冲突分析和回滚,报告里显示的目标也和实际修改不符。
改法:把实际修改的对象声明为 target(如 torch._inductor.runtime.triton_heuristics.CachingAutotuner.run、torch._fused_adamw_、torch.nn.utils.clip_grad._clip_grads_with_norm_);多个 Group 都要包 CachingAutotuner.run 时,交给 Engine 的冲突分析处理,或者合并成一个分发 Group。
There was a problem hiding this comment.
- 将原来分别改写 CachingAutotuner.run 的优化合并为 openpi.kernel_runtime,由 Engine 统一替换该目标,组内分发各优化逻辑。
- 将 PI0Pytorch.forward 声明为 openpi.kernel_runtime 的另一个 target,由 Engine 管理替换。
- 将 clip_grad_scale 的 target 改为实际修改的 clip_grads_with_norm;内部仍使用 AST 生成优化函数。
- 移除 batched_adamw 优化组及相关实现,不再改写 torch.fused_adamw。
| mode = os.environ.get('OPENPI_TORCH_KERNEL_MODE', 'off') | ||
| if mode == 'off': | ||
| return | ||
| assert mode in {'capture', 'softmax', 'shadow', 'backward','gate_capture','gate_screen','gate_lookup_screen','gate'} |
There was a problem hiding this comment.
调研期代码没有清理:
- 这里除
gate以外的模式都走不到(_prepare_runtime固定设为gate),而且引用了不存在的模块softmax_candidate、mlp_screen、gate_screen; gate_candidate.py中非 gate 分支、gate_lookup.screen、gate_shared.screen同样走不到;- 7 个
*_runtime.py没有任何地方导入,installation._install_once的字符串 installer 分支也用不到; gemma_checkpoint_stride.wrap_gemma_checkpoint(“兼容旧配置”,但这是新模型,没有旧配置)、ddp_state.register_compile都没人调用;softmax_forward_schedule.py:62直接覆盖了前两行构建的候选列表。
另外每个 rank 都往 OPENPI_TORCH_TIMING_OUTPUT 写诊断文件(gate_runtime_actual_rank*.py 会把自身源码再写一份、生成的 kernel 源码、各种 _hits/_micro/*_seen json),还打印 OPENPI_* 日志。请把死代码删掉,诊断输出去掉,或改成默认关闭的调试开关;单行分号写法和单空格缩进(如 siglip_gelu_lookup.py)也请按仓库风格整理。
There was a problem hiding this comment.
- 已删除
kernel_hooks.py,同时移除_prepare_runtime中固定设置OPENPI_TORCH_KERNEL_MODE=gate的代码,不再引用不存在的调研模块。 - 已删除
gate_candidate.py,以及未使用的gate_lookup.screen、gate_shared.screen。 - 已删除 7 个未使用的
*_runtime.py,以及installation._install_once中不再使用的安装逻辑。 - 已删除未使用的
gemma_checkpoint_stride.wrap_gemma_checkpoint、ddp_state.register_compile,并清理相关过时注释。 - 已删除 Softmax 中被覆盖的两组候选列表,保留原来实际生效的
oneexp候选,未改变有效的候选选择逻辑。 - 已删除
gate_runtime_actual_rank*.py、*_hits、*_micro、*_seen等诊断文件的输出逻辑,以及对应的OPENPI_*诊断日志。
动态生成的 kernel 源码仍需保留:这些文件用于后续编译和加载,并非单纯的诊断输出。 - 已整理相关文件中的单行分号、单空格缩进及文件末尾多余空行。
| --checkpoint-base-dir "${CHECKPOINT_BASE_DIR}" \ | ||
| --pytorch_weight_path "${WEIGHT_PATH}" \ | ||
| --num_train_steps 30000 \ | ||
| --log-interval 1 \ |
There was a problem hiding this comment.
--log-interval 1 会让 rank0 每步都执行 .item() 同步,openpi.deferred_metric_sync 因此失去作用;--save-interval 2000 也和上游默认值不同。训练命令请尽量保持上游官方命令,只保留 HCU 必需的部分。7.1 和 7.2 两段命令几乎一样,保留一种即可。
There was a problem hiding this comment.
- 将 --log-interval 和 --save-interval 分别改为上游默认值 100 和 1000。
- 删除重复的 7.2 启动命令,保留显式指定配置的启动方式。
- openpi.deferred_metric_sync 优化组已移除。
|
|
||
| def _run_region(function, args, kwargs, *, cache_key, options): | ||
| owner = _function_owner(function) | ||
| if _option_bool(options, "direct", True): |
There was a problem hiding this comment.
direct 默认为 True 时,forward_func 和 image_embed_func 会直接编译,不再包 checkpoint;再加上 gemma_checkpoint_stride 默认 layer_stride=0,Gemma 每层也不做 checkpoint。按交付配置运行,主干的梯度检查点实际上全部关闭了(上游两层都有 checkpoint),但日志里仍然打印 “Enabled gradient checkpointing”。请确认这是有意为之。是的话,请在 README 和 PR 描述里写明显存影响,并说明 direct、compile、layer_stride 这几个选项的含义。
There was a problem hiding this comment.
当前 direct=True 和 layer_stride=0 是有意用于减少重计算、以显存换取训练速度。已在 Turbo 优化项中补充 checkpoint 策略日志,分别说明 PI0 选中区域和 Gemma 联合前向的实际配置,避免将上游的启用日志误认为所有区域都在执行 checkpoint。
direct=true 控制 PI0 外层跳过 gradient checkpointing,compile 控制是否启用编译,layer_stride 控制 Gemma 层的 checkpoint 间隔,设为 0 表示每层都不发生gradient checkpointing,也就是关掉gemma的gradient checkpointing。
| } | ||
| }, | ||
| "evidence_run": "20261015_121731_gate_exact_tanh_screen", | ||
| "promotion": "local bitwise gates passed; full training verification pending" |
There was a problem hiding this comment.
这里写的是 “full training verification pending”,PR 描述里也没有写精度验证结论。请确认这些 kernel 替换是否已经做过完整训练的精度验证。
|
|
||
| def run(self, *args, stream, **kw): | ||
| name = self.inductor_meta.get('kernel_name', '') | ||
| if ('prepare_softmax_online' not in name or len(args) != 7 or args[-2:] != (250368, 978)): |
There was a problem hiding this comment.
多个 kernel Group 的匹配条件里写死了形状((250368, 978)、507510784、4005888 等),只对应 pi05_libero 单卡 batch 32 的情况。换单卡 batch 或数据配置后,这些 Group 会静默退回原生实现,报告里却仍显示 applied。请确认这是预期行为,并在 README 里写明这些 Group 的适用范围。
| @@ -0,0 +1,44 @@ | |||
| # OpenPI runtime requirements other than vendor Torch/TorchVision/Triton/FA. | |||
There was a problem hiding this comment.
这份清单和上游 uv.lock 有 20 个包版本不一致,都没有注明原因,其中 tyro 1.0.8(上游 0.9.22,跨大版本,命令行参数解析依赖它)、equinox、av、wandb、safetensors 差得较多。另外上游 override-dependencies 固定的 ml-dtypes==0.4.1、tensorstore==0.1.74 没有带过来。建议统一改回上游 uv.lock 的版本,并补上这两项;只有和镜像冲突装不上的包才保留实测版本,在行尾注明原因(比如受镜像 torch 约束)。
There was a problem hiding this comment.
当前依赖版本组合已在 HCU 基础镜像中完成训练验证,与上游 uv.lock 存在差异是为了保持现有运行环境的兼容性。直接统一替换为上游版本可能引入依赖冲突。
AI Review发现 1 个问题。 [P3] 网卡探测失败时回退到回环口,多机分布式通信将不可用
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review发现 3 个问题。 [P2] 7.1 示例命令缺少 --disable-group openpi.network,与文档声明矛盾
[P3] 网卡选择兜底为回环接口,多机分布式通信可能失败
[P3] 资产目录变量未按脚本约定做相对路径解析
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
There was a problem hiding this comment.
AI Review
🟡 建议修改
发现有明确证据的问题,建议核对并处理。
已确认 5 个问题,其中 2 个已添加到对应代码行。
变更概览
本次变更主要包含:
- 本批新增 OpenPI 的第三方声明条目与模型支持列表条目,登记基于上游 OpenPI 固定提交修改的 gemma_checkpoint_stride.py 及其许可证信息。
- 新增 model_examples/OpenPi/README.md,提供在 HCU 基础镜像容器内安装依赖、准备 OpenPI 源码、数据集与权重资源并应用 TurboPhysAI 优化的操作指南。
- 新增 model_examples/OpenPi/README.md 示例文档,涵盖 JAX 权重转 PyTorch、归一化统计计算、tokenizer 下载、BLAS 优化包安装及通过 turbo-physai run 启动 torchrun 训练的操作步骤。
- 在 turbo_physai/optimizations/models/openpi 下新增 catalog.py,注册 openpi.network、compile_stack、fused_adamw、kernel_runtime、disable_tqdm 等 8 个优化组及其 wrap 目标与替换实现的映射。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
turbo_physai/optimizations/models/openpi/torch_runtime/hip_libraries.py |
新增 · +63/-0 | P2 × 1 |
turbo_physai/optimizations/models/openpi/network.py |
新增 · +36/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/rope_trig_cache.py |
新增 · +127/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py |
新增 · +92/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/torch_runtime/siglip_lookup.py |
新增 · +71/-0 | P3 × 1 |
model_examples/OpenPi/README.md |
新增 · +361/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +228/-0 | — |
turbo_physai/optimizations/models/openpi/clip_grad_scale.py |
新增 · +124/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_backward_candidate.py |
新增 · +112/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/gate_lookup.py |
新增 · +110/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +109/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +106/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +101/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +88/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py |
新增 · +88/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/torch_gate_shared.hip |
新增 · +88/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py |
新增 · +82/-0 | — |
turbo_physai/optimizations/models/openpi/runtime_compatibility.py |
新增 · +79/-0 | — |
turbo_physai/optimizations/models/openpi/siglip_gelu_lookup.py |
新增 · +77/-0 | — |
其余 27 个文件未逐项展开。
无法定位到 diff 行的问题(3)
P3 · 环境不匹配时断言中断训练而非回退
- 文件:
turbo_physai/optimizations/models/openpi/rope_trig_cache.py(无法安全定位到当前 diff 行) - 触发条件:RoPE kernel 启动满足 matching 条件,但运行硬件 cc 非 gfx938、SM 数非 64,或传入 stream 与当前流不一致。
- 证据与影响:run() 在 matching 命中后执行 assert self.device_props.cc=='gfx938' and self.device_props.multi_processor_count==64 和 assert torch.cuda.current_stream().cuda_stream==stream;matching 判断仅含 kernel 名、张量形状与 dtype,未先校验硬件与流条件。 在目标环境之外的部署上(如其他gfx型号或侧流启动),满足形状条件的首次调用直接抛 AssertionError 中断训练,而非安全回退原 kernel。
- 修改建议:将两处断言改为环境校验:不满�足目标设备/流条件时直接 return original(self,*args,stream=stream,**kw),仅在命中预期环境时启用缓存构建路径。
P3 · 关键校验依赖 assert,优化模式下会被解释器剥离
- 文件:
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py(无法安全定位到当前 diff 行) - 触发条件:训练进程以 python -O 或设置 PYTHONOPTIMIZE 优化模式运行时,Python 解释器会移除全部 assert 语句。
- 证据与影响:安装自检 assert before==after(提示 Softmax 复用改变真实输出)与运行时 assert 当前流与 stream 参数一致,是替换路径仅有的拦截手段;而同文件的安装守卫(num_warps、设备属性等)均使用显式 if+return,说明这两处校验属关键防线却被实现为可被剥离的 assert。 在该模式下,候选 kernel 输出不一致或流不一致时不会报错回退,错误梯度会静默进入训练,安全校验形同虚设。
- 修改建议:将两处 assert 改为显式 if 加 raise(失败时记录状态并回退 original 调用),使校验在任何解释器模式下都生效。
P3 · 生成文件非原子写入,多进程并发首次生成时可能读到部分内容
- 文件:
turbo_physai/optimizations/models/openpi/torch_runtime/siglip_lookup.py(无法安全定位到当前 diff 行) - 触发条件:多进程训练各进程几乎同时首次应用该优化,生成相同摘要的文件名并竞争写入/读取同一文件
- 证据与影响:代码以确定性摘要命名文件,p.write_text(code) 以截断方式写入后立即 spec.loader.exec_module(mod) 导入,无临时文件原子替换或互斥创建,他进程可在写入未完成时打开并执行不完整脚本 其他进程导入到截断中的文件导致启动期偶发 SyntaxError/ImportError,训练启动失败需重跑
- 修改建议:先写入随机临时文件再 os.replace 原子替换;或目标已存在且校验通过时跳过写入直接加载
审查信息
- 变更统计:47 个文件,+3058/-0。
- 覆盖情况:共 47 个文件,已完整审查 47 个。
- 候选问题:8 项;证据复核过滤:3 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
CI 结果:质量门禁:存在阻断项
有效检查报告标记了阻断项,请由有权限的维护者查看原始报告并核验处理;这不是 AI 对具体代码缺陷的独立确认。
敏感命中原文、字段值、路径和日志引用不在评论中展示。
|
|
||
| with lock_path.open("a+b") as lock: | ||
| fcntl.flock(lock.fileno(), fcntl.LOCK_EX) | ||
| if library.is_file(): |
There was a problem hiding this comment.
P2 · 共享临时目录缓存缺少属主与完整性校验,可被本地投毒
触发条件: 多用户共享节点上,其他本地用户预先创建默认缓存目录并放置同名 .so(identity 可由公开源码与编译器版本推算),随后本用户调用 ensure_library。
证据与影响: 默认缓存根为 tempfile.gettempdir()/openpi_turbo_kernels,命中逻辑仅依赖 library.is_file() 即直接返回该路径,不校验属主、权限或内容完整性。 返回的 .so 供后续加载执行,可被以训练用户身份运行攻击者构造的动态库,带来权限与数据风险;目录被他人建成受限权限时锁文件打开也会失败,训练中断。
修改建议: 校验缓存目录与产物的属主及权限(如目录 0700、仅属主可写),默认改用用户专属缓存目录,命中后校验产物摘要通过再交付加载。
| for candidate in ("ens14f0", "eth0"): | ||
| if os.path.isdir(f"/sys/class/net/{candidate}"): | ||
| return candidate | ||
| return "lo" |
There was a problem hiding this comment.
P3 · 网卡探测失败时静默回退到回环接口 lo
触发条件: 节点网卡名既非 ens14f0 也非 eth0(未设置 OPENPI_NETWORK_IFACE)且执行多机分布式训练时。
证据与影响: _select_interface 仅探测两个硬编码网卡名,均不存在时直接 return "lo";wrap_process_group_network 随后把该值写入两个 SOCKET_IFNAME 环境变量。 回环接口无法跨节点通信,多机训练时 NCCL/GLOO 被绑定到 lo,导致进程组初始化挂起或失败,且是静默选择,问题不易定位。
修改建议: 无匹配网卡时改为扫描 /sys/class/net 下第一个非 lo 接口,或显式报错/告警,而不是静默回退到 lo。
AI Review发现 1 个问题。 [P2] 断言硬校验失败直接抛异常而非回退原生调用
|
AI Review发现 4 个问题。 [P2] 候选网卡缺失时回退到 lo,多机通信被指向环回口
[P3] atexit 统计写出未确保输出目录存在
[P3] 无条件覆盖 shell 中已存在的 NCCL/GLOO 接口变量
[P3] 编译失败或进程被中断时残留临时 .building.so 文件
|
There was a problem hiding this comment.
AI Review
🟡 建议修改
发现有明确证据的问题,建议核对并处理。
已确认 3 个问题,其中 2 个已添加到对应代码行。
变更概览
本次变更主要包含:
- 新增 OpenPI(PI0.5 LIBERO 训练)的第三方声明与模型支持列表条目,登记对上游 openpi 固定 commit 的 gemma_pytorch.py 的修改文件 gemma_checkpoint_stride.py 及 Apache-2.0 许可证信息。
- 新增 model_examples/OpenPi/README.md,提供在 HCU 容器内安装 OpenPI 与 TurboPhysAI、下载 LIBERO 数据集和 PI0.5 权重并转换格式的分步操作指南。
- 新增 OpenPi 示例的 README.md 文档,说明 transformers 替换文件拷贝、JAX 权重转 PyTorch、归一化统计计算及 tokenizer 下载等环境准备步骤,并包含 Python 3.10 下 datetime.UTC 兼容补丁脚本
- 新增 OpenPI 使用文档,提供 norm stats 计算、PaliGemma tokenizer 下载、BLAS 优化包的容器内安装脚本,以及通过 turbo-physai run 启动训练的完整步骤
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
turbo_physai/optimizations/models/openpi/network.py |
新增 · +36/-0 | P2 × 1 |
model_examples/OpenPi/README.md |
新增 · +345/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/scripts/prepare_tune_runtime.sh |
新增 · +49/-0 | P3 × 1 |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +228/-0 | — |
turbo_physai/optimizations/models/openpi/rope_trig_cache.py |
新增 · +127/-0 | — |
turbo_physai/optimizations/models/openpi/clip_grad_scale.py |
新增 · +124/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_backward_candidate.py |
新增 · +112/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/gate_lookup.py |
新增 · +110/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +109/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +106/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +101/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py |
新增 · +92/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +88/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py |
新增 · +88/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/torch_gate_shared.hip |
新增 · +88/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py |
新增 · +82/-0 | — |
turbo_physai/optimizations/models/openpi/runtime_compatibility.py |
新增 · +79/-0 | — |
turbo_physai/optimizations/models/openpi/siglip_gelu_lookup.py |
新增 · +77/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_schedule.py |
新增 · +72/-0 | — |
其余 27 个文件未逐项展开。
无法定位到 diff 行的问题(1)
P3 · 文档指导经明文 HTTP 裸 IP 下载二进制库包且无完整性校验
- 文件:
model_examples/OpenPi/README.md(无法安全定位到当前 diff 行) - 触发条件:用户在有中间人风险的网络环境中按文档 6.7 节执行安装命令,并将结果部署为训练运行时库
- 证据与影响:安装脚本用 curl 经明文 HTTP 从一个裸 IP 地址下载 tar.gz 后直接解压并建软链接供训练加载,下载地址原值不展示;全流程没有任何校验和或签名验证,无法确认内容未被篡改 被篡改或损坏的二进制库会进入 LD_LIBRARY_PATH/BLAS 运行路径执行于训练环境,存在供应链篡改风险;源变更或传输损坏时也无法被发现
- 修改建议:在文档中提供该包的 sha256 校验值,解压前用 sha256sum 比对后再部署;若源支持,改用 HTTPS 或受信任镜像地址
审查信息
- 变更统计:47 个文件,+3042/-0。
- 覆盖情况:共 47 个文件,已完整审查 47 个。
- 候选问题:8 项;证据复核过滤:5 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
CI 结果:质量门禁:存在阻断项
有效检查报告标记了阻断项,请由有权限的维护者查看原始报告并核验处理;这不是 AI 对具体代码缺陷的独立确认。
敏感命中原文、字段值、路径和日志引用不在评论中展示。
| for candidate in ("ens14f0", "eth0"): | ||
| if os.path.isdir(f"/sys/class/net/{candidate}"): | ||
| return candidate | ||
| return "lo" |
There was a problem hiding this comment.
P2 · 网卡探测失败时回退 loopback,多节点通信会被固定到回环口
触发条件: 多节点分布式训练且主机网卡名既非 ens14f0 也非 eth0,且未设置接口覆盖环境变量时,进入该回退路径。
证据与影响: _select_interface 依次探测硬编码的 ens14f0、eth0,均不存在时返回 "lo";wrapped 中随后无条件把 NCCL_SOCKET_IFNAME/GLOO_SOCKET_IFNAME 设为该值(第30-31行),未匹配时也不保留默认自动选择行为。 SOCKET_IFNAME 被固定为回环口后无法路由跨节点流量,多节点初始化阶段会挂起或超时;相对未启用该优化的部署属于回归,且失败原因隐蔽。
修改建议: 未匹配到任何候选接口时不设置这两个变量,交由后端自动发现,或给出明确的配置错误提示,而不是回退到 "lo"。
| WORKSPACE_ROOT="$(cd "${TURBO_ROOT}/.." && pwd -P)" | ||
| MODEL_REPO="$(cd "$(openpi_resolve_path "${OPENPI_MODEL_REPO:-${WORKSPACE_ROOT}/openpi}")" && pwd -P)" | ||
| WEIGHT_PATH="$(openpi_resolve_path "${OPENPI_WEIGHT_PATH:-${WORKSPACE_ROOT}/static_data/pi05_base_pytorch}")" | ||
| ASSETS_BASE_DIR="${OPENPI_ASSETS_BASE_DIR:-${WORKSPACE_ROOT}/static_data/assets}" |
There was a problem hiding this comment.
P3 · 相对路径的 ASSETS 目录未按启动目录解析
触发条件: 用户在 source 本脚本前将 OPENPI_ASSETS_BASE_DIR 或 OPENPI_ASSETS_DIR 设为相对路径
证据与影响: WEIGHT_PATH、OUTPUT_ROOT、CHECKPOINT_BASE_DIR、LOG_DIR、RUNTIME_ROOT 均经 openpi_resolve_path 依启动 CWD 解析,脚本注释也声明需在 cd 前解析;但第25-26行的 ASSETS_BASE_DIR 与 OPENPI_ASSETS_DIR 未做该解析,而脚本末尾仍会 cd 到 MODEL_REPO cd 到 OpenPI 仓库后,导出的相对 OPENPI_ASSETS_DIR 会在训练子进程中按仓库目录解析,指向错误位置,导致运行时找不到用户提供的 assets/norm stats
修改建议: 对 ASSETS_BASE_DIR 与 OPENPI_ASSETS_DIR 同样调用 openpi_resolve_path 后再导出,与其他用户路径保持一致
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review发现 1 个问题。 [P3] 前向路径遗留调试 print 输出
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
There was a problem hiding this comment.
AI Review
🟢 未发现有明确证据的问题
在已提供并完成审查的 diff 范围内未形成可确认问题。
变更概览
本次变更主要包含:
- 新增 OpenPI 第三方依赖的来源、固定提交与 Apache-2.0 许可证声明,并在模型支持列表中登记 OpenPI PI0.5 LIBERO 训练支持条目。
- 本批新增 model_examples/OpenPi/README.md,提供在容器内安装 OpenPI 与 TurboPhysAI、准备数据集与权重并通过 turbo-physai run 启动 PI0.5 LIBERO 训练的完整操作说明
- 新增 OpenPI 示例 README 文档,说明容器内目录结构及使用注意事项,注明部分 kernel 优化按 pi05_libero、单卡 batch size 32 的计算形状设计验证,更换配置后可能回退原生实现且性能需重新测试。
- 新增 pi05_base 检查点 GCS 下载脚本:分页列举对象、以 .part 文件支持断点续传,下载前校验目标路径不越界输出目录,并通过硬链接发布完整文件以避免覆盖已有数据。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
model_examples/OpenPi/README.md |
新增 · +323/-0 | — |
turbo_physai/optimizations/models/openpi/rope_trig_cache.py |
新增 · +250/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +231/-0 | — |
turbo_physai/optimizations/models/openpi/clip_grad_scale.py |
新增 · +203/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/gate_lookup.py |
新增 · +200/-0 | — |
turbo_physai/optimizations/models/openpi/siglip_gelu_lookup.py |
新增 · +186/-0 | — |
model_examples/OpenPi/download_pi05_base.py |
新增 · +167/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_forward_schedule.py |
新增 · +150/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_backward_candidate.py |
新增 · +148/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/siglip_lookup.py |
新增 · +147/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +124/-0 | — |
turbo_physai/optimizations/models/openpi/softmax_backward_reuse.py |
新增 · +121/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/rope_candidate.py |
新增 · +115/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py |
新增 · +112/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/softmax_schedule.py |
新增 · +101/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +96/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/torch_gate_shared.hip |
新增 · +88/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +80/-0 | — |
turbo_physai/optimizations/models/openpi/torch_runtime/clip_batched.py |
新增 · +68/-0 | — |
其余 25 个文件未逐项展开。
审查信息
- 变更统计:45 个文件,+3741/-0。
- 覆盖情况:共 45 个文件,已完整审查 45 个。
- 候选问题:4 项;证据复核过滤:4 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
CI 结果:质量门禁:存在阻断项
有效检查报告标记了阻断项,请由有权限的维护者查看原始报告并核验处理;这不是 AI 对具体代码缺陷的独立确认。
敏感命中原文、字段值、路径和日志引用不在评论中展示。
AI Review发现 1 个问题。 [P3] 前向路径遗留调试 print 输出
|
yh-vino
left a comment
There was a problem hiding this comment.
这一轮的修改方向都认可:startup hook、自定义 NUMA、拦截 Inductor kernel 和运行时编译 HIP 的部分都已移出,剩下的 Group 都通过 Engine 正常替换。还需要处理三件事:与 main 在 docs/zh/models/support_list.md 有冲突(main 新增了 OpenVLA 一行),使用rebase,处理冲突时两行都保留即可,OpenPI 放在 OpenVLA 后面,并按其他行的格式对齐单元格;RuntimeConfig 里写死的开发机路径;README 中已删除的 kernel_runtime 说明。PR 描述里请补上已执行的检查命令,以及 --log-report 中各 Group 的应用情况。其余为建议,具体见行内评论。
|
|
||
| ## 9. 使用注意事项 | ||
|
|
||
| `openpi.kernel_runtime` 中部分 kernel 优化针对 `pi05_libero`、单卡 batch size 为 32 时的计算形状设计和验证。更换 batch size 或数据配置后,相关 kernel 可能无法匹配并回退到原生实现,性能收益需重新测试。优化组显示 `applied` 仅表示替换入口已安装,不代表每个 kernel 都已命中或产生收益。 |
There was a problem hiding this comment.
第 9 节说明的是已经移除的 openpi.kernel_runtime,当前交付的 Group 里已经没有它了,请删掉这一节。
| environment: | ||
| set: | ||
| HIP_BUFFER_EXTRA_SIZE: "0" | ||
| PYTHONPATH: "/workspace/openpi_TurboPhysAI/TurboPhysAI/turbo_physai/optimizations/models/openpi" |
There was a problem hiding this comment.
RuntimeConfig 里还写死了开发机路径:PYTHONPATH、OPENPI_DATA_HOME、HF_LEROBOT_HOME 都指向 /workspace/openpi_TurboPhysAI/...。目录结构不同的机器上,PYTHONPATH 失效会导致 sitecustomize.py 里的兼容补丁不加载,数据路径也会指错。OPENPI_DATA_HOME 在 README 的启动命令里已经用 --set 传过一次,这里是重复的。
请把这三项从 runtime.yaml 移到 README 的启动命令里,用 --set 按用户的实际目录传入;runtime.yaml 只保留与机器无关的变量。
|
|
||
| COMPILE_STACK = group( | ||
| "openpi.compile_stack", | ||
| wrap( |
There was a problem hiding this comment.
openpi.compile_stack 同时包含 DDP 参数(DistributedDataParallel.__init__)和 PI0 区域编译(_apply_checkpoint)。这两项互不依赖,放在同一个 Group 里就不能单独关掉其中一项,排查问题或单独测收益时不方便。建议把 DDP 参数拆成独立的 Group。
|
|
||
| def wrapped(*args, **kwargs): | ||
| kwargs = dict(kwargs) | ||
| kwargs["fused"] = fused |
There was a problem hiding this comment.
这里无条件写入 fused=True。torch 2.10 中,fused=True 遇到以下情况会报错:调用方同时传了 foreach=True 或 differentiable=True(构造时报错);参数中有非浮点张量,或不在支持 fused 的设备上(第一次 step() 初始化状态时报错)。建议同时满足以下条件时才设置 fused=True,否则原样调用:
- 调用方没有显式指定
fused和foreach; differentiable不为 True;- 所有参数都是 GPU 上的浮点张量(
params可能是生成器,检查前先转成 list 再传给原函数)。
另外,_FUSED_ADAMW_ENABLED 和 fused_adamw_enabled() 原本给 deferred_metric_sync 用,现在已经没有调用方,属于死代码,请删掉。
| # constructing a disabled tqdm object at all, matching the reference loop. | ||
| import os | ||
|
|
||
| os.environ["OPENPI_TURBO_DISABLE_TQDM"] = "1" |
There was a problem hiding this comment.
上游训练循环每步都会执行 pbar.set_postfix({"loss": f"{loss.item():.4f}", ...}),而 loss.item() 在调用之前就已经求值,所以关掉 tqdm 后,这次 GPU 同步依然存在,省下的只是终端渲染。请确认这个 Group 是否有可测的收益,没有的话可以删掉。另外,这里设置的 OPENPI_TURBO_DISABLE_TQDM 已经没有地方读取了。
| import torch | ||
| from transformers.models.gemma import modeling_gemma | ||
|
|
||
| _CHECKPOINT_ONLY_KWARGS = { |
There was a problem hiding this comment.
_CHECKPOINT_ONLY_KWARGS 已经没有使用方,可以删掉。另外,第 9 行写成了 # # SPDX-License-Identifier,多了一个 #,SPDX 工具识别不了。
There was a problem hiding this comment.
已删除未使用的 _CHECKPOINT_ONLY_KWARGS,并修正 SPDX 注释格式
|
|
||
| BUCKET = "openpi-assets" | ||
| PREFIX = "checkpoints/pi05_base/" | ||
| DEST = Path("/workspace/openpi_TurboPhysAI/static_data/pi05_base") |
There was a problem hiding this comment.
下载目录写死为 /workspace/openpi_TurboPhysAI/static_data/pi05_base,换目录就得改脚本。建议改成命令行参数(可以保留这个默认值),由 README 传入。
There was a problem hiding this comment.
已为下载脚本增加 --output-dir 参数,用户可以指定权重保存目录;未指定时保留原默认路径。README 已同步更新,并提示转换时使用相同的 checkpoint 路径。
3a1a75a to
b5669b4
Compare
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
There was a problem hiding this comment.
AI Review
⚪ 审查未完成
部分内容未完成审查,当前结论不代表全部改动。
变更概览
本次变更主要包含:
- 本批在第三方声明文档中登记 OpenPI 优化(固定 commit 与 Apache-2.0 许可)及其派生文件映射,并在支持模型列表中新增 OpenPI PI0.5 LIBERO 训练条目及使用说明链接。
- 新增 model_examples/OpenPi/README.md 示例文档,提供在 HCU 容器中安装依赖、准备 OpenPI 源码、LIBERO 数据集、权重转换与归一化统计,并通过 turbo-physai run 启动 PI0.5 LIBERO 八卡训练的完整操作步骤。
- 新增 model_examples/OpenPi 示例资源:一个支持分页列举、断点续传、重试和路径校验的 pi05_base GCS 下载脚本,以及 LIBERO 归一化统计文件和示例目录结构说明。
- 新增 OpenPI 优化目录与配置:catalog.py 声明 compile_stack、gemma_checkpoint_stride、fused_adamw、disable_tqdm 四个优化组,配套 optimization/recipe/runtime 配置与依赖清单。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
model_examples/OpenPi/README.md |
新增 · +319/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +227/-0 | — |
model_examples/OpenPi/download_pi05_base.py |
新增 · +167/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +127/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +62/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +50/-0 | — |
model_examples/OpenPi/requirements.txt |
新增 · +45/-0 | — |
turbo_physai/optimizations/models/openpi/configs/recipe.yaml |
新增 · +36/-0 | — |
turbo_physai/optimizations/models/openpi/sitecustomize.py |
新增 · +34/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +33/-0 | — |
turbo_physai/optimizations/models/openpi/fused_adamw.py |
新增 · +31/-0 | — |
turbo_physai/optimizations/models/openpi/configs/runtime.yaml |
新增 · +28/-0 | — |
turbo_physai/optimizations/models/openpi/disable_tqdm.py |
新增 · +27/-0 | — |
turbo_physai/optimizations/models/openpi/configs/.optimization.yaml.generation.json |
新增 · +23/-0 | — |
docs/zh/models/support_list.md |
修改 · +6/-5 | — |
THIRD_PARTY_NOTICES.md |
修改 · +10/-0 | — |
turbo_physai/optimizations/models/openpi/init.py |
新增 · +4/-0 | — |
审查信息
- 变更统计:18 个文件,+1313/-5。
- 覆盖情况:共 18 个文件,已完整审查 15 个,部分审查 3 个。
- 候选问题:0 项;证据复核过滤:0 项;发布前敏感信息保护:0 项。
- 未完成原因:模型未返回完整、有效的审查格式(1 批)
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
AI Review审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。
|
There was a problem hiding this comment.
AI Review
🟢 未发现有明确证据的问题
在已提供并完成审查的 diff 范围内未形成可确认问题。
变更概览
本次变更主要包含:
- 本批为 OpenPI 优化接入补充第三方声明(固定上游 commit 及本地优化文件与上游文件的映射关系),并在模型支持列表文档中新增 OpenPI PI0.5 LIBERO 训练条目及使用说明链接。
- 新增 OpenPi 模型应用文档,描述在 HCU 容器内准备 OpenPI 源码、安装依赖、下载 LIBERO 数据集与 PI0.5 权重并转换为 PyTorch 格式的部署步骤
- 本批新增 OpenPi 示例文档(README),说明 JAX 权重转 PyTorch、归一化统计与 PaliGemma tokenizer 准备,以及通过 turbo-physai run 启动八卡 LIBERO 训练的完整步骤
- 新增 model_examples/OpenPi 下的示例 README 与 PI0.5 base 权重下载脚本,实现 GCS 对象列举、Range 断点续传、退避重试及基于 .part 硬链接的发布校验。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
model_examples/OpenPi/README.md |
新增 · +321/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +227/-0 | — |
model_examples/OpenPi/download_pi05_base.py |
新增 · +167/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +127/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +62/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +50/-0 | — |
model_examples/OpenPi/requirements.txt |
新增 · +45/-0 | — |
turbo_physai/optimizations/models/openpi/configs/recipe.yaml |
新增 · +36/-0 | — |
turbo_physai/optimizations/models/openpi/sitecustomize.py |
新增 · +34/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +33/-0 | — |
turbo_physai/optimizations/models/openpi/disable_tqdm.py |
新增 · +27/-0 | — |
turbo_physai/optimizations/models/openpi/configs/runtime.yaml |
新增 · +25/-0 | — |
turbo_physai/optimizations/models/openpi/configs/.optimization.yaml.generation.json |
新增 · +23/-0 | — |
turbo_physai/optimizations/models/openpi/fused_adamw.py |
新增 · +22/-0 | — |
docs/zh/models/support_list.md |
修改 · +6/-5 | — |
THIRD_PARTY_NOTICES.md |
修改 · +10/-0 | — |
turbo_physai/optimizations/models/openpi/init.py |
新增 · +4/-0 | — |
审查信息
- 变更统计:18 个文件,+1303/-5。
- 覆盖情况:共 18 个文件,已完整审查 18 个。
- 候选问题:0 项;证据复核过滤:0 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
There was a problem hiding this comment.
AI Review
🟡 建议修改
发现有明确证据的问题,建议核对并处理。
已确认 1 个问题,其中 0 个已添加到对应代码行。
变更概览
本次变更主要包含:
- 在第三方声明文档中登记 OpenPI(Apache-2.0,固定基线 commit,注明 gemma_checkpoint_stride.py 为对应上游文件的修改版),并在中文模型支持列表中新增 OpenPI PI0.5 LIBERO 训练条目。
- 本批新增 model_examples/OpenPi/README.md,提供在 HCU 容器环境中接入 OpenPI PI0.5 LIBERO 训练的操作文档,涵盖容器创建、源码与依赖安装、LIBERO 数据集下载、PI0.5 base 权重下载与 PyTorch 格式转换等步骤。
- 新增 OpenPi 示例 README,补充 JAX 权重转 PyTorch、归一化统计与 PaliGemma tokenizer 准备步骤,并给出通过 turbo-physai run 启动八卡 LIBERO 训练及环境变量配置的完整命令流程。
- 本批为 OpenPI 示例新增 README 目录结构说明及 PI0.5 base 权重下载脚本,脚本实现 GCS 分页列举、Range 断点续传、瞬时错误重试与基于硬链接的幂等发布。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +227/-0 | P3 × 1 |
model_examples/OpenPi/README.md |
新增 · +322/-0 | — |
model_examples/OpenPi/download_pi05_base.py |
新增 · +175/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +127/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +62/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +50/-0 | — |
model_examples/OpenPi/requirements.txt |
新增 · +45/-0 | — |
turbo_physai/optimizations/models/openpi/configs/recipe.yaml |
新增 · +36/-0 | — |
turbo_physai/optimizations/models/openpi/sitecustomize.py |
新增 · +34/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +33/-0 | — |
turbo_physai/optimizations/models/openpi/disable_tqdm.py |
新增 · +27/-0 | — |
turbo_physai/optimizations/models/openpi/configs/runtime.yaml |
新增 · +25/-0 | — |
turbo_physai/optimizations/models/openpi/configs/.optimization.yaml.generation.json |
新增 · +23/-0 | — |
turbo_physai/optimizations/models/openpi/fused_adamw.py |
新增 · +22/-0 | — |
docs/zh/models/support_list.md |
修改 · +6/-5 | — |
THIRD_PARTY_NOTICES.md |
修改 · +10/-0 | — |
turbo_physai/optimizations/models/openpi/init.py |
新增 · +4/-0 | — |
无法定位到 diff 行的问题(1)
P3 · 调试打印语句残留在优化实现中
- 文件:
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py(无法安全定位到当前 diff 行) - 触发条件:首次执行该前向的调试分支时打印一次;分布式训练下每个进程各触发一次
- 证据与影响:diff 新增了 print(f"Model training mode: {self.training}") 等多条调试输出,并以 _debug_gc_printed 标志控制仅打印一次 生产训练日志混入一次性调试输出,多 rank 训练时每个进程各输出一次;与本 PR 中关闭进度条以减少终端输出的优化目标相悖
- 修改建议:删除这些 print 调试语句,或改用 logger.debug 级别,避免在生产训练流程输出调试信息
审查信息
- 变更统计:18 个文件,+1312/-5。
- 覆盖情况:共 18 个文件,已完整审查 18 个。
- 候选问题:1 项;证据复核过滤:0 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
There was a problem hiding this comment.
AI Review
🟢 未发现有明确证据的问题
在已提供并完成审查的 diff 范围内未形成可确认问题。
变更概览
本次变更主要包含:
- 本批为文档改动:在第三方声明中登记 OpenPI 来源(固定 commit、Apache-2.0 许可及 gemma_checkpoint_stride.py 与上游文件的映射),并在已支持模型列表中新增 OpenPI PI0.5 LIBERO 训练条目及使用说明链接。
- 新增 model_examples/OpenPi/README.md,提供在 HCU 基础镜像容器中部署 OpenPI(PI0.5/LIBERO)训练环境的操作说明,包括容器创建、源码安装、依赖安装及数据集/权重准备步骤。
- 新增 OpenPi 示例文档,说明 JAX 权重转 PyTorch、准备归一化统计与 PaliGemma tokenizer,并通过 turbo-physai run 以 torchrun 启动八卡 PI0.5 LIBERO 训练
- 新增 model_examples/OpenPi/download_pi05_base.py:通过 GCS 对象列表下载官方 PI0.5 base 检查点,支持 Range 断点续传、指数退避重试、.part 临时文件与硬链接发布,并以文件大小校验完整性。
文件审查摘要
| 文件 | 变更 | 审查结果 |
|---|---|---|
model_examples/OpenPi/README.md |
新增 · +322/-0 | — |
turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py |
新增 · +218/-0 | — |
model_examples/OpenPi/download_pi05_base.py |
新增 · +175/-0 | — |
turbo_physai/optimizations/models/openpi/pi0_compile.py |
新增 · +127/-0 | — |
turbo_physai/optimizations/models/openpi/fused_adamw.py |
新增 · +96/-0 | — |
model_examples/OpenPi/norm_stats.json |
新增 · +84/-0 | — |
turbo_physai/optimizations/models/openpi/configs/optimization.yaml |
新增 · +52/-0 | — |
model_examples/OpenPi/requirements.txt |
新增 · +45/-0 | — |
turbo_physai/optimizations/models/openpi/catalog.py |
新增 · +42/-0 | — |
turbo_physai/optimizations/models/openpi/sitecustomize.py |
新增 · +34/-0 | — |
turbo_physai/optimizations/models/openpi/configs/recipe.yaml |
新增 · +33/-0 | — |
turbo_physai/optimizations/models/openpi/ddp_state.py |
新增 · +33/-0 | — |
turbo_physai/optimizations/models/openpi/configs/runtime.yaml |
新增 · +25/-0 | — |
turbo_physai/optimizations/models/openpi/configs/.optimization.yaml.generation.json |
新增 · +23/-0 | — |
docs/zh/models/support_list.md |
修改 · +6/-5 | — |
THIRD_PARTY_NOTICES.md |
修改 · +10/-0 | — |
turbo_physai/optimizations/models/openpi/init.py |
新增 · +4/-0 | — |
审查信息
- 变更统计:17 个文件,+1329/-5。
- 覆盖情况:共 17 个文件,已完整审查 17 个。
- 候选问题:0 项;证据复核过滤:0 项;发布前敏感信息保护:0 项。
- 本服务以 GitHub 提供的 PR diff 为审查主体,PR 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
改动内容
本 PR 为 OpenPI PI0.5 LIBERO 训练接入 TurboPhysAI,基于官方 OpenPI commit
215abfb217dbac7d5f1273282331b9b1866c0479。已通过精度验证。优化项
catalog.py:声明 OpenPI 优化组、替换目标和对应的优化实现。ddp_state.py:调整 DDP 初始化参数,启用静态图和梯度 bucket view,关闭 buffer 广播与未使用参数检查,减少分布式训练开销。fused_adamw.py:启用 PyTorch fused AdamW,减少优化器计算开销。gemma_checkpoint_stride.py:调整 Gemma 层的梯度检查点策略,默认关闭这些层的检查点重计算,以减少计算耗时。pi0_compile.py:对 PI0 主计算区域和图像区域进行torch.compile;默认跳过这两个区域的外层梯度检查点(用显存换时间),并在执行编译区域时临时设置optimize_ddp=False。兼容与环境配置
sitecustomize.py中补充datetime.UTC,避免 OpenPI 在 Python 3.10 下报错。sitecustomize.py中为旧版数据集的List特征类型补充映射,避免数据加载报错。runtime.yaml配置 HIP、MIOpen、编译缓存及 Turbo 内置 NUMA 等运行参数。--set NCCL_SOCKET_IFNAME=网卡名指定实际网卡,避免依赖固定的设备网卡名称。优化项应用情况
在turbo-physai run命令中加入--log-report,在训练日志中得到:
Summary: applied=3 skipped=0 blocked=0 failed=0 rolled_back=0 not_started=0