Prhub

#38371 Enable building MoRI with AMD AINIC stack

原始 PR 作者 ichbinblau 合并时间 2026-04-21 02:18 文件变更 2 提交数 9 评论 20 代码增减 +54 / -4

执行摘要

ROCm Docker 构建新增 MoRI NIC 后端支持

升级MoRI到v1.1.0以支持运行时自动检测NIC后端,并允许用户在构建时通过NIC_BACKEND参数(如ainic)安装对应NIC驱动包,满足AMD Pensando NIC部署需求。参考SGLang的Docker实现,保持构建灵活性和基础镜像稳定性。

  • 对于使用AMD NIC的ROCm用户,此PR提供了清晰的构建方式,值得采用。
  • 对于vLLM基础镜像维护者,值得关注这种多阶段构建分离模式,在延长底层镜像生命周期和增加应用层灵活性之间做了良好平衡。
  • 建议后续添加对其他NIC后端(如Broadcom BNXT)的支持时采用类似模式。
讨论亮点
  • tjtanaa 提出将NIC后端构建从基础镜像移到应用镜像层,避免用户因NIC后端选择而必须重建耗时的基础镜像(PyTorch、aiter等)。ichbinblau 最初尝试在Dockerfile.rocm_base中添加逻辑,后根据建议迁移至Dockerfile.rocm
  • gshtras 强烈反对在Dockerfile.rocm中添加额外构建步骤,认为应保持简洁,建议要么在基础镜像中默认构建,要么支持从预构建制品安装。
  • billishyahao 指出MoRI v1.1.0已支持运行时NIC自动检测,仅需升级版本并在Dockerfile.rocm中安装用户态库。
  • 最终达成一致:基础镜像只升级MoRI版本(无NIC编译标志),在Dockerfile.rocm中新增mori_base阶段处理NIC依赖,基础镜像无需重建。
  • gemini-code-assist[bot] 指出apt-get调用效率问题(多次update)和shell变量使用不当($$应改为$),这些在最终版本中已修正。

实现拆解

  1. Dockerfile.rocm_base中,将MORI_BRANCH从固定SHA升级到v1.1.0,移除之前的USE_IONIC等编译标志,因为新版MoRI通过运行时环境变量自动检测NIC。

  2. Dockerfile.rocm顶部新增构建参数NIC_BACKEND(默认none)、AINIC_VERSIONUBUNTU_CODENAME

  3. 新增mori_base构建阶段,安装MoriIO代理Python依赖(blinker, quart, msgpack, aiohttp, pyzmq),并通过case语句根据NIC_BACKEND值执行不同操作:

    • none:跳过NIC驱动安装。
    • ainic:添加AMD AINIC仓库,安装libionic-devionic-common
    • 其他值:报错退出。
  4. testfinal阶段的基础镜像从base改为mori_base,确保这两个阶段包含MORI运行时和依赖。

  5. 在最终镜像中,向/app/versions.txt追加MORI_NIC_BACKENDAINIC_VERSION信息。

测试:通过docker build测试默认和ainic两种场景,验证构建成功和版本文件内容。

文件 模块 状态 重要度
docker/Dockerfile.rocm 构建脚本 modified 4.77
docker/Dockerfile.rocm_base 构建脚本 modified 2.78

关键源码片段

docker/Dockerfile.rocm infrastructure

核心变更文件:新增 `mori_base` 构建阶段,通过 `NIC_BACKEND` 参数条件安装 NIC 驱动和代理依赖;将 `test` 和 `final` 阶段基础镜像改为 `mori_base`,确保运行时包含 MORI。

