Skip to content

测试优化:统一任务运行与日志可靠性,优化测试错误诊断及大 Tensor 性能 - #711

Merged
cangtianhuang merged 12 commits into
PFCCLab:mainfrom
cangtianhuang:dev
Aug 18, 2026
Merged

测试优化:统一任务运行与日志可靠性,优化测试错误诊断及大 Tensor 性能#711
cangtianhuang merged 12 commits into
PFCCLab:mainfrom
cangtianhuang:dev

Conversation

@cangtianhuang

Copy link
Copy Markdown
Collaborator

PR 标题:统一任务运行与日志可靠性,优化测试错误诊断及大 Tensor 性能

📌 背景

dev 分支本次合入同时覆盖任务运行管理、后台日志可靠性、测试错误分类、输入生成和多 worker 性能。目标是在保持既有小配置随机输入行为和测试模式语义的前提下,降低同一输出目录的并发竞态,保证进程异常退出后日志可以恢复,并让失败位置能够被稳定识别。

🔎 主要问题

  • run.py、示例脚本和 V4 批量脚本各自按脚本名维护 PID 文件,同一输出目录可能被不同入口重复启动或互相清理。
  • worker 初始化时会触碰主进程使用的日志聚合状态;CASE 日志在进程被终止或主进程重启时,存在未持久化、重复聚合或丢失的风险。
  • 不同测试模式使用 phase 和自由文本报告错误,输入、框架执行、CUDA 同步、比较和显存预检的边界不一致。
  • 大 Tensor 随机输入先生成 float32/int64 再转换为目标 dtype,超过 INT32_MAX 的配置会放大临时显存和执行开销。
  • take_along_axis 的 Tensor method 使用 x 作为接收者,但输入规则只查找函数形式的 arr 参数。

🛠️ 实现方案

1. 按输出目录统一任务锁

  • run.py 移除可配置的 runner.pid_file,将 PID 文件固定为 output.log_dir/.paddleapitest.pid,锁文件为同目录的 .paddleapitest.pid.lock
  • 启动、停止、状态查询和后台清理共用 fcntl.flock,启动前检查同一输出目录是否已有任务。
  • 停止操作针对整个进程组发送信号并等待退出,旧任务只能清理与自身 PID 匹配的记录,避免误删新任务的 PID 文件。
  • run-example.sh 和全部 test_pipeline/V4/*.sh 同步使用输出目录级 PID/锁协议,并始终打印日志跟踪入口。
  • CLI 文档、运行配置 schema 和示例配置同步删除 pid_file 说明。

2. 使后台日志聚合可恢复

  • worker 只初始化自己的日志分片,不再重置或恢复主进程的聚合状态。
  • CASE 结束标记、结果分片和原子写入统一执行 flush + fsync;主进程在收到完成偏移前确保 worker 日志已落盘。
  • 顺序 CASE 日志使用持久化 offset 状态和 .log_inorder.build 构建文件,异常重启时截断到最后一个安全提交点。
  • 聚合结果先写入并持久化 build,再通过临时文件和 os.replace 原子发布;所有派生结果成功后才清理 source,失败时可重试。
  • 保留结果文件的偏移追踪和重复分类检查,减少重启后的重复写入与日志丢失。

3. 统一错误阶段协议

  • tester/reporting/log_schema.py 定义统一的 Stage,覆盖 Input、Paddle/Torch 前向与反向、CUDA 同步、CompareMemory preflight
  • accuracyaccuracy_stablepaddle_only、CINN、设备对比和性能测试统一通过阶段常量报告错误,比较错误不再混入任一框架执行阶段。
  • 输入物化、算子执行、同步检查和显存预检分别保留错误边界;日志和 dump 名称使用同一阶段来源。
  • 删除已停用的 Paddle 错误豁免路径及 allow_ignore_paddle/paddle_error_dismiss 依赖,避免未分类异常被错误标记为 pass。

4. 优化多 worker 和超大 Tensor

  • Torch CPU 线程数按同卡 worker 数分摊,默认单 worker 仍为 8 个线程;tester 消费 engine 已发布的同卡 worker 数并负责应用策略。
  • 形状达到 1 << 20 个元素时,float16 随机输入可直接按目标 storage dtype 生成;满足 int32 边界约束时,randint 可直接生成 int32。
  • 小配置继续使用原有 float32/int64 生成及转换路径,避免改变既有随机序列;bfloat16 的显存预检继续按 float32 storage 保守估算。
  • float16 显存预检与直接生成路径对齐,避免为大配置重复计入完整 float32 临时 Tensor。

5. 修复输入规则边界

  • take_along_axis 输入规则同时支持函数参数 arr 和 Tensor method 接收者 x,并继续按 axis 维度限制索引范围。

📁 主要改动文件

类别 文件 功能说明
运行管理 run.pyrun-example.shtest_pipeline/V4/*.sh 输出目录级 PID/锁、进程组停止和状态清理
配置文档 docs/CLI_REFERENCE.mdtest_pipeline/run_config.schema.jsontest_pipeline/run_config.yaml 同步 runner 配置和 PID 文件约定
engine engineV4.py worker 日志初始化边界
日志聚合 tester/reporting/log_aggregation.pylog_runtime.pylog_worker.pyreporting/__init__.py fsync、offset 恢复、原子发布和主/worker 状态隔离
错误分类 tester/reporting/log_schema.pylog_comparison.pytester/base.py 及各测试模式 统一阶段标签和失败诊断
输入与显存 tester/input_generation/backend.pygeneration_rules.pytester/runtime/gpu_memory_preflight.py 目标 dtype 原生生成、method 参数绑定和预检估算

@cangtianhuang
cangtianhuang enabled auto-merge (squash) August 18, 2026 11:05
@cangtianhuang
cangtianhuang merged commit f5acd27 into PFCCLab:main Aug 18, 2026
1 check passed
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