# PR #24615 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[AMD] Retry logic for lmms-eval installation
- 合并时间：2026-05-11 10:55
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/24615

---

# 执行摘要

- 一句话：为 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` 被遗漏。

# 实现拆解

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 脚本；类别 infra；类型 infrastructure）: 唯一变更文件，实现重试逻辑、复制方式和安全目录配置。

关键符号：未识别

## 关键源码片段

### `scripts/ci/amd/amd_ci_install_dependency.sh`

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

```bash
# 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 流程下风险可接受。

# 风险与影响

- 风险：
 1. **低风险**：变更仅限 CI 脚本，不影响运行时逻辑。
 2. 若 `lmms-eval` 目录在容器中已存在且内容有差异，`docker cp` 可能合并而非替换，导致文件残留。但 CI 容器通常每次新建，风险较低。
 3. `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 稳定性改进，修改了相近的工作流文件。