Prhub

#24615 [AMD] Retry logic for lmms-eval installation

原始 PR 作者 yctseng0211 合并时间 2026-05-11 10:55 文件变更 1 提交数 2 评论 1 代码增减 +6 / -1

执行摘要

为 AMD CI lmms-eval 安装增加重试与安全目录

AMD CI 的 Install dependencies 步骤中,lmms-evalgit clone 因网络瞬态 TLS 握手失败(gnutls_handshake() failed: Error in the pull function),而脚本使用 set -euo pipefail,单次失败即中止整个步骤。脚本中已定义 git_clone_with_retry 并用于 human-eval,但 lmms-eval 被遗漏。

建议精读此 PR,它展示了处理 CI 中网络瞬态故障和 git 权限问题的典型模式。git_clone_with_retrydocker cp + safe.directory 的组合可复用于类似场景。

讨论亮点

机器人评论(gemini-code-assist[bot])建议在复制前清理容器内旧目录,避免 docker cp 在目标已存在时合并文件导致问题。当前 PR 未采纳此建议,但根据 bingxche 的批准状态,表明该风险在 CI 语境下可接受。

实现拆解

  1. scripts/ci/amd/amd_ci_install_dependency.sh 中将裸 git clone 替换为 git_clone_with_retry:该函数支持最多 3 次重试,设置 http.lowSpeedLimit=1000 + http.lowSpeedTime=30 以快速失败网络停滞,并在每次重试前清理部分克隆。
  2. 改用宿主机克隆 + docker cp 模式:在宿主机上执行带重试的克隆,然后通过 docker cp lmms-eval ci_sglang:/ 复制到容器内,避免在容器内直接克隆受网络影响。
  3. 修复容器内 git 安全目录问题:当 docker cp 保留宿主机的非 root UID/GID 时,容器内 pip install 中的 vcs_versioning 会调用 git 检查版本,因所有权不匹配而报 fatal: detected dubious ownership in repository。添加 docker exec ci_sglang git config --global --add safe.directory /lmms-eval 以绕过此检查。
  4. 保留版本分支参数--branch v0.4.1 通过 git_clone_with_retry 的第三个参数传入,--depth 1 由函数自动添加。
文件 模块 状态 重要度
scripts/ci/amd/amd_ci_install_dependency.sh CI 脚本 modified 3.53

关键源码片段

scripts/ci/amd/amd_ci_install_dependency.sh infrastructure

唯一变更文件,实现重试逻辑、复制方式和安全目录配置。

# scripts/ci/amd/amd_ci_install_dependency.sh ( 片段 )
# ... 在 lmms-eval 安装部分之前,已有 git_clone_with_retry 函数定义 ...# 使用带重试的克隆函数,避免网络瞬态失败导致 CI 中断
# git_clone_with_retry <url> <dir> [extra_args]
git_clone_with_retry https://github.com/EvolvingLMMs-Lab/lmms-eval.git lmms-eval "--branch v0.4.1"
# 将宿主机克隆的目录复制到容器中;docker cp 保留原有 UID/GID
docker cp lmms-eval ci_sglang:/
# 标记目录为安全,使容器内 root 用户可执行 git 命令(例如 setuptools_scm 调用 git)
docker exec ci_sglang git config --global --add safe.directory /lmms-eval
# 与 human-eval 相同模式:使用 install_with_retry 包装 pip install
install_with_retry docker exec -w /lmms-eval ci_sglang pip install --cache-dir=/sgl-data/pip-cache -e .
​
# 紧接的 human-eval 部分已使用相同模式
# git_clone_with_retry https://github.com/akao-amd/human-eval.git human-eval
# docker cp human-eval ci_sglang:/
# ... 与上面一致

评论区精华

复制前清理容器目录 设计

gemini-code-assist[bot] 建议在 `docker cp` 前先 `rm -rf /lmms-eval`,以避免与旧文件合并。

结论:未采纳,但 PR 被批准,说明在当前 CI 流程下风险可接受。 · 待处理

风险与影响

  1. 低风险:变更仅限 CI 脚本,不影响运行时逻辑。
  2. lmms-eval 目录在容器中已存在且内容有差异,docker cp 可能合并而非替换,导致文件残留。但 CI 容器通常每次新建,风险较低。
  3. git config --global 可能影响容器内其他 git 操作,但仅限于该 CI 步骤后的生命周期。

用户影响:无。系统影响:AMD CI 的 Install dependencies 步骤更稳定,减少因网络波动导致的 CI 重跑。团队影响:减少维护者在 AMD CI 失败时的排查成本。

容器文件合并风险 影响范围有限

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论