Prhub

#22545 feat: add weekly workflow to update CI test est_time values

sgl-project/sglang · 作者 ch-wan · 合并时间 2026-04-11 06:03

分析状态 已生成
文件变更 2提交数 3 · 评论 2
代码增减 +323 / -0
ci run-ci

执行摘要

添加每周工作流自动化更新 CI 测试估计时间,优化负载均衡。

根据PR body,'est_time values in CI test registration calls drift from actual execution times over time. These values drive the LPT load-balancing algorithm that partitions tests across parallel CI jobs. Inaccurate estimates lead to unbalanced partitions, wasting CI resources.' 目标是自动化保持这些值的准确性。

该PR值得精读,特别是脚本中的日志解析、中位数计算和正则表达式更新逻辑,这些设计决策展示了CI自动化的最佳实践;建议关注GitHub API集成和错误处理部分,以了解如何稳健处理外部数据源。

讨论亮点

review中gemini-code-assist[bot]指出两个核心问题:1. 后端检测函数determine_backend仅识别'cpu'并默认其他为'cuda',需要支持'amd'和'npu'以避免混合硬件平台时间数据;2. 更新逻辑的正则表达式不够稳健,无法处理空格、浮点数或文件内多处est_time值。作者通过后续提交解决了这些问题:更新了determine_backend以包括'amd'和'npu',并改进了更新逻辑。讨论已解决,无未决疑虑。

实现拆解

实现方案包括两个新增文件:1. .github/workflows/weekly-update-est-time.yml:每周六00:00 UTC触发的GitHub Actions工作流,运行更新脚本并在检测到变更时自动创建PR。2. scripts/ci/update_est_time.py:Python脚本,通过GitHub API获取最近20个调度的PR Test运行日志,解析每个测试文件的执行时间,计算最后10次成功执行的中位数,并使用正则表达式匹配和更新源代码中的est_time字面量。目前仅支持NVIDIA后端(CUDA + CPU),计划未来扩展至AMD、NPU等。

文件 模块 状态 重要度
.github/workflows/weekly-update-est-time.yml CI Infrastructure added 7.0
scripts/ci/update_est_time.py CI Tooling added 8.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

determine_backend parse_job_logs gh_api update_file_est_times

评论区精华

后端检测支持扩展 设计

gemini-code-assist[bot] 指出 determine_backend 函数仅识别 'cpu',默认其他为 'cuda',而 CI 注册支持 'amd' 和 'npu' 后端,混合数据会导致不准确。

结论:作者通过提交更新了函数以包括 'amd' 和 'npu' 后端,确保时间数据按硬件平台正确分类。 · 已解决

更新逻辑稳健性改进 正确性

review 指出正则表达式和更新逻辑可能无法处理空格、浮点数或文件内多处 est_time 值,存在误匹配风险。

结论:作者在后续提交中改进了逻辑,但具体细节未在提供材料中显示;评论被采纳并解决。 · 已解决

风险与影响

技术风险包括:1. 依赖GitHub API,若API变更或访问失败可能导致脚本中断(文件:scripts/ci/update_est_time.py中的gh_api函数)。2. 正则表达式更新可能错误匹配或遗漏est_time值,导致数据不准确(如浮点数处理、多行匹配问题)。3. 计算基于最后10次执行的中位数,在测试逻辑频繁变更时可能导致估计偏差。4. 自动化PR创建需GH_PAT_FOR_PULL_REQUEST权限,若泄露可能引入安全风险。

对CI系统:提高LPT负载均衡算法准确性,减少测试分区不平衡,提升并行测试效率和资源利用率,预计减少浪费。对团队:自动化减轻手动更新负担,但需监控脚本运行和日志解析的准确性。影响范围限于CI测试配置,不直接影响模型推理性能或用户功能。

依赖外部 API 正则表达式脆弱 数据采样偏差

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

本次PR引入每周自动化工作流和脚本,基于历史CI日志更新测试估计时间值,优化负载均衡以减少资源浪费,是一个有意义的CI基础设施改进。

功能与动机

为什么做:CI测试注册调用中的est_time值随时间漂移,这些值驱动LPT负载均衡算法分区并行测试作业。不准确的估计导致分区不平衡,浪费CI资源。引用PR body:"Inaccurate estimates lead to unbalanced partitions, wasting CI resources."

实现拆解

新增文件

  • .github/workflows/weekly-update-est-time.yml:每周六00:00 UTC触发的工作流,运行更新脚本,并在检测到变更时自动创建PR。
  • scripts/ci/update_est_time.py:Python脚本,核心功能包括:
    • 通过GitHub API获取最近20个调度的PR Test运行日志。
    • 使用正则表达式解析日志中的文件执行时间(例如filename='.../test_x.py', elapsed=120)。
    • 计算每个测试文件最后10次成功执行的中位数。
    • 通过正则表达式匹配并更新源代码中的est_time字面量。

关键逻辑代码块示例(来自脚本):

LOG_PATTERN = re.compile(
    r"filename='[^']*?/sglang/((?:test|python)/[^']+\.py)', elapsed=(\d+),"
)
def determine_backend(job_name):
    name = job_name.lower()
    for backend in ["cpu", "amd", "npu"]:
        if backend in name:
            return backend
    return "cuda"

评论区精华

review中gemini-code-assist[bot]提出两个关键讨论:

  • 后端检测扩展

    "The current implementation only recognizes 'cpu' and defaults everything else to 'cuda'... should be updated to correctly identify them from job names."
    结论:作者更新determine_backend函数以支持'amd'和'npu',确保时间数据按硬件平台正确分离。

  • 更新逻辑稳健性

    "The regex and update logic have several issues:

    1. Strictness... 2. Type Handling... 3. Logic Flaw..."
      结论:作者改进了逻辑,解决空格、浮点数处理等问题,确保更新准确。

风险与影响

风险

  1. 依赖外部API:脚本依赖GitHub API获取日志,若API变更或故障,更新流程可能中断。
  2. 正则表达式脆弱:匹配逻辑可能无法覆盖所有代码格式(如多行调用),导致部分est_time值未被更新。
  3. 数据采样偏差:仅基于最后10次执行计算中位数,在测试频繁变更时可能产生不准确估计。

影响

  • 积极影响:提升CI负载均衡准确性,减少资源浪费,估计可改善测试分区效率(例如案例中test_deepseek_v3_fp4_4gpu.py从450秒更新至1146秒)。
  • 范围:仅影响CI测试配置,不改变模型推理逻辑或用户功能。

关联脉络

与历史PR的关系

  • PR #22461:添加GB200夜间性能回归管道,同为CI基础设施改进,显示团队持续优化测试监控。
  • PR #22465:更新CI权限,与本PR的自动化PR创建权限管理相关。
    演进趋势:这表明sglang项目正加强CI自动化和资源管理,以减少手动维护成本并提升测试效率。

参与讨论