Prhub

#47253 [XPU] Fix PP accuracy on XPU device

原始 PR 作者 yisustc 合并时间 2026-07-07 09:17 文件变更 1 提交数 3 评论 2 代码增减 +5 / -0

执行摘要

修复 XPU 下 PP 精度问题

XPU 设备上 Pipeline Parallelism(PP)的精度存在问题,需要修复以确保在 XPU 上推理结果的正确性。

该 PR 值得关注,因为它揭示了跨平台 CUDA stream 同步的差异——CUDA 上 wait_stream 可能隐含了足够的同步语义,而 XPU 上需要显式 `synchronize()。对于维护多后端的工程师是很好的参考。

讨论亮点

该 PR 审核过程中无实质性技术讨论。CI 提示了 pre-commit 失败,后由作者修复。最终被 reviewer(jikunshang)批准合并。

实现拆解

  1. vllm/v1/worker/gpu/pp_utils.py 中新增导入 vllm.platforms.current_platform
  2. BroadcastHelper.broadcast 方法的开始处,with torch.cuda.stream(self.broadcast_stream) 之前,添加了对 XPU 平台的判断:若 current_platform.is_xpu() 为 True,则调用 self.main_stream.synchronize() 显式同步主流,确保所有在 main stream 上的提交操作完成后再切换至 broadcast stream 进行广播。
文件 模块 状态 重要度
vllm/v1/worker/gpu/pp_utils.py PP 工具 modified 5.5

关键源码片段

vllm/v1/worker/gpu/pp_utils.py dependency-wiring

核心变更文件,新增 XPU 平台检测及同步逻辑,修复 PP broadcast 精度问题。

# vllm/v1/worker/gpu/pp_utils.py
# ... ( 其他导入保持不变 )
from vllm.platforms import current_platform # 新增导入,用于检测 XPUclass BroadcastHelper:
    # ... ( 其他方法 )
​
    def broadcast(
        self,
        sampled_token_ids: torch.Tensor,
        num_sampled: torch.Tensor,
        num_rejected: torch.Tensor,
        input_batch: InputBatch,
    ) -> None:
        assert self.is_last_rank
        if compute_need_sampled_mask(input_batch) is None:
            return
​
        assert sampled_token_ids.dtype == torch.int64
​
        # XPU 上需要显式同步 main stream,否则 broadcast stream
        # 中可能读到未就绪的数据,导致精度问题。
        if current_platform.is_xpu():
            self.main_stream.synchronize()
​
        with torch.cuda.stream(self.broadcast_stream):
            self.broadcast_stream.wait_stream(self.main_stream)
            torch.distributed.broadcast(
                sampled_token_ids.contiguous(),
                src=self.last_rank,
                group=self.broadcast_group,
            )
            combined = torch.stack((num_sampled, num_rejected), dim=0)
            torch.distributed.broadcast(
                combined, src=self.last_rank, group=self.broadcast_group
            )
            for tensor in (sampled_token_ids, num_sampled, num_rejected):
                tensor.record_stream(self.broadcast_stream)

评论区精华

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

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

风险与影响

风险较低。该变更仅针对 XPU 平台添加了一次同步操作,对 CUDA 及其他平台无影响。同步操作可能会引入微小的性能开销,但这是保证正确性的必要代价。

直接影响 XPU 设备上使用 PP 功能的用户,修复了精度错误。对 CUDA 等现有平台无影响。

平台特殊处理

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论