国内下载 Hugging Face 大模型太慢?并发 Range 分块下载实测

下 16.6 GB 的 Qwen-Image 2.1 权重,curl 和官方客户端都中途卡住。换成 16 并发、32 MiB 分块的 Range 下载,主模型分块阶段约 15.8 MiB/s,两个文件 36 分钟下完并通过官方 SHA256。

问题

两个文件,7.26 GB 和 9.35 GB:

方式 结果
curl,三个文件并行 7 分钟后中止,两个大文件都没下完
官方 HF 客户端 9 分钟后中止,没下完
单连接探针(1 MiB) 用了 10.1 秒
Range 下载耗时:主模型分块 438 秒,含校验 693 秒;编码器 1217 / 1504 秒
Range 下载耗时:主模型分块 438 秒,含校验 693 秒;编码器 1217 / 1504 秒

两个大坑:

  • 日志没动不等于没在下。 两个 curl 的 stderr 都是 0 字节,可 .part 文件已经有 2.8 GB。
  • 退出码 0 不等于下完了。 我们以前碰到过:2.4 GB 的文件只下了 142 MB,curl 照样返回 0。

做法:并发 Range 分块

  • 16 个线程,每块 32 MiB,每个请求都带 Range 头;
  • 响应必须是 HTTP 206,Content-Range 的起止和总大小要完全对上,短块直接丢弃重下;
  • 每块最多试 4 次,退避 1/2/4 秒;
  • 块存在临时目录,重跑时只复用大小、范围、块哈希都对得上的块;
  • 全部到齐后拼成整文件,用官方 LFS SHA256 校验,通过后再放进模型目录。

结果

文件 分块完成 含拼接、校验、复制
主模型 7.26 GB 438 s(约 15.8 MiB/s) 693 s
文本编码器 9.35 GB 1217 s 1504 s

整个过程 36 分 38 秒,两个文件都通过官方 SHA256。过程中失败了 57 次,主模型 16 次,编码器 41 次,全部由重试补回来了。

编码器复用了旧 curl 留下的前 640 MiB。复用之前,我们抽了几块,比对旧文件、新 Range 块和块元数据三者的 SHA256,完全一致才用。HF 客户端留下的 .incomplete 不能这样复用,它不保证是连续的前缀。

要点

  1. 大文件一定要做完整哈希校验,别信退出码。
  2. 能续传、能复用完整块,网络抖一下就不用从头来。
  3. 速度只在当时的网络下有效:这次单看主模型分块阶段是 15.8 MiB/s,算上复用、重试和校验的全流程平均是 7.2 MiB/s。

相关

常见问题

Hugging Face 下载慢怎么办? 用可续传的多连接或并发 Range 分块下载,完成后用官方 SHA256 校验整文件。