Prhub

#49908 [CI] Retry Hugging Face processor loading

原始 PR 作者 AndreasKaratzas 合并时间 2026-07-31 08:48 文件变更 1 提交数 1 评论 0 代码增减 +10 / -3

执行摘要

重试 HF processor 加载,缓解共享缓存并发刷新导致的 CI 抖动

PR body 明确指出,当共享 Hugging Face 缓存被并发刷新时,processor 配置文件会短暂不可见,导致 AutoProcessor 加载失败并引发 CI 失败。作者引用 Buildkite AMD-CI 日志(build 11254)作为证据,说明这是实际发生的间歇性问题。此前模型 config 加载已在 vllm.transformers_utils.config 中使用重试机制,而 processor 加载缺少同等保护,本 PR 旨在补齐这一一致性缺口。

该 PR 值得快速浏览而非精读。关注点有二:一是 with_retryvllm.transformers_utils.repo_utils 中的重试策略(次数、退避)是否与 CI 超时预算匹配;二是这种"加载重试"模式是否也应推广到 AutoTokenizer 和模型权重加载的测试路径,以系统性消除共享缓存并发刷新的 flaky 问题。

讨论亮点

本 PR 的 review 讨论极少:claude[bot] 因 PR 来自 fork 而未执行自动 review,仅提示维护者可手动触发;tjtanaa 直接批准(APPROVED),未留下文字评论。仓库内无其它 review comment,因此没有实质性的技术争论或未解决疑虑。值得注意的隐含决策是:复用了 vllm.transformers_utils.repo_utils.with_retry 而不是在测试内自建重试循环,这与仓库既有模式保持一致。

实现拆解

实现拆解如下:

  1. 变更入口:修改 tests/conftest.py,这是 vLLM 测试套件的公共夹具文件,HfRunner._init 中统一完成模型、tokenizer 和 processor 的加载。
  2. 核心改动:在 HfRunner._init 的 processor 初始化分支,将原来的 AutoProcessor.from_pretrained(model_name, trust_remote_code=trust_remote_code) 直接调用替换为 with_retry(lambda: AutoProcessor.from_pretrained(model_name, trust_remote_code=trust_remote_code), f"Error loading processor for {model_name}"),并新增 from vllm.transformers_utils.repo_utils import with_retry 导入。
  3. 设计意图with_retry 是 vLLM 中已有的有界重试辅助函数(带重试次数上限和错误信息上下文),与模型 config 加载使用的机制完全一致,保证测试环境下的加载行为与生产代码路径一致。
  4. 配套改动:无测试、配置或部署配套改动;单 commit、单文件、+10/-3,改动面很小。
  5. 影响:该改动只影响测试夹具中 processor 的加载时机,测试行为上仅在首次加载失败时多出几次重试,不改变任何模型推理逻辑。
文件 模块 状态 重要度
tests/conftest.py 测试夹具 modified 4.52

关键符号

HfRunner._init with_retry

关键源码片段

tests/conftest.py test-coverage

唯一变更文件,在测试夹具 HfRunner 的 processor 初始化处引入 with_retry 重试,解决共享 HF 缓存并发刷新导致的瞬时加载失败。

# tests/conftest.py(HfRunner._init 中 processor 初始化分支)
# 关键变更:用 with_retry 包裹 AutoProcessor 加载。
# 背景:共享 HF 缓存被并发刷新时,processor 配置文件会短暂消失,
# 直接调用会抛 OSError 导致整个测试报错;重试机制与模型 config
# 加载保持行为一致。
from vllm.transformers_utils.repo_utils import with_retry # 新增导入if processor is not None:
    self.processor = processor
else:
    # 这里不能放顶层 import,因为会触发 torch.accelerator.device_count()
    from transformers import AutoProcessor
​
    # 并发刷新共享 HF 缓存时,processor 配置文件会短暂被隐藏。
    # 与 vllm.transformers_utils.config 中模型配置加载的方式一致,
    # 使用有界重试来容忍瞬时失败。
    self.processor = with_retry(
        lambda: AutoProcessor.from_pretrained(
            model_name,
            trust_remote_code=trust_remote_code,
        ),
        f"Error loading processor for {model_name}",
    )if skip_tokenizer_init:
    if self.processor is None:
        raise ValueError(
            "skip_tokenizer_init=True requires processor initialization."
        )
    self.tokenizer = self.processor.tokenizer

评论区精华

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

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

风险与影响

风险整体很低:

  1. 回归风险:改动仅包裹 HfRunner 的 processor 加载,若 with_retry 本身有异常处理差异(如对非缓存类错误的静默重试),可能掩盖真正的模型加载错误,但由于它是有界重试且最终会抛出原始异常,风险可控。
  2. 性能影响:仅当加载失败时触发额外重试,正常路径无额外开销,测试启动时间几乎不变。
  3. 兼容性with_retry 为 vLLM 内部已有 API,无外部依赖变更;未引入新依赖。
  4. 测试覆盖:本 PR 未新增针对重试逻辑的单元测试,但改动属于测试基础设施,且已有机制在 config 加载中广泛使用,风险可接受。

影响范围限定在测试基础设施层:

  1. 对 CI 稳定性:直接降低 AMD(及所有使用共享 HF 缓存的环境)CI 因 processor 加载瞬时失败而产生的 flaky 失败,这是本次变更的主要收益。
  2. 对开发者tests/conftest.py 是所有测试共用的夹具,未来新增测试若依赖 HfRunner 的 processor 加载,会自动获得重试保护。
  3. 对运行系统:不涉及 vLLM 生产代码,对推理性能、API 行为、模型执行路径零影响。
  4. 影响程度:低,但价值在于消除偶发 CI 噪音,提升持续集成可靠性。
缺少针对重试逻辑的测试覆盖 CI 基础设施变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论