Prhub

#49001 [Bugfix] Retry config read to survive concurrent HF cache refresh

原始 PR 作者 peizhang56 合并时间 2026-07-23 06:35 文件变更 1 提交数 1 评论 2 代码增减 +11 / -7

执行摘要

重试读 config 以应对 HF 缓存刷新竞态

tests/v1/distributed/test_external_lb_dp.py 在 ROCm CI 上间歇性失败,根源是 --api-server-count=4 时多个 API server 进程同时读取 HF 缓存 config.json,而 huggingface_hub_create_symlink 非原子操作(os.remove + os.symlink)在缓存刷新期间留下短暂窗口,导致进程读到空内容并抛出 Unrecognized model 错误。

值得精读。该 PR 展示了如何利用已有重试辅助函数优雅修复一个棘手的分布式竞态问题,且改动极小(+11/-7),适合作为竞态修复的参考范例。

讨论亮点

评审者 AndreasKaratzas 建议将原本冗长的注释精简为一行或完全移除,作者 peizhang56 响应并更新,最终注释简化为 # Retry to tolerate a concurrent HF cache refresh briefly hiding config.json.。其他评审者(hmellor, AndreasKaratzas, mgoin)均批准。

实现拆解

  1. 定位竞态根因:在 vllm/transformers_utils/config.pyget_config 函数中,config_parser.parse 直接调用,未考虑并发场景下 HF 缓存 config.json 因非原子 symlink 替换而短暂缺失。
  2. 引入重试机制:将 config_parser.parse 调用包裹在已有的 with_retry 辅助函数中,设置重试次数(默认 3 次),仅对瞬时异常重试。
  3. 保持失败封闭:真正的空文件或损坏配置仍会在重试耗尽后抛出异常,不会静默忽略。
  4. 移除冗长注释:根据 review 建议,精简原本过长的注释行,改为简洁的一行注释。
文件 模块 状态 重要度
vllm/transformers_utils/config.py 配置读取 modified 5.93

关键源码片段

vllm/transformers_utils/config.py core-logic

核心修改文件:在 `get_config` 中将 `config_parser.parse` 调用包裹在 `with_retry` 中,以容忍 HF 缓存刷新导致的瞬时文件缺失。

# 原本直接调用 config_parser.parse,现用 with_retry 包装以容忍 HF 缓存刷新时的短暂文件缺失
config_parser = get_config_parser(config_format)
# Retry to tolerate a concurrent HF cache refresh briefly hiding config.json.
config_dict, config = with_retry(
    lambda: config_parser.parse(
        model,
        trust_remote_code=trust_remote_code,
        revision=revision,
        code_revision=code_revision,
        hf_overrides=hf_overrides_kw or hf_overrides_fn,
        **kwargs,
    ),
    f"Error parsing config for {model}",
)

评论区精华

注释过长的代码可读性 style

评审者 AndreasKaratzas 建议将冗长注释精简为一行或移除。

结论:作者更新了注释,将其简化为一行简要说明。 · 已解决

风险与影响

低风险。修改仅将 config_parser.parse 包装在 with_retry 中,该重试函数已在项目多处使用,行为可预期。新增重试仅对异常情况触发,正常路径无性能影响。不会掩盖真正的配置错误,因为空或损坏的 config.json 仍会在重试次数耗尽后抛出异常。

直接影响 vllm/transformers_utils/config.py 中的 get_config 函数。修复了多 API server 并发启动时的模型加载竞态故障,使分布式测试(test_external_lb_dp.py)在 ROCm CI 上稳定通过,避免了 Servers failed to start 误报。不影响单进程或非竞态场景。

核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论