Skip to content

Feat/Openpi Optimization - #29

Open
Coulsonq wants to merge 74 commits into
HYGON-AI:mainfrom
Coulsonq:openpi-TurboPhysAI-Optimization
Open

Coulsonq wants to merge 74 commits into
HYGON-AI:mainfrom
Coulsonq:openpi-TurboPhysAI-Optimization

Conversation

@Coulsonq

@Coulsonq Coulsonq commented Oct 23, 2026 •

Copy link
Copy Markdown

改动内容

本 PR 为 OpenPI PI0.5 LIBERO 训练接入 TurboPhysAI,基于官方 OpenPI commit 215abfb217dbac7d5f1273282331b9b1866c0479。已通过精度验证。

优化项

  1. catalog.py:声明 OpenPI 优化组、替换目标和对应的优化实现。
  2. ddp_state.py:调整 DDP 初始化参数,启用静态图和梯度 bucket view,关闭 buffer 广播与未使用参数检查,减少分布式训练开销。
  3. fused_adamw.py:启用 PyTorch fused AdamW,减少优化器计算开销。
  4. gemma_checkpoint_stride.py:调整 Gemma 层的梯度检查点策略,默认关闭这些层的检查点重计算,以减少计算耗时。
  5. pi0_compile.py:对 PI0 主计算区域和图像区域进行 torch.compile;默认跳过这两个区域的外层梯度检查点(用显存换时间),并在执行编译区域时临时设置 optimize_ddp=False。

兼容与环境配置

  1. Python 3.10 兼容:在 sitecustomize.py 中补充 datetime.UTC,避免 OpenPI 在 Python 3.10 下报错。
  2. LeRobot 数据集兼容:在 sitecustomize.py 中为旧版数据集的 List 特征类型补充映射,避免数据加载报错。
  3. HCU 运行环境适配:通过 runtime.yaml 配置 HIP、MIOpen、编译缓存及 Turbo 内置 NUMA 等运行参数。
  4. 通信网卡配置:由用户通过 --set NCCL_SOCKET_IFNAME=网卡名 指定实际网卡,避免依赖固定的设备网卡名称。

优化项应用情况

在turbo-physai run命令中加入--log-report,在训练日志中得到:
Summary: applied=3 skipped=0 blocked=0 failed=0 rolled_back=0 not_started=0

  • openpi.compile_stack: status=applied
  • openpi.gemma_checkpoint_stride: status=applied
  • openpi.fused_adamw: status=applied

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
提交修复并推送新 commit 后,将自动审查 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))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 · OPENPI_TORCH_KERNEL_CACHE_DIR 为相对路径时编译输出路径错位

触发条件: 用户把该环境变量设为相对路径,且对应库尚未编译需触发构建。

证据与影响: subprocess.run 以 cwd=source.parent 执行编译,相对的 temporary 输出按该子进程 cwd 解析;而 os.replace(temporary, library) 按进程原工作目录解析,同一相对路径指向不同位置。 编译输出写错位置导致 os.replace 抛 FileNotFoundError,库构建失败;源码目录旁可能残留中间产物。

修改建议: 计算 cache_root 后先调用 resolve() 转为绝对路径再执行 mkdir、编译与替换。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
提交修复并推送新 commit 后,将自动审查 PR 的最新版本。

for candidate in ("ens14f0", "eth0"):
if os.path.isdir(f"/sys/class/net/{candidate}"):
return candidate
return "lo"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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():

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 yh-vino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

主要风险在两处:一是 sitecustomize、settrace 入口桥接、自研 NUMA,以及 kernel Group 直接改全局对象,这些都绕开了 Engine,--disable-group 关不掉,OptimizationReport 也看不到;二是默认 RuntimeConfig 依赖内网 nightly BLAS 和开发机路径,换一台机器跑不起来。另外还有大量调研期的死代码和调试输出、整段复制上游代码却没写第三方声明、支持清单没有更新。PR 描述缺少已执行的测试命令和结果、--log-report 的应用情况、精度验证结论和未完成的验证。具体见行内评论。

)
return None

_sys.settrace(synchronize_before_main)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

直接运行 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 上,本来就只是借用一个调用时机)。

