Prhub

#28473 [AMD] Fall back to layer_first layout for kernel write-back on ROCm

原始 PR 作者 yctseng0211 合并时间 2026-06-17 18:01 文件变更 1 提交数 2 评论 1 代码增减 +14 / -0

执行摘要

修复 ROCm 上 kernel write-back 崩溃

PR #21631 将 hicache_mem_layout 默认值从 layer_first 改为 page_first 后,AMD/ROCm 的 HiCache CI 开始失败。原因是 ROCm 无法使用 CUDA-only 的 JIT staged write-back 内核,回退路径中调用了需要 CUDA 张量的非 JIT 内核,但 write-back 传入的是 CPU 张量,导致 TORCH_CHECK(dst_indices.is_cuda(), "Destination indices must be a CUDA tensor") 崩溃。PR body 明确描述了此问题及两种 CI 失败表现:test_hicache_variants.py 中 MLA 模型调度器异常退出,test_hicache_storage.py 中 MHA 模型首次 write-back 崩溃导致 MMLU 评分 0.0。

建议精读该 PR 以理解 HiCache 布局与 IO 后端之间的兼容性约束,以及跨平台(CUDA vs. ROCm)条件编译的典型模式。对于 AMD 平台开发者,这是一个值得关注的防御性修复案例。

讨论亮点

该 PR 的 review 讨论较少:仅有 1 条 review 评论(HaiShaw 的 approve),且未留下 review 评论数据。PR body 中对问题的描述和解决方案已足够清晰,无需额外讨论。

实现拆解

  1. 确定问题根因:在 python/sglang/srt/server_args.py_resolve_layout_io_compatibility() 方法中,page_first + kernel 组合在 ROCm 上不可用,因为非 JIT 回退内核要求索引张量在 CUDA 设备上,而 write-back 传递的是 CPU 张量(host_indices)。
  2. 添加回退逻辑:在 _resolve_layout_io_compatibility() 方法末尾新增一个条件分支(+14 行),当 hicache_mem_layout == "page_first"hicache_io_backend == "kernel"is_hip() 为 True 时,将 hicache_mem_layout 设置为 "layer_first",并记录一条警告日志。
  3. 保持原有兼容性逻辑不变:原有针对 page_first_direct + kernel 回退到 direct、以及 page_first + direct 转换为 page_first_direct 的逻辑保持不变。_resolve_storage_layout_compatibility() 方法也未改动。
  4. 无测试文件变更:本次改动未新增或修改测试文件,CI 测试依赖现有 AMD 测试套件(如 test_hicache_variants.pytest_hicache_storage.py)。
文件 模块 状态 重要度
python/sglang/srt/server_args.py 配置解析 modified 6.16

关键源码片段

python/sglang/srt/server_args.py core-logic

核心修复文件:在 `_resolve_layout_io_compatibility()` 方法中新增了 ROCm 平台下 `page_first` + `kernel` 配置回退到 `layer_first` 的逻辑。修改了 HiCache 布局与 IO 后端的兼容性决策链。

# python/sglang/srt/server_args.py (head) - 新增回退逻辑def _resolve_layout_io_compatibility(self):
    # 已有逻辑:page_first_direct + kernel -> direct
    if (
        self.hicache_mem_layout == "page_first_direct"
        and self.hicache_io_backend == "kernel"
    ):
        self.hicache_io_backend = "direct"
        logger.warning(
            "Kernel io backend does not support page first direct layout, "
            "switching to direct io backend"
        )
​
    # 已有逻辑:page_first + direct -> page_first_direct
    if (
        self.hicache_mem_layout == "page_first"
        and self.hicache_io_backend == "direct"
    ):
        self.hicache_mem_layout = "page_first_direct"
        logger.warning(
            "Page first layout is not supported with direct IO backend, "
            "switching to page first direct layout"
        )
​
    # 新增:ROCm 平台下 page_first + kernel 回退到 layer_first
    # The page_first kernel write-back relies on the CUDA-only JIT staged
    # kernel. On ROCm it falls back to a kernel that requires CUDA index
    # tensors and crashes on host write-back, so use layer_first there.
    if (
        self.hicache_mem_layout == "page_first"
        and self.hicache_io_backend == "kernel"
        and is_hip() # 仅在 ROCm 平台生效
    ):
        self.hicache_mem_layout = "layer_first"
        logger.warning(
            "page_first kernel write-back requires the CUDA JIT kernel; "
            "falling back to layer_first layout on ROCm."
        )

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 回归风险低:改动仅影响 ROCm 平台且限制在 page_first + kernel 配置组合,NVIDIA 路径不受影响。回退逻辑是防御性的,仅当条件满足时生效。
  2. 性能影响layer_first 布局相比 page_first 在 write-back 性能上可能稍差,但这是确保正确性的必要妥协。PR body 中提供了精度测试截图,表明修改后精度正常。
  3. 边界情况:如果未来 ROCm 支持了 JIT staged write-back 内核,需要移除或调整此回退逻辑。
  1. 用户影响:修复了 AMD/ROCm 用户在使用 HiCache 时遇到的启动崩溃和推理错误,使 page_first 布局在 ROCm 上恢复正常。
  2. 系统影响:仅影响 HiCache 的 kernel write-back 路径,其他功能不受影响。
  3. 团队影响:该修改是短期修复,确保 AMD CI 回归绿色。长期可能需要考虑为 ROCm 实现 JIT 内核或调整回退内核以支持 CPU 张量。
平台条件编译 核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论