FROM base AS mori_base
ARG NIC_BACKEND
ARG AINIC_VERSION
ARG UBUNTU_CODENAME
​
RUN /bin/bash -lc 'set -euo pipefail; \
  echo "[MORI] Install MoRI proxy deps"; \
  # 安装 MoriIO 代理所需 Python 包,用于分离式 / KV 工作流
  pip install --quiet --ignore-installed blinker && \
  pip install --quiet quart msgpack aiohttp pyzmq; \
  echo "[MORI] NIC_BACKEND=${NIC_BACKEND}"; \
  case "${NIC_BACKEND}" in \
    none) \
      # 默认:不安装 NIC 驱动,使用 mlx5
      ;; \
    ainic) \
      # AMD AINIC:添加官方仓库并安装驱动与开发包
      apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates curl gnupg apt-transport-https && \
      rm -rf /var/lib/apt/lists/* && mkdir -p /etc/apt/keyrings; \
      curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | gpg --dearmor > /etc/apt/keyrings/amdainic.gpg; \
      echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/amdainic.gpg] https://repo.radeon.com/amdainic/pensando/ubuntu/${AINIC_VERSION} ${UBUNTU_CODENAME} main" \
        > /etc/apt/sources.list.d/amdainic.list; \
      apt-get update && apt-get install -y --no-install-recommends \
        libionic-dev \
        ionic-common \
      ; \
      rm -rf /var/lib/apt/lists/*; \
      ;; \
    *) \
      echo "ERROR: unknown NIC_BACKEND=${NIC_BACKEND}. Use one of: none, ainic"; \
      exit 2; \
      ;; \
  esac;'# 后续 test 和 final 阶段从 mori_base 继承,确保运行时包含 MORI
FROM mori_base AS test
...
FROM mori_base AS final

评论区精华

NIC 后端构建放在哪个 Dockerfile 层 设计

tjtanaa 建议将 NIC 后端构建移入 Dockerfile.rocm 以避免用户重建基础镜像;gshtras 反对增加 Dockerfile.rocm 复杂度;billishyahao 指出 MoRI v1.1.0 已支持自动检测,只需升级版本并在应用层安装用户态包。

结论:最终在 Dockerfile.rocm 中新增 mori_base 阶段处理 NIC 依赖;基础镜像仅升级 MoRI 版本。 · 已解决

apt-get 操作效率 性能

gemini-code-assist[bot] 指出多次 apt-get update 和 rm -rf 违背 Docker 最佳实践,建议合并。

结论:已修复:最终版本中在 mori_base 阶段内只执行一次 update 和 clean。 · 已解决

Shell 变量语法错误 style

gemini-code-assist[bot] 指出使用 $$VAR 而非 $VAR 导致打印进程 ID 而非变量值。

结论:已修复:修改为 $VAR。 · 已解决

MoRI v1.1.0 NIC 自动检测 设计

billishyahao 说明新版本 MoRI 支持运行时自动检测 NIC,无需编译时指定 USE_IONIC 等标志,因此构建过程简化。

结论:采纳:移除编译标志,仅升级版本;NIC 用户态包安装留在应用层 Dockerfile。 · 已解决

风险与影响

  • 外部依赖风险:AINIC仓库地址可能变化或不可达,导致构建失败。
  • 构建效率:新增mori_base阶段增加约2分钟构建时间(用于安装代理依赖和NIC包)。
  • 兼容性:默认NIC_BACKEND=none行为不变,但finaltest阶段从base改为mori_base可能带入意外依赖(如pyzmq),但仅影响ROCm镜像。
  • 安全性:安装自第三方仓库的包(AMD AINIC)可能引入信任问题,但已验证位于官方repo.radeon.com
  • 用户:ROCm Docker用户现在可以通过--build-arg NIC_BACKEND=ainic构建支持AMD Pensando NIC的镜像;默认构建不变。
  • 系统:镜像大小增加约(NIC驱动和Python依赖),具体取决于选择的后端。
  • 团队:维护者需保持NIC仓库URL和版本号更新;CI中可能需要添加对不同NIC后端的构建验证。
外部仓库依赖 构建时间增加 2 分钟 基础镜像更换影响运行时 条件构建复杂度

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论