[testing] making network tests more reliable

该报错通常发生在 Transformers 测试套件或下载 Hub 资源时遇到网络瞬时故障(如 502/500/403 错误)。优先在下载 API 中启用自动重试机制,设置 try_times=3 和 try_sleep_secs=1 。

快速结论:该报错通常发生在 Transformers 测试套件或下载 Hub 资源时遇到网络瞬时故障(如 502/500/403 错误)。优先在下载 API 中启用自动重试机制,设置 try_times=3try_sleep_secs=1

适用环境:huggingface/transformers 测试套件、依赖 Hugging Face Hub 的网络请求(下载/推送模型文件);已知在 Deepspeed 集成测试及 huggingface_hub 仓库中出现过类似故障。

最快修复方案:在下载逻辑(file_utils.py 中的相关方法)中添加重试参数:try_times=3try_sleep_secs=1。该方案已在 Issue 中被认为是有效的缓解手段。

注意事项:重试机制主要应对服务器瞬时压力或网络抖动,若请求始终失败(如 Hub 服务持续不可用),则重试无法解决根本问题;添加重试可能使测试总耗时增加最多约 6 秒(3 次 × 2 秒),但通常可接受。

问题场景

用户在运行 transformers 测试套件(如 tests/test_hf_api.py 中的 test_list_repos_objs 或推送镜像到 Hub 的测试)时,因网络请求失败导致测试报错。典型表现为 HTTP 5xx 或 4xx 错误,错误信息中包含 Hugging Face Hub 上的资源 URL。

报错原文

502 Server Error: Bad Gateway for url: https://huggingface.co/patrickvonplaten/t5-tiny-random/resolve/main/config.json

requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: 
https://huggingface.co/sshleifer/tiny-gpt2/resolve/main/config.json

403 Client Error: Forbidden for url: https://huggingface.co/...

原因分析

最可能的原因是 Hugging Face Hub 服务器在高并发请求下出现瞬时负载过高或网络抖动,导致下载/推送请求被拒绝。Issue 讨论指出,测试运行速度很快(如 tokenizer 测试),短时间内大量并发请求可能“打爆”服务器。此外,部分测试本身未设计重试机制,一旦首次失败即终止。

环境排查

  • Python 版本(无明确限制,建议 >=3.7)
  • Transformers 版本(涉及 src/transformers/file_utils.py 中的下载逻辑)
  • 网络连通性:确认能否访问 huggingface.co 及相关 CDN
  • 测试运行模式:是否在 CI 中并行运行大量测试(增加服务器压力)
  • Hugging Face Hub 服务状态:可通过 status.huggingface.co 检查

解决步骤

  1. 定位 transformers 源码中负责下载的逻辑。根据 Issue 讨论,主要位于 src/transformers/file_utils.py 中约第 1594 行的方法(如 hf_hub_urlcached_path)。
  2. 在该下载函数中增加重试机制,推荐参数为 try_times=3try_sleep_secs=1,即最多重试 3 次,每次失败后睡眠 1 秒。
  3. 示例伪代码逻辑(参考 Issue 中建议的 retry context manager):
    def download_with_retry(url, try_times=3, try_sleep_secs=1):
        for attempt in range(try_times):
            try:
                return actual_download(url)
            except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError) as e:
                if attempt == try_times - 1:
                    raise
                time.sleep(try_sleep_secs)
  4. 对于推送 Hub 的测试(如 push_to_hub),也可在 HTTP 请求中类似地添加重试。
  5. 提交修改后,重新运行失败的测试用例验证效果。

验证方法

重复运行之前报错的测试用例(例如 test_list_repos_objstest_do_eval_no_train_1_zero3),确认不再出现 502/500/403 等网络错误;可通过 CI 多次执行验证稳定性提升。

参考来源

huggingface/transformers #12061

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15315

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注