@Coulsonq Coulsonq Oct 27, 2026 •

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 移除自定义 openpi.numa,改用 Turbo 内置 NUMA 配置。
  2. 将 gemma_gate_lookup 和 siglip_gelu_lookup 合并为 openpi.gelu_lookup,直接替换库层的 CachingAutotuner.run,不再借用 set_seed 和 build_datasets。
  3. 将 DDP 编译设置和 static fast path 合并到 compile_stack,不再借用 init_logging。。
  4. _enabled_groups() 增加了对显式禁用组的读取,并补充了测试。
  5. 目前的阻塞是: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:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 和这里的预绑定。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已删除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(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这 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。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 将原来分别改写 CachingAutotuner.run 的优化合并为 openpi.kernel_runtime,由 Engine 统一替换该目标,组内分发各优化逻辑。
  2. 将 PI0Pytorch.forward 声明为 openpi.kernel_runtime 的另一个 target,由 Engine 管理替换。
  3. 将 clip_grad_scale 的 target 改为实际修改的 clip_grads_with_norm;内部仍使用 AST 生成优化函数。
  4. 移除 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'}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

调研期代码没有清理:

  • 这里除 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)也请按仓库风格整理。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 已删除 kernel_hooks.py,同时移除 _prepare_runtime 中固定设置 OPENPI_TORCH_KERNEL_MODE=gate 的代码,不再引用不存在的调研模块。
  2. 已删除 gate_candidate.py,以及未使用的 gate_lookup.screen、gate_shared.screen。
  3. 已删除 7 个未使用的 *_runtime.py,以及 installation._install_once 中不再使用的安装逻辑。
  4. 已删除未使用的 gemma_checkpoint_stride.wrap_gemma_checkpoint、ddp_state.register_compile,并清理相关过时注释。
  5. 已删除 Softmax 中被覆盖的两组候选列表,保留原来实际生效的 oneexp 候选,未改变有效的候选选择逻辑。
  6. 已删除 gate_runtime_actual_rank*.py、*_hits、*_micro、*_seen 等诊断文件的输出逻辑,以及对应的 OPENPI_* 诊断日志。
    动态生成的 kernel 源码仍需保留:这些文件用于后续编译和加载,并非单纯的诊断输出。
  7. 已整理相关文件中的单行分号、单空格缩进及文件末尾多余空行。

Comment thread model_examples/OpenPi/README.md Resolved
Comment thread model_examples/OpenPi/README.md Outdated
--checkpoint-base-dir "${CHECKPOINT_BASE_DIR}" \
--pytorch_weight_path "${WEIGHT_PATH}" \
--num_train_steps 30000 \
--log-interval 1 \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--log-interval 1 会让 rank0 每步都执行 .item() 同步,openpi.deferred_metric_sync 因此失去作用;--save-interval 2000 也和上游默认值不同。训练命令请尽量保持上游官方命令,只保留 HCU 必需的部分。7.1 和 7.2 两段命令几乎一样,保留一种即可。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 将 --log-interval 和 --save-interval 分别改为上游默认值 100 和 1000。
  2. 删除重复的 7.2 启动命令,保留显式指定配置的启动方式。
  3. openpi.deferred_metric_sync 优化组已移除。


def _run_region(function, args, kwargs, *, cache_key, options):
owner = _function_owner(function)
if _option_bool(options, "direct", True):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 这几个选项的含义。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当前 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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里写的是 “full training verification pending”,PR 描述里也没有写精度验证结论。请确认这些 kernel 替换是否已经做过完整训练的精度验证。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

全部优化项应用之后已通过与H20进行loss对比的精度验证


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)):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多个 kernel Group 的匹配条件里写死了形状((250368, 978)、507510784、4005888 等),只对应 pi05_libero 单卡 batch 32 的情况。换单卡 batch 或数据配置后,这些 Group 会静默退回原生实现,报告里却仍显示 applied。请确认这是预期行为,并在 README 里写明这些 Group 的适用范围。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个默认是只在单卡bs32时有收益,已在readme里说明

@@ -0,0 +1,44 @@
# OpenPI runtime requirements other than vendor Torch/TorchVision/Triton/FA.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这份清单和上游 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 约束)。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当前依赖版本组合已在 HCU 基础镜像中完成训练验证,与上游 uv.lock 存在差异是为了保持现有运行环境的兼容性。直接统一替换为上游版本可能引入依赖冲突。

