Prhub

#23044 [XPU] Fix DeepSeek-OCR tests under transformers 5.x

原始 PR 作者 JustinTong0323 合并时间 2026-04-21 14:57 文件变更 2 提交数 2 评论 5 代码增减 +4 / -8

执行摘要

修复 XPU 平台 DeepSeek-OCR 测试在 transformers 5.x 下的导入错误。

PR body指出,XPU DeepSeek-OCR测试在transformers 5.x下失败,错误为ImportError: cannot import name 'LlamaFlashAttention2' from 'transformers.models.llama.modeling_llama'。根本原因是AutoTokenizer.from_pretrained(..., trust_remote_code=True)会解析DeepSeek-OCR的远程代码链,而该链在transformers 5.x中引用了已移除的LlamaFlashAttention2。NVIDIA侧的相同测试已使用trust_remote_code=False避免此问题,但XPU测试未同步。此外,transformers 5.4+的检查还会因缺少matplotlib而提前失败,但同样源于远程代码解析。

该PR值得快速浏览,以了解transformers版本升级导致的兼容性问题及团队内的解决方案(通过get_tokenizer统一管理tokenizer加载)。关注点在于sglang.srt.utils.hf_transformers.get_tokenizer的设计,它封装了兼容性处理,可作为类似问题的标准做法。

讨论亮点

Review评论中没有实质性技术讨论,仅有两个批准(mingfeima和polisettyvarma),表明变更被快速接受。PR body中作者详细分析了根因和解决方案,但未引发争议或深度权衡讨论。

实现拆解

  1. 导入调整:在两个测试文件(test/srt/xpu/test_deepseek_ocr.py和test/srt/xpu/test_deepseek_ocr_triton.py)中,移除对transformers.AutoTokenizer的导入,改为从sglang.srt.utils.hf_transformers导入get_tokenizer。
  2. tokenizer加载方式变更:将cls.tokenizer = AutoTokenizer.from_pretrained(cls.model, use_fast=False, trust_remote_code=True)替换为cls.tokenizer = get_tokenizer(cls.model)。get_tokenizer默认trust_remote_code=False,避免解析远程代码链,同时其内部会触发兼容性补丁(如将LlamaFlashAttention2映射为LlamaAttention),提供额外安全保障。
  3. 参数清理:移除了use_fast=False参数,因为在transformers 5.x中AutoTokenizer总是返回快速tokenizer,此参数已无作用,移除后代码意图更清晰。
  4. 测试配套:本次变更仅涉及测试文件,没有修改源码主路径、配置或部署脚本,属于测试修复以恢复CI通过性。
文件 模块 状态 重要度
test/srt/xpu/test_deepseek_ocr.py XPU 测试 modified 4.28
test/srt/xpu/test_deepseek_ocr_triton.py Triton 测试 modified 4.28

关键符号

get_tokenizer

关键源码片段

test/srt/xpu/test_deepseek_ocr.py test-coverage

这是主要的 DeepSeek-OCR 测试文件,变更修复了 tokenizer 加载错误,确保测试能在 transformers 5.x 下运行。

from sglang.srt.utils.hf_transformers import get_tokenizer # 导入自定义的 tokenizer 加载工具,默认不信任远程代码class TestDeepSeekOCR(CustomTestCase):
    @classmethod
    def setUpClass(cls):
        cls._cleanup_xpu_memory()
        cls.model = "deepseek-ai/DeepSeek-OCR"
        cls.tokenizer = get_tokenizer(cls.model) # 使用 get_tokenizer 加载,避免触发远程代码解析链,从而绕过 LlamaFlashAttention2 导入错误
        cls.base_url = DEFAULT_URL_FOR_TEST
        # ... 其余测试初始化代码

评论区精华

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

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

风险与影响

风险较低:

  • 回归风险:变更仅影响测试代码,不涉及生产逻辑,但需确保get_tokenizer在所有场景下行为与之前一致(特别是trust_remote_code=False时tokenizer类型是否兼容)。
  • 兼容性风险:如果其他测试或代码路径依赖trust_remote_code=True来加载特定tokenizer,此变更可能不适用,但本PR仅针对DeepSeek-OCR测试,且NVIDIA侧测试已采用相同方式。
  • 性能风险:无,tokenizer加载方式变更对运行时性能无影响。

影响范围有限:

  • 对用户:无直接影响,此为内部测试修复。
  • 对系统:恢复XPU平台DeepSeek-OCR测试的通过性,确保CI稳定性。
  • 对团队:提供了在transformers 5.x下处理类似远程代码问题的参考模式(使用get_tokenizer避免信任远程代码)。
测试覆盖调整 导入关系调整

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论