Prhub

#28483 [Fix] DeepSeek-OCR-2 bench_serving: fix processor loading

原始 PR 作者 ckvermaAI 合并时间 2026-06-18 06:29 文件变更 1 提交数 3 评论 4 代码增减 +7 / -11

执行摘要

修复 DeepSeek-OCR-2 bench_serving 处理器加载

Bug prevented bench_serving from working correctly with DeepSeek-OCR-2. The original get_processor in benchmark/utils.py called AutoProcessor.from_pretrained directly, bypassing the model-specific processor detection in hf_transformers_utils.get_processor. This caused the wrong processor class (DeepseekVLV2Processor) to be loaded for OCR-2, resulting in None being passed into string operations during token counting.

该 PR 改动清晰、风险低,值得合并。但建议后续补充对应 DeepSeek-OCR-2 的 benchmark 测试用例,防止回归。团队可关注 hf_transformers_utils.get_processor 对更多模型的处理逻辑,避免类似问题。

讨论亮点

Review 中主要讨论集中在 CI 环境问题。mingfeima 指出 XPU CI 失败,但怀疑是 CI 环境本身问题而非代码变更导致。其余无关于代码实现的实质性讨论。

实现拆解

  1. 统一 import 路径:在 python/sglang/benchmark/utils.pyget_processor 函数中,将原有的按后缀名(.json/.model)分支导入 hf_transformers_utils.get_processor 的方式,改为在最顶部统一导入并重命名为 _srt_get_processor(第 75-77 行),消除了重复导入。

  2. 重构路径判断逻辑:将原有的 if-elif 结构(先判断是否为 .json/.model 文件来决定是否走 hf_transformers_utils,否则下载模型再调用 AutoProcessor.from_pretrained)简化为一个统一的 if 条件(第 79-82 行):如果路径不以 .json/.model 结尾且本地不存在,则下载模型。不再需要针对 .json/.model 做特殊处理分支,因为 hf_transformers_utils.get_processor 内部已经包含了相关逻辑。

  3. 替换最终调用:将最后的 return AutoProcessor.from_pretrained(...)(第 85-87 行)替换为 return _srt_get_processor(...)(第 83 行),使得所有情况都通过 hf_transformers_utils.get_processor 获取处理器,该函数会检查内部维护的 _CUSTOMIZED_MM_PROCESSOR 字典,为 DeepSeek-OCR-2 等模型返回正确的处理器类,对其他模型则回退到 AutoProcessor.from_pretrained

  4. 无测试变更:本次仅修改源码,未添加对应单元测试。

文件 模块 状态 重要度
python/sglang/benchmark/utils.py 基准测试 modified 6.1

关键符号

get_processor

关键源码片段

python/sglang/benchmark/utils.py dependency-wiring

唯一的变更文件,核心修复了 `get_processor` 函数,将处理器获取逻辑统一到 `hf_transformers_utils.get_processor`,修复了 DeepSeek-OCR-2 模型在 benchmark 中崩溃的问题。

def get_processor(
    pretrained_model_name_or_path: str,
) -> AutoProcessor:
    assert (
        pretrained_model_name_or_path is not None
        and pretrained_model_name_or_path != ""
    )
​
    # 统一导入 hf_transformers_utils 中的 get_processor
    # 该函数内部维护了自定义处理器映射(如 DeepSeek-OCR-2),
    # 对于标准模型则回退到 AutoProcessor.from_pretrained
    from sglang.srt.utils.hf_transformers_utils import (
        get_processor as _srt_get_processor,
    )
​
    # 只有当路径不是 .json/.model 文件且本地不存在时,才调用 get_model 下载
    if not pretrained_model_name_or_path.endswith(
        (".json", ".model")
    ) and not os.path.exists(pretrained_model_name_or_path):
        pretrained_model_name_or_path = get_model(pretrained_model_name_or_path)
​
    # 始终通过 _srt_get_processor 获取处理器,确保模型特定的分支被正确触发
    return _srt_get_processor(pretrained_model_name_or_path, trust_remote_code=True)

评论区精华

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

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

风险与影响

风险极低。该变更将 get_processor 统一导向 hf_transformers_utils.get_processor,该函数已在 SRT 服务端广泛使用且设计上兼容所有模型(对未知模型回退到 AutoProcessor.from_pretrained)。唯一风险是该函数可能依赖额外的 HF 库版本特性,但已在 benchmark/utils.py 中预先导入,不会影响已有逻辑。

直接影响:修复了 DeepSeek-OCR-2 模型在 bench_serving 中因处理器加载错误而崩溃的问题。间接影响:所有其他模型(如 LLaVA、Qwen-VL、InternVL、Phi-3-Vision 等)的 benchmark 行为完全不变,因为 hf_transformers_utils.get_processor 对非定制模型会回退到原有 AutoProcessor.from_pretrained 逻辑。影响范围限定在 benchmark 工具内。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论