@Coulsonq Coulsonq changed the title Openpi optimization Openpi Optimization Oct 26, 2026
@Coulsonq Coulsonq changed the title Openpi Optimization Feat/Openpi Optimization Oct 27, 2026
@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

发现 1 个问题。

[P3] 网卡探测失败时回退到回环口,多机分布式通信将不可用

  • 位置:turbo_physai/optimizations/models/openpi/network.py:20
  • 触发条件:主机上不存在 /sys/class/net/ens14f0 和 /sys/class/net/eth0 且未设置 OPENPI_NETWORK_IFACE,在多机分布式训练中应用该包装。
  • 证据与影响:_select_interface 只探测 ens14f0、eth0,均缺失时返回 "lo";wrapped 随后将该值写入 NCCL_SOCKET_IFNAME 与 GLOO_SOCKET_IFNAME,覆盖掉未设置时 NCCL/GLOO 的自动选口行为。 回环口仅限本机通信,跨节点通信在初始化阶段即失败,受影响主机上多机训练无法启动,比不应用该优化更差。
  • 修改建议:探测不到指定网卡时不设置这两个 IFNAME 环境变量以保留自动选口,或改为枚举非 lo 的可用网卡,仅在确有匹配时写入。

部分结果不可用:2/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 45 个文件,已审查 21 个,部分审查 4 个,待审查 20 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 46 个文件,已审查 5 个,部分审查 1 个,待审查 40 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

发现 3 个问题。

[P2] 7.1 示例命令缺少 --disable-group openpi.network,与文档声明矛盾

  • 位置:model_examples/OpenPi/README.md(行号未确定)
  • 触发条件:用户按 7.1(显式指定配置)方式启动,并通过 --set 设置 NCCL_SOCKET_IFNAME 时
  • 证据与影响:正文明确说明:当前分支仍包含 openpi.network,启动命令暂时通过 --disable-group openpi.network 关闭该组以避免覆盖用户指定网卡,且 7.2 命令带有该参数;但 7.1 命令未包含 --disable-group openpi.network,仅设置了 NCCL_SOCKET_IFNAME 按 7.1 启动时 openpi.network 组仍会被应用,可能覆盖用户指定的通信网卡,出现文档自身警告的行为,导致多机训练通信接口选择不受控
  • 修改建议:在 7.1 命令中补充 --disable-group openpi.network,或在正文中明确说明显式配置模式下不适用该参数及其原因

[P3] 网卡选择兜底为回环接口,多机分布式通信可能失败

  • 位置:turbo_physai/optimizations/models/openpi/network.py:20
  • 触发条件:优化生效且节点上既无 ens14f0/eth0,也未设置 OPENPI_NETWORK_IFACE 或映射中的 NCCL/GLOO_SOCKET_IFNAME 时,进程组初始化前接口被静默设为 lo。
  • 证据与影响:_select_interface 候选均不存在时 return "lo",wrapped 无条件写入 NCCL_SOCKET_IFNAME/GLOO_SOCKET_IFNAME=lo;候选网卡名为硬编码,若存在但并非跨节点互通网卡也会被优先选中,覆盖框架默认自动选卡。 多机训练时 NCCL/GLOO 引导流量绑定回环接口,跨节点无法建立连接,分布式初始化挂起或报网络错误。
  • 修改建议:候选均未命中且无显式配置时不设置这两个环境变量,保留原有自动选择;或仅当接口存在且状态为 UP 时才写入。

[P3] 资产目录变量未按脚本约定做相对路径解析

  • 位置:turbo_physai/optimizations/models/openpi/scripts/prepare_tune_runtime.sh:26
  • 触发条件:调用方通过 OPENPI_ASSETS_DIR 或 OPENPI_ASSETS_BASE_DIR 传入相对路径(OPENPI_ASSETS_DIR 未预先设置)时。
  • 证据与影响:脚本头部声明以启动目录解析用户相对路径,OPENPI_MODEL_REPO、OPENPI_WEIGHT_PATH、OPENPI_OUTPUT_ROOT 等均经由 openpi_resolve_path 处理,但第25-26行对 OPENPI_ASSETS_BASE_DIR/OPENPI_ASSETS_DIR 直接取原值导出,未调用该函数解析。 脚本末尾 cd 到 MODEL_REPO 后,相对形式的资产目录会基于 OpenPI 仓库目录重新解析,指向错误位置,训练进程找不到 assets 或读取到错误目录的数据。
  • 修改建议:导出前对两个变量同样调用 openpi_resolve_path:ASSETS_BASE_DIR 与 OPENPI_ASSETS_DIR 均解析为相对启动目录的绝对路径后再导出,保持与其他路径变量一致。

