[CI] Fix C++ extension JIT cache invalidation#79293
Conversation
Co-authored-by: Codex <noreply@openai.com>
ShigureNyako
left a comment
There was a problem hiding this comment.
自查了一遍:
- 变更范围只包含 Linux-CPU workflow 的 Test step。
- 只清理
/root/.cache/paddle_extensions,不清理整个/root/.cache,也不动 pip cache / ccache。 - 目的只是让 custom op JIT 重新生成
/root/.cache/paddle_extensions/.../build.ninja,对应 #79289 中ninja在该 cache 路径下 SIGSEGV 的失败指纹。 - 本地验证已跑:
sed -n '155,175p' .github/workflows/_Linux-CPU.ymlgit diff --check- commit 前 pre-commit hooks 通过。
|
好像过了啊!看看 ninja 目前实现是不是有错误命中 cache 的风险?还是生成错误的 ninja file 的风险? |
|
@SigureMo 我补看了实现和当前 CI,先修正一下证据:#79293 这一轮 Linux-CPU 还没有证明“清理后过了”。job 80493976174 在 关于 cpp_extension / ninja:
CI 分类:
当前不新增 commit,也不扩大 #79293 的改动范围。这个 PR 仍先保留为最小验证/规避;需要等一轮 Linux-CPU 真正跑到 Test,才能判断清理 |
Co-authored-by: Codex <noreply@openai.com>
|
@SigureMo 我继续看了下,确实有两个风险点,已经在最新提交
另外保留 workflow 里只清理 本地验证: python3 -m py_compile python/paddle/utils/cpp_extension/cpp_extension.py python/paddle/utils/cpp_extension/extension_utils.py test/cpp_extension/test_cpp_extension_ninja.py
git diff --check还跑了一个 isolated helper validation,覆盖了相对路径不重复拼接、source hash 变化、stale 补充:当前 #79293 旧一轮多项失败(包括 Linux-CPU)没有跑到测试阶段,是在 |
|
关键在于,之前为啥一直没问题,是因为 ninja 支持后暴露的问题吗? |
|
@SigureMo 我看了一下 history,结论是:是的,更像是 具体证据:
所以“之前一直没问题”的原因更可能是触发条件没凑齐:ninja 支持引入后风险已经存在,但需要共享 CFS cache 里出现同名 extension 的 stale/poisoned object 或 ninja state;cache 干净或状态刚好一致时就会通过。这次连续在 #79289/#79291 看到同三项 custom op JIT 的 我已经在 f81295b 里把 PR 从单纯 CI cleanup 收窄成代码侧修复:
当前 head |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #79293 +/- ##
==========================================
Coverage ? 90.00%
==========================================
Files ? 2
Lines ? 50
Branches ? 0
==========================================
Hits ? 45
Misses ? 5
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
@ShigureNyako 再分析下 Linux CPU 为啥编译一直挂吧,又出新问题了,但是看起来和这个 PR 无关啊,找找其他通过的 PR 日志对比一下吧,这 CI 真离谱啊 |
|
@SigureMo 我把这轮 Linux-CPU 编译失败和几个通过/半通过日志对了一下,结论是:当前这个失败边界在 当前失败 job 80518667663:
对比通过日志:
横向看近期失败:06-10 07:12 之后多条无关 PR 的 Linux-CPU 都在类似位置挂过(例如 80502018615、80519800403、80523034944、80524064994、80530767527、80518667663),也夹杂有 所以我现在把这次 Linux-CPU 判为 CI 基础环境 / 外部依赖 / runner cache 类问题:能确认的边界是 |
你不用处理啊,你就分析下,到底是为啥,要怎么修 |
|
@SigureMo 当前这一轮 CI 已基本结束,我把剩下两个失败也归类了一下:
我尝试对这两个 workflow run 执行 所以这边没法直接触发 rerun。当前代码侧没有新增可处理项;需要等有权限的账号重跑失败 job 后看 Linux-CPU 是否能真正进入 Test 阶段。 |
|
@SigureMo 明白,我先不说 rerun/处理,只说“为什么”和“怎么修”。我重新把当前 #79293 和旁边几个 Linux-CPU compile fail 分开看了一下,至少是两类问题:
所以我现在的判断是:#79293 这轮是 OpenVINO configure 内部失败,但关键内部 log 没暴露,修 CI 日志/上传后才能定位具体 OpenVINO 原因;#79298 这类新 compile fail 则已经能确定是旧/误改 Gloo submodule 在 GCC 13 下缺 |
|
@SigureMo 不是,我上一条把两个现象放一起说得容易误解了,先澄清:没有证据表明 #79298 或其它未合入 PR 导致 #79293 挂。 #79293 这轮 Linux-CPU 的证据是:
所以 #79298 那个 Gloo 缺 #79293 当前真正能定位到的是:OpenVINO ExternalProject configure wrapper 返回 1,但内部原因被 |
|
@SigureMo 补一轮 authorized rerun 结果:head 关键证据:
另外注意到一个小现象:Test 前的 当前剩余非通过 checks 只是还在跑( |
|
@SigureMo 最后一轮 CI 状态更新:head 关键项:
当前 PR 只剩 review gate。 |
PR Category
Execute Infrastructure
PR Types
Bug fixes
Description
修复 Linux-CPU custom op JIT 在共享
/root/.cache/paddle_extensions下可能命中陈旧缓存的问题,并保留一个 CI 侧的临时/防御性 cache cleanup。背景来自 #79289 的 Linux-CPU 排查:
80404721798与失败样例80467139736使用相同 Linux-CPU docker imageccr-2vdh3abv-pub.cnc.bj.baidubce.com/ci/paddle:19d3669ca5ff0b19144a785bb3126d7e,且均安装apache-tvm-ffi==0.1.11,所以 CPU 失败不指向tvm-ffi==0.1.12。test_custom_extend_attrs_jit/test_custom_simple_slice/test_custom_inplace,日志显示paddle.utils.cpp_extension调用ninja -v -f /root/.cache/paddle_extensions/.../build.ninja时ninja进程收到SIGSEGV。/home/data/cfs/.cache/python35-cpu挂载为容器内/root/.cache,paddle_extensions位于该共享 cache 下。本 PR 做两类修复:
BuildExtension生成 object path 时,避免对已经位于build_temp下的 object 再次拼接build_temp,修正类似.../temp.../build/.../temp.../build.ninja的重复路径。version.txt的扩展版本签名加入 source file content hash;source 或 build args 变化时,删除 stale.so以及build_temp下的.o/.obj,避免共享 cache 中旧 object 被 ninja/distutils 复用。run_linux_cpu_test.sh前,仅清理/root/.cache/paddle_extensions;不清理整个/root/.cache,也不动 pip cache / ccache。本地验证:
另外跑了一个 isolated helper validation(stub 掉最小 Paddle import),覆盖:
build_temp下时不会重复拼接;.so和.o;.so不存在但 stale.o存在时也会清理 stale.o。完整 unittest 在本地源码 checkout 中因未构建
paddle.base.libpaddle无法导入运行,留给 CI 验证。是否引起精度变化
否