Prhub

#21191 fix: Use base GPU ID CUDA device for multimodal processor

原始 PR 作者 moehanabi 合并时间 2026-05-21 13:18 文件变更 1 提交数 1 评论 10 代码增减 +2 / -1

执行摘要

修复多模态处理器默认使用 GPU 0 的问题

PR body 说明在多实例部署场景下,BaseImageProcessorFast 始终使用默认 CUDA 设备(cuda:0),导致 GPU 0 显存分配过多而其他 GPU 空闲。issue#21191 中的截图显示了修改前后显存占用分布的变化。

最小侵入修复,逻辑清晰,推荐合并。值得关注的是多 GPU 资源隔离的设计思路:预处理应在当前进程绑定的 GPU 上进行,而非全局默认设备。

讨论亮点

Review 中 reviewer mickqian 建议更新文档以反映此新参数行为,但 author moehanabi 指出并无新增参数(base_gpu_id 已是已有参数),最终没有进一步文档改动。

实现拆解

python/sglang/srt/multimodal/processors/base_processor.pyprocess_mm_data 方法中,将原来硬编码的 "cuda" 替换为 f"cuda:{base_gpu_id}",其中 base_gpu_id 通过 get_global_server_args().base_gpu_id 获取。该修改仅影响非 CPU、非 XPU、非 NPU 且具备 BaseImageProcessor 的处理器路径。

文件 模块 状态 重要度
python/sglang/srt/multimodal/processors/base_processor.py 多模态处理器 modified 4.99

关键符号

process_mm_data

关键源码片段

python/sglang/srt/multimodal/processors/base_processor.py core-logic

核心修改文件:将处理器设备从硬编码 'cuda' 改为使用 base_gpu_id,平衡多实例 GPU 显存分配。

# 文件 : python/sglang/srt/multimodal/processors/base_processor.py
# 方法 : process_mm_data ( 片段 )# 此前设备选择逻辑:
# elif not _is_npu:
# kwargs["device"] = "cuda" # 始终使用 GPU 0
# 
# 修复后:
if hasattr(processor, "image_processor") and isinstance(
    processor.image_processor, BaseImageProcessor
) and not self.server_args.disable_fast_image_processor:
    if _is_cpu or get_global_server_args().rl_on_policy_target is not None:
        kwargs["device"] = "cpu"
    elif _is_xpu:
        kwargs["device"] = "xpu"
    elif not _is_npu:
        # 通过 get_global_server_args().base_gpu_id 获取当前进程绑定的 GPU ID
        # 确保多实例部署下各自处理器使用正确的 GPU,避免 GPU 0 显存瓶颈
        base_gpu_id = get_global_server_args().base_gpu_id
        kwargs["device"] = f"cuda:{base_gpu_id}"
    elif processor.__class__.__name__ not in {"Glm4vProcessor",}:
        # NPU 处理器特殊处理
        ...

评论区精华

文档更新建议与回应 documentation

Reviewer mickqian 建议更新文档说明新参数行为,author moehanabi 指出并无新增参数(base_gpu_id 已是 server_args 的现有字段),最终未进行文档修改。

结论:无需额外文档更新,因为 base_gpu_id 已是已有参数且已有文档。 · 已解决

风险与影响

风险极低:仅改动了一行硬编码字符串,且该设备选择分支已存在于现有逻辑中,仅在非 CPU/XPU/NPU 环境下生效。可能的风险是某些依赖固定 cuda:0 行为的边缘场景,但 base_gpu_id 本身就是用户显式配置的,此变更与其期望一致。

影响范围为多 GPU 多实例部署 VLM 的场景,尤其是使用 --base-gpu-id 参数的 SGLang 实例。修正后每个实例的处理器会正确使用其绑定的 GPU,避免 GPU 0 显存压力过大。单 GPU 或单实例用户无感知。

无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论