部分结果不可用:1/20 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 24 个,部分审查 1 个,待审查 22 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 12 个,部分审查 4 个,待审查 31 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 2 个,部分审查 1 个,待审查 44 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
提交修复并推送新 commit 后,将自动审查 PR 的最新版本。
CI 结果:质量门禁:存在阻断项

有效检查报告标记了阻断项,请由有权限的维护者查看原始报告并核验处理;这不是 AI 对具体代码缺陷的独立确认。

敏感命中原文、字段值、路径和日志引用不在评论中展示。


with lock_path.open("a+b") as lock:
fcntl.flock(lock.fileno(), fcntl.LOCK_EX)
if library.is_file():

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

发现 1 个问题。

[P2] 断言硬校验失败直接抛异常而非回退原生调用

  • 位置:turbo_physai/optimizations/models/openpi/gemma_gate_lookup.py:51
  • 触发条件:表达式哈希在预置 gate_policy.json 中命中,但运行设备不是 gfx938/64 CU,或任一输入张量非 bfloat16、非连续或元素数不等于 507510784(例如同一表达式以其他形状调用)。
  • 证据与影响:第50-51行用 assert 校验设备与张量属性;文件 docstring 声明其他情形应保留原生调用,且断言前已执行 result=original(...)。在 python -O 下断言被剥离,校验完全失效。 策略命中但条件不满足时抛 AssertionError 中断训练而非回退;-O 模式下校验被绕过,可能在不适配的硬件或形状上套用调优配置,存在结果错误风险。
  • 修改建议:将 assert 改为显式条件判断,校验不通过时直接返回已计算的 result(原生路径),仅在全部条件满足后再进入查表执行路径。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 16 个,部分审查 4 个,待审查 27 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

AI Review

发现 4 个问题。

[P2] 候选网卡缺失时回退到 lo,多机通信被指向环回口

  • 位置:turbo_physai/optimizations/models/openpi/network.py:20
  • 触发条件:主机网卡名既非 ens14f0 也非 eth0,且未设置 OPENPI_NETWORK_IFACE 时执行 wrapped 的场景。
  • 证据与影响:_select_interface 遍历 ("ens14f0","eth0") 未命中后 return "lo"(第20行),wrapped 无条件把 NCCL_SOCKET_IFNAME/GLOO_SOCKET_IFNAME 设为该值。 跨机分布式初始化时环回口无法到达远端 rank,通信建立失败或挂起;若不设置变量,NCCL 默认会排除 lo 自动选网,该回退反而制造了新的选错接口路径。
  • 修改建议:未匹配到已知网卡时不设置这两个变量(告警并保留 NCCL/GLOO 默认自动选择),仅在获得确定接口时才写入。

[P3] atexit 统计写出未确保输出目录存在

  • 位置:turbo_physai/optimizations/models/openpi/clip_grad_scale.py:36
  • 触发条件:OPENPI_TORCH_TIMING_OUTPUT 指向不存在的目录时,_make_runtime 正常执行、训练完成,但解释器退出执行 atexit 回调写文件失败。
  • 证据与影响:root 取自环境变量后,注册的回调直接 (root/f'clip_hits_rank{rank}.json').write_text(...),可见片段中没有任何创建目录或异常处理逻辑。 统计文件丢失;且 atexit 回调抛出异常会使进程以非零退出码结束,可能让已成功的训练任务被判定为失败。
  • 修改建议:注册回调前对 root 执行 mkdir(parents=True, exist_ok=True),并在回调内捕获写盘异常,避免影响进程退出码。

