执行摘要
- 一句话:为 AMD CI lmms-eval 安装增加重试与安全目录
- 推荐动作:建议精读此 PR,它展示了处理 CI 中网络瞬态故障和 git 权限问题的典型模式。
git_clone_with_retry 和 docker cp + safe.directory 的组合可复用于类似场景。
功能与动机
AMD CI 的 Install dependencies 步骤中,lmms-eval 的 git clone 因网络瞬态 TLS 握手失败(gnutls_handshake() failed: Error in the pull function),而脚本使用 set -euo pipefail,单次失败即中止整个步骤。脚本中已定义 git_clone_with_retry 并用于 human-eval,但 lmms-eval 被遗漏。
实现拆解
- 在
scripts/ci/amd/amd_ci_install_dependency.sh 中将裸 git clone 替换为 git_clone_with_retry:该函数支持最多 3 次重试,设置 http.lowSpeedLimit=1000 + http.lowSpeedTime=30 以快速失败网络停滞,并在每次重试前清理部分克隆。
- 改用宿主机克隆 + docker cp 模式:在宿主机上执行带重试的克隆,然后通过
docker cp lmms-eval ci_sglang:/ 复制到容器内,避免在容器内直接克隆受网络影响。
- 修复容器内 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 以绕过此检查。
- 保留版本分支参数:
--branch v0.4.1 通过 git_clone_with_retry 的第三个参数传入,--depth 1 由函数自动添加。
关键文件:
scripts/ci/amd/amd_ci_install_dependency.sh(模块 CI 脚本;类别 infra;类型 infrastructure): 唯一变更文件,实现重试逻辑、复制方式和安全目录配置。
关键符号:未识别
关键源码片段
scripts/ci/amd/amd_ci_install_dependency.sh
唯一变更文件,实现重试逻辑、复制方式和安全目录配置。
# 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 在目标已存在时合并文件导致问题。当前 PR 未采纳此建议,但根据 bingxche 的批准状态,表明该风险在 CI 语境下可接受。
- 复制前清理容器目录 (design): 未采纳,但 PR 被批准,说明在当前 CI 流程下风险可接受。
风险与影响
- 风险:
- 低风险:变更仅限 CI 脚本,不影响运行时逻辑。
- 若
lmms-eval 目录在容器中已存在且内容有差异,docker cp 可能合并而非替换,导致文件残留。但 CI 容器通常每次新建,风险较低。
git config --global 可能影响容器内其他 git 操作,但仅限于该 CI 步骤后的生命周期。
- 影响:用户影响:无。系统影响:AMD CI 的 Install dependencies 步骤更稳定,减少因网络波动导致的 CI 重跑。团队影响:减少维护者在 AMD CI 失败时的排查成本。
- 风险标记:容器文件合并风险, 影响范围有限
关联脉络
- PR #24612 [AMD] VRAM cleanup step to AMD nightly test workflows: 同为 AMD CI 稳定性改进,修改了相近的工作流文件。
参与讨论