Prhub

#23502 [CI] Export GB200 nightly logs to S3

原始 PR 作者 csahithi 合并时间 2026-04-24 06:35 文件变更 2 提交数 2 评论 1 代码增减 +67 / -0

执行摘要

将 GB200 夜间测试日志导出到 S3 存储

目前查看GB200夜间运行日志的唯一方式是直接访问集群,这给开发者排查失败问题带来了障碍。本PR将完整的/logs目录(包括prefill/decode/frontend worker输出文件、benchmark-rollup.json等)上传到S3兼容后端,方便开发者通过mc cp或MinIO Web控制台访问。

本PR属于基础设施增强,逻辑清晰,风险较低。值得关注的是其路径设计模式,可复用于其他CI日志导出场景。建议合并。

讨论亮点

本PR仅有一条来自gemini-code-assist bot的评论,提示每日配额已达上限,未产生其他评审讨论。

实现拆解

  1. 修改scripts/ci/slurm/launch_gb200.sh:在生成的srtslurm.yaml中添加reporting.s3块,包含bucket、prefix和endpoint_url。prefix由${TRIGGER}/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}/${SEQ_LEN}/${MATRIX_CONFIG_NAME}组成。同时添加了环境变量验证,确保S3相关变量已设置。
  2. 修改.github/workflows/nightly-72-gpu-gb200.yml:在nightly-gb200-benchmark job中添加4个环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、S3_BUCKET、S3_ENDPOINT_URL),从仓库secrets中获取。同时添加MATRIX_CONFIG_NAME变量。
  3. 添加上传AI分析结果步骤:在工作流中新增一个步骤,当job失败时将ai_analysis.md文件上传到S3,路径与日志前缀一致,便于关联分析。
文件 模块 状态 重要度
scripts/ci/slurm/launch_gb200.sh CI 脚本 modified 4.83
.github/workflows/nightly-72-gpu-gb200.yml CI 工作流 modified 4.29

关键符号

fmt_seq_len

关键源码片段

scripts/ci/slurm/launch_gb200.sh infrastructure

核心变更:添加 S3 配置块和环境变量验证,定义日志路径前缀逻辑

# 验证环境变量是否设置,若未设置则报错退出
: "${S3_BUCKET:?S3_BUCKET must be set}"
: "${S3_ENDPOINT_URL:?S3_ENDPOINT_URL must be set}"
: "${AWS_ACCESS_KEY_ID:?AWS_ACCESS_KEY_ID must be set}"
: "${AWS_SECRET_ACCESS_KEY:?AWS_SECRET_ACCESS_KEY must be set}"
: "${MATRIX_CONFIG_NAME:?MATRIX_CONFIG_NAME must be set}"
: "${GITHUB_RUN_ID:?GITHUB_RUN_ID must be set}"
: "${GITHUB_RUN_ATTEMPT:?GITHUB_RUN_ATTEMPT must be set}"# 根据触发事件类型确定前缀顶级目录:cron 或 manual
case "${GITHUB_EVENT_NAME:-}" in
  schedule) TRIGGER=cron ;;
  workflow_dispatch) TRIGGER=manual ;;
  *) TRIGGER="${GITHUB_EVENT_NAME:-unknown}" ;;
esac# 将 ISL/OSL 转换为 k 单位(如 1k1k),便于按序列长度分组
fmt_seq_len() {
  local n=$1
  if (( n % 1024 == 0 )); then echo "$((n / 1024))k"; else echo "$n"; fi
}
SEQ_LEN="$(fmt_seq_len "$ISL")$(fmt_seq_len "$OSL")"
S3_PREFIX="${TRIGGER}/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}/${SEQ_LEN}/${MATRIX_CONFIG_NAME}"# 在 srtslurm.yaml 中添加 reporting.s3 配置,srt-slurm 会在 prefix 后追加日期 /Slurm 任务 ID
cat > srtslurm.yaml <<EOF
reporting:
  s3:
    bucket: "${S3_BUCKET}"
    prefix: "${S3_PREFIX}"
    endpoint_url: "${S3_ENDPOINT_URL}"
EOF
.github/workflows/nightly-72-gpu-gb200.yml infrastructure

工作流配置:添加 S3 环境变量和 AI 分析上传步骤

# 在 job 的 env 中传递 S3 凭据,这些值来自 repo secrets
env:
  MATRIX_CONFIG_NAME: ${{ matrix.config.name }}
  AWS_ACCESS_KEY_ID: ${{ secrets.NV_S3_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.NV_S3_SECRET_ACCESS_KEY }}
  S3_BUCKET: ${{ secrets.NV_S3_BUCKET }}
  S3_ENDPOINT_URL: ${{ secrets.NV_S3_ENDPOINT_URL }}# 新增步骤:当 job 失败时,将 AI 分析结果上传到 S3
- name: Upload AI analysis to S3
  if: failure()
  continue-on-error: true
  env:
    ISL: ${{ matrix.config.isl }}
    OSL: ${{ matrix.config.osl }}
  run: |
    ANALYSIS="${{ github.workspace }}/ai_analysis.md"
    [ -f "$ANALYSIS" ] || { echo "no ai_analysis.md, skipping"; exit 0; }
    case "${{ github.event_name }}" in
      schedule) TRIGGER=cron ;;
      workflow_dispatch) TRIGGER=manual ;;
      *) TRIGGER="${{ github.event_name }}" ;;
    esac
    fmt() { if [ $(( $1 % 1024 )) -eq 0 ]; then echo "$(( $1 / 1024 ))k"; else echo "$1"; fi; }
    SEQ_LEN="$(fmt "$ISL")$(fmt "$OSL")"
    KEY="${TRIGGER}/${{ github.run_id }}-${{ github.run_attempt }}/${SEQ_LEN}/${{ matrix.config.name }}/ai_analysis.md"
    aws --endpoint-url "$S3_ENDPOINT_URL" s3 cp "$ANALYSIS" "s3://${S3_BUCKET}/${KEY}"

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 凭据泄露风险:AWS凭据通过环境变量传递,未写入磁盘,但若CI日志泄露可能暴露凭据。建议确保secrets的访问权限受控。
  2. S3端点可用性:依赖MinIO实例的稳定性,若端点不可用会导致上传失败(已设置continue-on-error: true,不会阻塞主流程)。
  3. 路径冲突:多个运行可能产生相同前缀,可能导致覆盖。但prefix包含run_id-attempt和日期,冲突概率较低。

用户:开发者可通过S3访问日志,无需直接登录集群,降低排查故障的门槛。
系统:新增S3上传步骤,使用continue-on-error: true,不会影响核心测试流程。
团队:需要维护MinIO实例和S3凭据,但无需变更现有工作流。

凭据通过环境变量传递 依赖外部 S3 端点

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论