[P3] 无条件覆盖 shell 中已存在的 NCCL/GLOO 接口变量

  • 位置:turbo_physai/optimizations/models/openpi/network.py:30
  • 触发条件:用户在 shell 预先导出 NCCL_SOCKET_IFNAME/GLOO_SOCKET_IFNAME(如 InfiniBand 场景指定 ib 口),随后经该包装执行进程组初始化。
  • 证据与影响:values 仅来自 options["environment"],不读取 os.environ 既有值;wrapped 第30-31行以启发式结果直接赋值覆盖原环境变量。 系统级显式配置被静默丢弃,通信接口被换成启发式所选网卡,多机通信可能失败或性能降级,且不易排查。
  • 修改建议:赋值前检查 os.environ 是否已有对应变量,已有则保留;仅当 shell 环境与 options 均未提供时才使用启发式接口。

[P3] 编译失败或进程被中断时残留临时 .building.so 文件

  • 位置:turbo_physai/optimizations/models/openpi/torch_runtime/hip_libraries.py:59
  • 触发条件:hipcc 编译失败(check=True 抛 CalledProcessError)或编译过程中进程被终止。
  • 证据与影响:temporary = cache_root / f'.{library_stem}-{identity}-{os.getpid()}.building.so' 在 subprocess.run 之后没有 try/finally 清理,os.replace 仅在编译成功后执行,失败路径下临时文件永久残留。 多进程并发或多次失败时,缓存目录持续累积孤儿临时文件,占用磁盘且不会被后续成功编译清理。
  • 修改建议:用 try/except 在编译异常时 unlink 临时文件,或进入锁后清理同 identity 的陈旧 .building.so 残留。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 39 个,待审查 8 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
提交修复并推送新 commit 后,将自动审查 PR 的最新版本。
CI 结果:质量门禁:存在阻断项

有效检查报告标记了阻断项,请由有权限的维护者查看原始报告并核验处理;这不是 AI 对具体代码缺陷的独立确认。

敏感命中原文、字段值、路径和日志引用不在评论中展示。

for candidate in ("ens14f0", "eth0"):
if os.path.isdir(f"/sys/class/net/{candidate}"):
return candidate
return "lo"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 后再导出,与其他用户路径保持一致

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 7 个,部分审查 2 个,待审查 38 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 0 个,待审查 47 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 47 个文件,已审查 7 个,部分审查 2 个,待审查 38 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 45 个文件,已审查 7 个,部分审查 2 个,待审查 36 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

发现 1 个问题。

[P3] 前向路径遗留调试 print 输出

  • 位置:turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py(行号未确定)
  • 触发条件:首次执行包含该调试分支的模型前向计算时即触发
  • 证据与影响:diff 中直接以 print 输出训练模式、gradient_checkpointing 属性是否存在及其取值,并以 _debug_gc_printed 标记控制仅打印一次,属遗留调试代码 训练日志被调试信息污染;多进程/多 rank 训练下每个进程各输出一次,干扰日志读取与排查
  • 修改建议:移除这些调试 print,或改用可配置级别的 logger 并默认关闭

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 44 个文件,已审查 22 个,待审查 22 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/19 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 44 个文件,已审查 7 个,部分审查 2 个,待审查 35 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 45 个文件,已审查 8 个,待审查 37 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 45 个文件,已审查 17 个,待审查 28 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 对具体代码缺陷的独立确认。

敏感命中原文、字段值、路径和日志引用不在评论中展示。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

AI Review

发现 1 个问题。

[P3] 前向路径遗留调试 print 输出

  • 位置:turbo_physai/optimizations/models/openpi/gemma_checkpoint_stride.py(行号未确定)
  • 触发条件:任意进程首次执行该前向时无条件向 stdout 打印调试信息。
  • 证据与影响:前向内直接 print 输出 training 模式与 gradient_checkpointing 属性,仅由 _debug_gc_printed 做一次性防护,无日志级别或调试开关控制。 多进程/多机训练时每个进程都会输出一次调试内容到 stdout,污染训练日志,可能干扰日志采集与解析。
  • 修改建议:改用 debug 级 logger 或经显式调试开关控制,生产路径默认不打印。

部分结果不可用:2/7 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 18 个文件,已审查 11 个,部分审查 7 个。

进度已保存。正在继续处理。

@yh-vino yh-vino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这一轮的修改方向都认可: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 的应用情况。其余为建议,具体见行内评论。

Comment thread model_examples/OpenPi/README.md Outdated

