Skip to content

APITest 测试修复:修复被外部强杀时的 checkpoint 遗留问题#646

Open
cangtianhuang wants to merge 4 commits into
PFCCLab:mainfrom
cangtianhuang:fix/enginev4-cleanup
Open

APITest 测试修复:修复被外部强杀时的 checkpoint 遗留问题#646
cangtianhuang wants to merge 4 commits into
PFCCLab:mainfrom
cangtianhuang:fix/enginev4-cleanup

Conversation

@cangtianhuang

Copy link
Copy Markdown
Collaborator

背景

当前 PaddleAPITest 的 engineV2 / engineV4 在批量执行 API case 时,原先会在 worker 开始执行 case 后较早写入 checkpoint。这样在一些非正常中断场景下会产生不一致:

  • case 实际还没有完成,但已经被写入 checkpoint
  • worker 被外部 SIGKILL / SIGTERM 杀掉后,下一次 resume 会错误跳过该 case
  • result log 中可能残留没有 checkpoint 对应项的结果行,影响后续统计和续跑判断
  • engineV4 的 compute-sanitizer 子进程 crash 与 worker 本身 crash 的语义不够清晰

本 PR 调整了 checkpoint 写入语义,只有主进程确认 case 已经完成结果归档/分类后,才将该 case 写入 checkpoint。如果发生了外部 kill,将不会写入 checkpoint,使得未完成 case 可以被重试

主要变更

1. 调整 engineV2 checkpoint 写入时机

  • 移除 run_test_case() 开始阶段的 checkpoint 写入。
  • 将 checkpoint 写入移动到主进程处理 future 结果之后。
  • 对 worker 被外部 SIGKILL / SIGTERM 杀掉的场景特殊处理:
    • 不写 checkpoint;
    • 打印 warning;
    • case 会在下一次运行中重新进入待测集合。
  • timeout、普通 crash、error 等已经完成分类的结果仍然会写 checkpoint。

2. 调整 engineV4 checkpoint 与 external kill 处理

  • 与 engineV2 一致,移除 run_test_case() 开始阶段的 checkpoint 写入。
  • 主循环在完成 done / timeout / crashed / error 分类后统一写 checkpoint。
  • 对外部 SIGKILL / SIGTERM 场景:
    • 不写 checkpoint;
    • 当前运行中优先重试该 config;
    • 如果 worker 可复用,则重新 dispatch;
    • 如果 worker 不可复用,则放回 pending 队首,等待 worker restart 后优先执行。

3. 改进 engineV4 compute-sanitizer crash 语义

  • compute-sanitizer child 进程非预期退出时,向主进程消息中携带 crash_source="child"
  • 主进程可以区分:
    • sanitizer child crash;
    • worker 进程 crash。
  • sanitizer child crash 时,worker 仍可被视为可复用,减少不必要的 worker restart。

4. 新增 stale result log 清理逻辑

tester/api_config/log_writer.py 中新增 cleanup_uncheckpointed_result_logs()

  • 启动批量测试时,先聚合 .tmp 日志;
  • 再清理没有 checkpoint 对应项的 result log 行;
  • 只保留同时存在于 checkpoint.txt 的终态日志行;
  • 避免上次异常中断后留下“有结果日志但没有 checkpoint”的脏数据。

清理范围覆盖除 checkpoint 外的各类结果日志,例如 pass、paddle error、accuracy error、timeout、crash、OOM、CUDA error 等。

行为变化

checkpoint 语义变化

变更前:

  • checkpoint 更接近“case 已经开始执行”。

变更后:

  • checkpoint 更接近“case 已经被主进程确认完成归档/分类”。

这能避免 worker 被外部 kill 后,未完成 case 被错误跳过。

external kill 恢复策略

  • engineV2:外部 kill 后不写 checkpoint,case 在下一次运行中重试。
  • engineV4:外部 kill 后不写 checkpoint,并在当前运行中尽量优先重试。

result log 恢复策略

  • 每次启动批量测试时会清理无 checkpoint 对应项的 stale result rows。
  • result log 与 checkpoint 的一致性更强,续跑和统计结果更可靠。

@cangtianhuang cangtianhuang changed the title APITest 问题修复:修复被外部强杀时的 checkpoint 遗留问题 APITest 测试修复:修复被外部强杀时的 checkpoint 遗留问题 Jun 12, 2026
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.

1 participant