执行摘要
- 一句话:修复XPU平台DeepSeek-OCR测试在transformers 5.x下的导入错误。
- 推荐动作:该PR值得快速浏览,以了解transformers版本升级导致的兼容性问题及团队内的解决方案(通过get_tokenizer统一管理tokenizer加载)。关注点在于sglang.srt.utils.hf_transformers.get_tokenizer的设计,它封装了兼容性处理,可作为类似问题的标准做法。
功能与动机
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而提前失败,但同样源于远程代码解析。
实现拆解
- 导入调整:在两个测试文件(test/srt/xpu/test_deepseek_ocr.py和test/srt/xpu/test_deepseek_ocr_triton.py)中,移除对transformers.AutoTokenizer的导入,改为从sglang.srt.utils.hf_transformers导入get_tokenizer。
- 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),提供额外安全保障。
- 参数清理:移除了use_fast=False参数,因为在transformers 5.x中AutoTokenizer总是返回快速tokenizer,此参数已无作用,移除后代码意图更清晰。
- 测试配套:本次变更仅涉及测试文件,没有修改源码主路径、配置或部署脚本,属于测试修复以恢复CI通过性。
关键文件:
test/srt/xpu/test_deepseek_ocr.py(模块 XPU测试;类别 test;类型 test-coverage): 这是主要的DeepSeek-OCR测试文件,变更修复了tokenizer加载错误,确保测试能在transformers 5.x下运行。
test/srt/xpu/test_deepseek_ocr_triton.py(模块 Triton测试;类别 test;类型 test-coverage): 这是DeepSeek-OCR的Triton后端测试文件,同样修复了tokenizer加载问题,继承自主测试类。
关键符号:get_tokenizer
关键源码片段
test/srt/xpu/test_deepseek_ocr.py
这是主要的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
# ... 其余测试初始化代码
评论区精华
Review评论中没有实质性技术讨论,仅有两个批准(mingfeima和polisettyvarma),表明变更被快速接受。PR body中作者详细分析了根因和解决方案,但未引发争议或深度权衡讨论。
风险与影响
- 风险:风险较低:
- 回归风险:变更仅影响测试代码,不涉及生产逻辑,但需确保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避免信任远程代码)。
- 风险标记:测试覆盖调整, 导入关系调整
关联脉络
- PR #21569 未知(PR body中提及#21569导致问题): PR body提到测试在#21569后失败,可能是一个引入transformers 5.x升级或相关变更的PR,但具体标题未在上下文中提供。
参与讨论