执行摘要
- 一句话:修复 ROCm 多流性能问题及 rocprofiler 崩溃,更新 ROCR+CLR 运行时并移除测试变通方案。
- 推荐动作:本 PR 值得精读,尤其是对于关注 ROCm 支持、性能优化和 CI/稳定性的团队。它不仅仅是一个简单的依赖更新,而是涉及构建流程优化、上游关键修复集成和测试代码清理的系统性改进。其设计决策(如构建阶段重排)反映了对构建系统效率和长期维护的深思熟虑。建议重点关注:
- Docker 构建阶段重排背后的推理,这可以作为优化多阶段 Docker 构建的范例。
- 如何系统地追踪和解决由外部库(ROCm 运行时、rocprofiler)引起的问题,并通过上游协作最终移除代码中的变通方案。
- 多流性能改进的具体补丁内容(可通过 PR body 中链接的上游 PR 了解),这对理解 ROCm 性能调优有参考价值。
功能与动机
动机源于解决多个已报告的问题和性能瓶颈:
1) 多流工作负载(如 #52033, #51794, #51117)中存在慢跨流依赖,影响性能;
2) DeepEP MoE 测试在 ROCm 上因 rocprofiler-sdk 附着导致进程退出时发生 SIGSEGV 崩溃(#51644, #51174, #51173);
3) 某些分析工作负载仍存在挂起问题(#54171)。该 PR 通过引入上游 ROCm 系统库的修复来根本解决这些问题。
实现拆解
- Docker 构建流程优化:在
docker/Dockerfile.rocm_base 中,将 ROCR+CLR 运行时的构建从 base 阶段的前置条件移到 components 构建部分之后的一个独立阶段(build_rocm_runtime)。这样做的原因是:下游库仅动态链接它们,此重定位是安全的;同时,它避免了 ROCR+CLR 更新时导致所有构建阶段缓存失效并强制重建。
- 引入上游性能与崩溃修复:更新
ROCM_RUNTIME_COMMIT 指向包含特定补丁的提交,这些补丁解决了多流性能问题(回溯至 ROCm/rocm-systems#11212)和崩溃问题(ROCm/rocm-systems#6942)。
- 移除测试中的临时变通方案:在
tests/kernels/moe/test_deepep_moe.py 和 tests/kernels/moe/parallel_utils.py 中,移除了为规避崩溃而添加的 ROCPROFILER_REGISTER_ENABLED=0 环境变量设置和 os._exit 调用。这些变通方案的移除表明根本原因已被上游修复解决。
- 为 ROCm 10.0 镜像应用相同改进:在
docker/Dockerfile.rock_base 中,为 ROCm 10.0 镜像引入了相同的多流性能改进构建步骤。
- 配置调整:为了解决一个并发构建竞争条件,在 Triton 构建命令中显式设置了
MAX_JOBS=16。
关键文件:
docker/Dockerfile.rocm_base(模块 构建配置;类别 infra;类型 infrastructure): 核心基础设施文件,包含 ROCm 基础镜像的构建流程重构和运行时库更新,直接影响所有 ROCm 镜像的构建和最终产物。
docker/Dockerfile.rock_base(模块 构建配置;类别 infra;类型 infrastructure): 为 ROCm 10.0 (TheRock) 镜像引入相同的多流性能改进构建步骤,确保不同 ROCm 版本的基础镜像都包含关键修复。
tests/kernels/moe/parallel_utils.py(模块 测试工具;类别 test;类型 test-coverage): 移除了为规避 ROCm 崩溃而添加的测试变通方案(os._exit),这标志着根本原因修复,简化了测试代码。
tests/kernels/moe/test_deepep_moe.py(模块 MoE 测试;类别 test;类型 test-coverage): 移除了测试函数中为 ROCm 平台设置禁用 rocprofiler 的 monkeypatch,依赖上游修复来确保测试正常退出。
关键符号:未识别
关键源码片段
docker/Dockerfile.rocm_base
核心基础设施文件,包含 ROCm 基础镜像的构建流程重构和运行时库更新,直接影响所有 ROCm 镜像的构建和最终产物。
###
### ROCR + CLR build
###
# 将此构建阶段从 base 阶段的前置条件移至 components 构建之后。
# 原因:下游库仅动态链接它们,重置此顺序是安全的。
# 主要好处:避免更新 ROCR/CLR 时导致所有下游构建阶段(如 AITER, MORI)缓存失效。
FROM base AS build_rocm_runtime
ARG ROCM_SYSTEMS_REPO
ARG ROCM_RUNTIME_COMMIT
# 安装必要的构建依赖
RUN apt-get update \
&& apt-get install -y --no-install-recommends g++ \
libelf-dev libdrm-dev libnuma-dev libdw-dev xxd \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir CppHeaderParser
# 使用 sparse checkout 拉取特定的子项目和提交
RUN git init -q /src && cd /src \
&& git remote add origin ${ROCM_SYSTEMS_REPO} \
&& git config core.sparseCheckout true \
&& git config remote.origin.promisor true \
&& git config remote.origin.partialclonefilter blob:none \
&& git sparse-checkout init --cone \
&& git sparse-checkout set projects/rocr-runtime projects/clr projects/hip shared cmake \
&& git fetch --filter=blob:none --depth 1 origin ${ROCM_RUNTIME_COMMIT} \
&& git checkout -q FETCH_HEAD
# 构建 ROCr 和 CLR,并安装到临时目录
# ... ( 省略具体的 cmake 命令 ) ...
docker/Dockerfile.rock_base
为 ROCm 10.0 (TheRock) 镜像引入相同的多流性能改进构建步骤,确保不同 ROCm 版本的基础镜像都包含关键修复。
###
### ROCR + CLR build
###
# 引入多流性能改进,在这些改进进入官方发布前使用此构建。
FROM base AS build_rocm_runtime
ARG ROCM_SYSTEMS_REPO
ARG ROCM_RUNTIME_COMMIT
# 安装依赖,包括 libgl-dev 以满足 rocclr 的 OpenGL 查找要求
RUN apt-get update \
&& apt-get install -y --no-install-recommends g++ libdw-dev xxd libgl-dev libglx-dev \
&& rm -rf /var/lib/apt/lists/*
# ... ( 后续构建步骤类似 Dockerfile.rocm_base) ...
评论区精华
核心讨论集中在 Docker 构建阶段的重新组织和 Triton 构建的 MAX_JOBS 设置上。
风险与影响
关联脉络
- PR #53712 [ROCm] Workaround cross-stream event performance issue: 本 PR 完成了由 #53712 开始的修复系列,后者仅解决了某些流事件的性能问题。本 PR 引入了更全面的上游补丁,解决了跨流依赖的根本问题。
- PR #51174 [ROCm] Work around DeepEP teardown SIGSEGV in MoE test harness: 本 PR 回滚了 #51174 中引入的临时变通方案(通过
os._exit 退出测试进程),因为 ROCR+CLR 更新已包含正确的修复。
- PR #51173 [ROCm][CI] Keep rocprofiler-sdk out of DeepEP HT MoE test workers: 本 PR 回滚了 #51173 中引入的临时变通方案(通过设置
ROCPROFILER_REGISTER_ENABLED=0),因为 ROCR+CLR 更新已解决相关崩溃。
- PR #52033 [Bugfix] Fix race condition in distributed executor: 本 PR 解决的多流性能问题与 #52033 中报告的问题相关,这些问题都涉及并发工作负载。
参与讨论