Prhub

#27538 [AMD] ci: reinstall MoRI if Different from Dockerfile-pinned commit during install_dependency

原始 PR 作者 bingxche 合并时间 2026-06-08 16:29 文件变更 1 提交数 1 评论 1 代码增减 +31 / -0

执行摘要

CI 中动态重装 MoRI 以匹配 Dockerfile 版本

AMD CI 镜像预装了 MoRI,但不会因 PR 变更镜像。当 PR#26922 更新 MORI_COMMIT 以引入新 API(如 IOEngine.wait_all)时,CI 容器仍使用旧 MoRI,导致反聚合测试失败。需在依赖安装阶段动态重装 MoRI 以匹配 Dockerfile。

该 PR 是基础设施层面的维护,值得关注其解决特定 CI 问题的方法:在不可变 CI 镜像中动态替换预装组件以匹配当前代码。对于维护 CI 管线的工程师,可借鉴其模式。一般工程师无需深入阅读。

讨论亮点

机器人评论指出,直接将宿主变量嵌入双引号 docker exec bash -c "..." 可能存在 shell 转义风险,建议使用 docker exec -e 传递环境变量并用单引号包裹命令。该建议未在后续讨论中被采纳或拒绝,PR 已被合并。

实现拆解

scripts/ci/amd/amd_ci_install_dependency.sh 文件末尾,accelerate 安装之后,插入一段条件逻辑:

  1. 通过 docker exec ci_sglang test -d /sgl-workspace/mori 检查容器内是否存在 MoRI 目录(仅 ENABLE_MORI=1 的镜像包含)。
  2. 如果存在,则从 docker/rocm.Dockerfile 中提取 MORI_REPOMORI_COMMIT 变量。
  3. 根据 GPU_ARCH 环境变量设置 MoRI 的 GPU 架构(gfx950 或 gfx942)。
  4. 在容器内依次执行:删除旧 MoRI 目录、克隆指定仓库、切换到指定 commit、初始化子模块、运行 python3 setup.py develop 安装、配置 torch 库路径并运行 ldconfig
  5. 整个过程记录日志,并在完成后输出 [MORI] Done.
    该步骤无额外配置或测试配套。
文件 模块 状态 重要度
scripts/ci/amd/amd_ci_install_dependency.sh 部署脚本 modified 4.74

关键源码片段

scripts/ci/amd/amd_ci_install_dependency.sh infrastructure

该文件是唯一的变更文件,包含在 CI 容器内动态重装 MoRI 的完整脚本逻辑,是 PR 的核心。

# 脚本片段:scripts/ci/amd/amd_ci_install_dependency.sh ( 新增部分 )# 检查容器内是否存在 MoRI 目录(仅 ENABLE_MORI=1 的镜像包含)
if docker exec ci_sglang test -d /sgl-workspace/mori; then
    # 从 docker/rocm.Dockerfile 中提取 MORI_REPO 和 MORI_COMMIT
    MORI_REPO=$(grep -E '^[[:space:]]*ARG[[:space:]]+MORI_REPO=' docker/rocm.Dockerfile | head -n1 | sed 's/.*MORI_REPO="\([^"]*\)".*/\1/')
    MORI_COMMIT=$(grep -E '^[[:space:]]*ARG[[:space:]]+MORI_COMMIT=' docker/rocm.Dockerfile | head -n1 | sed 's/.*MORI_COMMIT="\([^"]*\)".*/\1/')    # 根据 GPU_ARCH 设置 MoRI 的 GPU 架构
    if [[ "${GPU_ARCH}" == "mi35x" ]]; then
        MORI_GPU_ARCHS="gfx950"
    else
        MORI_GPU_ARCHS="gfx942"
    fi    echo "[MORI] Reinstalling MORI ${MORI_COMMIT} (MORI_GPU_ARCHS=${MORI_GPU_ARCHS})"    # 在容器内重新安装 MoRI:删除旧目录、克隆、切换 commit、初始化子模块、安装
    docker exec ci_sglang bash -c "
        set -euo pipefail
        export MORI_GPU_ARCHS='${MORI_GPU_ARCHS}'
        rm -rf /sgl-workspace/mori
        git clone '${MORI_REPO}' /sgl-workspace/mori
        cd /sgl-workspace/mori
        git checkout '${MORI_COMMIT}'
        git submodule update --init --recursive
        python3 setup.py develop
        python3 -c 'import os, torch; print(os.path.join(os.path.dirname(torch.__file__), \"lib\"))' > /etc/ld.so.conf.d/torch.conf
        ldconfig
    "
    echo "[MORI] Done."
fi

评论区精华

host 变量传递的安全性 设计

Gemini Code Assist 机器人指出,将宿主变量直接嵌入双引号 `docker exec bash -c "..."` 字符串脆弱,建议使用 `docker exec -e` 传递环境变量,并用单引号包裹命令,以避免 shell 解析和转义问题。

结论:未采纳建议;PR 已合并,代码保持原有方式。 · 已解决

风险与影响

风险较低。该变更仅影响 AMD CI 中启用了 MoRI 的容器(通过 /sgl-workspace/mori 目录守卫),不影响其他套件。潜在问题包括:

  • 如果 Dockerfile 中 MORI_COMMITMORI_REPO 格式变化,提取逻辑可能失败。
  • 重装 MoRI 会增加依赖安装步骤的时间。
  • 未处理网络问题导致 clone 失败的情况。

影响范围限于 AMD CI 中启用了 MoRI 的测试套件(主要是 mi35x 反聚合测试)。该步骤确保 CI 使用与 Dockerfile 完全一致的 MoRI 版本,避免因镜像陈旧导致的测试失败。对其他 GPU 架构或无 MoRI 的套件无影响。

低风险基础设施变更 缺少网络异常处理

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论