## 9. 使用注意事项

`openpi.kernel_runtime` 中部分 kernel 优化针对 `pi05_libero`、单卡 batch size 为 32 时的计算形状设计和验证。更换 batch size 或数据配置后,相关 kernel 可能无法匹配并回退到原生实现,性能收益需重新测试。优化组显示 `applied` 仅表示替换入口已安装,不代表每个 kernel 都已命中或产生收益。

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

第 9 节说明的是已经移除的 openpi.kernel_runtime,当前交付的 Group 里已经没有它了,请删掉这一节。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已删除这部分

environment:
set:
HIP_BUFFER_EXTRA_SIZE: "0"
PYTHONPATH: "/workspace/openpi_TurboPhysAI/TurboPhysAI/turbo_physai/optimizations/models/openpi"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 只保留与机器无关的变量。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这三项已移动到启动命令里


COMPILE_STACK = group(
"openpi.compile_stack",
wrap(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

openpi.compile_stack 同时包含 DDP 参数(DistributedDataParallel.__init__)和 PI0 区域编译(_apply_checkpoint)。这两项互不依赖,放在同一个 Group 里就不能单独关掉其中一项,排查问题或单独测收益时不方便。建议把 DDP 参数拆成独立的 Group。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个DDP要和compile同时应用,否则恰好OOM


def wrapped(*args, **kwargs):
kwargs = dict(kwargs)
kwargs["fused"] = fused

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里无条件写入 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 用,现在已经没有调用方,属于死代码,请删掉。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已改正,添加条件判断

# constructing a disabled tqdm object at all, matching the reference loop.
import os

os.environ["OPENPI_TURBO_DISABLE_TQDM"] = "1"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上游训练循环每步都会执行 pbar.set_postfix({"loss": f"{loss.item():.4f}", ...}),而 loss.item() 在调用之前就已经求值,所以关掉 tqdm 后,这次 GPU 同步依然存在,省下的只是终端渲染。请确认这个 Group 是否有可测的收益,没有的话可以删掉。另外,这里设置的 OPENPI_TURBO_DISABLE_TQDM 已经没有地方读取了。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已移除 openpi.disable_tqdm 优化组

import torch
from transformers.models.gemma import modeling_gemma

_CHECKPOINT_ONLY_KWARGS = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_CHECKPOINT_ONLY_KWARGS 已经没有使用方,可以删掉。另外,第 9 行写成了 # # SPDX-License-Identifier,多了一个 #,SPDX 工具识别不了。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已删除未使用的 _CHECKPOINT_ONLY_KWARGS,并修正 SPDX 注释格式


BUCKET = "openpi-assets"
PREFIX = "checkpoints/pi05_base/"
DEST = Path("/workspace/openpi_TurboPhysAI/static_data/pi05_base")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

下载目录写死为 /workspace/openpi_TurboPhysAI/static_data/pi05_base,换目录就得改脚本。建议改成命令行参数(可以保留这个默认值),由 README 传入。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已为下载脚本增加 --output-dir 参数,用户可以指定权重保存目录;未指定时保留原默认路径。README 已同步更新,并提示转换时使用相同的 checkpoint 路径。

@Coulsonq
Coulsonq force-pushed the openpi-TurboPhysAI-Optimization branch from 3a1a75a to b5669b4 Compare November 3, 2026 07:16
@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/7 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 18 个文件,已审查 15 个,部分审查 1 个,待审查 2 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 18 个文件,已审查 15 个,部分审查 1 个,待审查 2 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer

hygon-ai-reviewer Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

AI Review

审查尚未完整完成,无法给出整体结论;当前没有可发布的已确认问题,不代表代码没有问题。

部分结果不可用:1/7 批未完整完成,已保留可用问题。

审查未完整完成:以 GitHub 返回的 PR diff 为主体,关联上下文仅用于核验,未运行代码。

覆盖情况:共 18 个文件,已审查 15 个,部分审查 3 个。

进度已保存。正在继续处理。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。
提交修复并推送新 commit 后,将自动审查 PR 的最新版本。

@hygon-ai-reviewer hygon-ai-reviewer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 描述与按相关性选取的仓库片段仅用于核验;未执行代码或重跑测试,结论仍需维护者核验。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants