Hugging Face download slow? Every fix, ranked
Last updated: 2026-09-01
If the advice you found says to install hf_transfer and export HF_HUB_ENABLE_HF_TRANSFER=1, that advice is outdated. Hugging Face's current documentation marks hf_transfer deprecated and its enabling variable ignored, because the Hub now serves large files through the Xet storage backend rather than Git LFS. The fix that tops most forum threads does nothing on a current install.
Slow Hugging Face downloads come from one of four things: a single browser connection, the Xet backend reassembling chunks on a slow disk, a rate-limit stall that looks like a freeze, or your own network and route. Two commands fix most of it. Download with the hf CLI instead of a browser tab, and log in first.
The ranked list, most likely fix first:
- Use the CLI, not a browser tab.
hf downloadpulls files in parallel and resumes where a browser starts over. - Log in.
hf auth loginmoves you off the anonymous quota that is counted per IP address. - Tune Xet, or turn it off.
HF_XET_HIGH_PERFORMANCE=1raises concurrency;HF_HUB_DISABLE_XET=1takes the non-Xet path. - Raise the timeout.
HF_HUB_DOWNLOAD_TIMEOUT=30triples the 10-second default. - Go parallel over HTTP.
aria2c -x16 -s16 -con one file's resolve URL. - Clean the cache.
hf cache lslists leftover partials,hf cache pruneremoves them.
Not sure which slowness you have? Skip to the decision block and match the symptom to the fix.
First, measure: is it you or is it them?
Before you change anything, get one number. Hugging Face publishes its own speed test at fast.hf.co, and the same documentation ships a speedtest extension for the hf CLI. Run the Hugging Face test, then any general speed test, on the same machine and connection.
Compare the numbers. If the general test lands near the speed you pay for and the Hugging Face test crawls, the problem sits on the path between you and the Hub, and the fixes below apply. If both crawl, fix your own network first. If the two disagree by the hour, you are watching route and load variance, which no client setting removes.
What actually makes Hugging Face downloads slow
Six mechanisms cover nearly every report. Each row names the symptom it produces, because the fix differs.
| Cause | What happens | What it looks like |
|---|---|---|
| Browser download | One connection, and a failed tab throws away partial work | Speed never rises; one hiccup restarts the file |
| Chunk reassembly on your disk | Large files arrive as immutable Xet chunks and get rebuilt on download; a spinning disk slows the rebuild | Progress jumps in bursts; the bar sits at 100 percent while the disk works |
| CDN route and load | Downloads redirect off huggingface.co to separate storage and CDN hostnames, and speed varies with route and load | The same file moves at different speeds on different networks, or at different hours |
| Rate-limit sleeping | Resolver requests are counted in five-minute windows, anonymous quota per IP address, and huggingface_hub 1.2.0 and later sleeps quietly until the window resets | Starts fast, then sits at 0 B/s on a schedule, with no error |
| The 10-second timeout | HF_HUB_DOWNLOAD_TIMEOUT defaults to 10 seconds | The transfer dies mid-file with a ReadTimeout naming a cdn-lfs host |
| Cache on a slow or full disk | The cache lives wherever HF_HOME points, and a full disk stops writes | Downloads stall near the end while nothing else on the machine is wrong |
The redirects, the hostname list, and the blocked-host symptom are documented in Hugging Face's guide to downloading models; the quota mechanics, including the window length and the per-IP rule, are in the rate-limits page.
The fixes, ranked
1. Use the hf CLI, not a browser tab
For large repositories the browser is the slow way: one connection, no parallelism, and a failed download starts over. The hf CLI downloads files in parallel and keeps partial work. Install it with pip install -U "huggingface_hub", then pull a model by its repository id:
hf download Qwen/Qwen3-8B --local-dir Qwen_Qwen3-8BRe-running the same command after an interruption resumes from the partial blobs already in the cache; there is no resume flag to pass.
2. Log in before you download
Anonymous download quota is counted per IP address, which means you share it with everyone behind the same NAT: an office, a campus, a cloud region. A logged-in session gets its own quota, which is why passing a token is the first fix in Hugging Face's own rate-limits guidance.
hf auth loginA rate limit usually shows up as a stall, not a message: the download starts fast, then sits at 0 B/s while huggingface_hub 1.2.0 and later quietly sleeps out the five-minute window and retries. If you are seeing 429, 403, or 418 errors instead of stalls, that is a different problem: Hugging Face errors 429, 403 and 418, decoded.
3. Tune Xet, or turn it off
Since huggingface_hub 0.32.0, installing the library also installs hf_xet, the Rust client for the Xet backend. Xet stores files as immutable chunks and reassembles them on download, fetching them by the file's LFS SHA256. Downloads run with adaptive concurrency, starting at 1 stream and scaling up to 64. Three variables change how that behaves on your machine.
High performance, when the machine can take it:
HF_XET_HIGH_PERFORMANCE=1 hf download Qwen/Qwen3-8BThis raises concurrency and buffer sizes to try to saturate your bandwidth and use every CPU core. Hugging Face aims it at machines with high bandwidth and at least 64 GB of RAM. On a small VPS it can make things worse, not better.
Sequential writes, for spinning disks:
HF_XET_RECONSTRUCT_WRITE_SEQUENTIALLY=1 hf download Qwen/Qwen3-8BIf chunk reassembly is hammering a hard drive, this writes the file back in order. The related HF_XET_NUM_CONCURRENT_RANGE_GETS defaults to 16 range requests; leave it alone unless the documentation sends you there.
Xet off, when Xet is the problem:
HF_HUB_DISABLE_XET=1 hf download Qwen/Qwen3-8BForum reports have traced speeds like 290 kB/s to Xet misbehaving on specific machines, and this variable forces the non-Xet path. The documentation asks anyone who sets it to file an issue; the team wants the reports.
Timing trap: these variables are read when huggingface_hub is imported, not when your download starts. Setting them in a notebook cell after the import does nothing. Export them in your shell, then start Python, then download.
4. Raise the download timeout
HF_HUB_DOWNLOAD_TIMEOUT defaults to 10 seconds. The CLI documentation shows the failure it produces, a ReadTimeout against a cdn-lfs hostname, and recommends raising it to 30:
HF_HUB_DOWNLOAD_TIMEOUT=30 hf download Qwen/Qwen3-8BIf timeouts persist at 30, the usual cause is a storage or CDN hostname your network blocks, since downloads redirect off huggingface.co to separate hosts. Hugging Face publishes the hostname list, plus a machine-readable .well-known/meta.json for scripting your own checks. On a locked-down network the fix is getting those hosts allowlisted, not routing around them.
5. Parallel HTTP with aria2c
When you want one file rather than a whole repository, hand aria2 the file's resolve URL:
aria2c -x16 -s16 -c "https://huggingface.co/Qwen/Qwen3-8B/resolve/main/model-00001-of-00005.safetensors"-x sets connections per server, and its default is 1. -s splits the file. -c resumes a partially downloaded file, over HTTP and FTP only. Two caveats from the field: auto-file-renaming is on by default, so a re-run without -c can leave a .1 sibling next to the original instead of resuming, and every split is another request against the same rate limit, so the community guide that popularized this pattern warns to be careful not to hit it.
6. Cache hygiene
The cache stores each file once under a hash name and links it into per-revision snapshot folders. Three subcommands keep it healthy:
hf cache ls # lists entries, flags leftover .incomplete files
hf cache prune # removes those leftovers
hf cache verify # checks cached files against the Hub's checksumsPoint HF_HOME at your fastest disk, and keep about twice the model size free while a download runs. The 2x figure is community advice from forum checklists, not an official number, but it matches how the cache writes partials alongside finished blobs.
Which symptom do you have?
One table, symptom to fix; two rows hand off to sibling guides because the bottleneck is not download speed on the huggingface.co path.
| Symptom | Likely cause | Do this |
|---|---|---|
| Speed never rises in a browser tab | One connection, no resume | Fix 1: switch to the hf CLI |
| Starts fast, then sits at 0 B/s on a schedule | A rate-limit window sleeping | Fix 2: log in; error codes decoded separately |
| Progress jumps in bursts, or sticks at 100 percent | Chunk reassembly on a slow disk | Fix 3: sequential writes, then Xet off |
| Dies mid-file with a ReadTimeout on a cdn-lfs host | The 10-second timeout, or a blocked host | Fix 4: raise the timeout, then check the hostname list |
| A re-download starts from zero | A tool without partial resume | Fix 1, plus the resume section below |
| Everything on the machine is slow, not just HF | Your network or route | Measure first: fast.hf.co against a general speed test |
| You pull with ollama, not the hf CLI | The ollama client path | Pulling models with ollama is its own guide |
How long should a model take? The math
Slow is a number, not a feeling. At N MB/s, one gigabyte takes about 1000 divided by N seconds. That one division tells you whether your download is broken or merely big.
| Speed | Per GB | Qwen_Qwen3-8B, 16.40 GB | Qwen_Qwen-Image, 57.70 GB |
|---|---|---|---|
| 1.9 MB/s | 526 s | 2.4 h | 8.4 h |
| 5 MB/s | 200 s | 55 min | 3.2 h |
| 10 MB/s | 100 s | 27 min | 1.6 h |
| 50 MB/s | 20 s | 5.5 min | 19 min |
The 1.9 MB/s row is a real user report: someone measured exactly that on a 19 GB file, which works out to about 2.8 hours, and wrote that it takes hours. The arithmetic agrees with them. Speeds like 10 MB/s falling to 500 kB/s mid-file, and caps around 10.4 MB/s, come from the same forum threads; treat them as reports, not promises.
The sizes come from this archive's signed manifest, which records Qwen_Qwen3-8B at 16.40 GB and Qwen_Qwen-Image at 57.70 GB. Both are in the catalog.
About hf_transfer, the advice everyone still gives
hf_transfer is deprecated. Hugging Face's download guide states it outright: hf_transfer was formerly used with the LFS storage backend and is now deprecated; use hf_xet instead. The environment variable reference is blunter: the Hub is fully Xet-backed, so hf_transfer can't be used anymore, and HF_HUB_ENABLE_HF_TRANSFER is ignored.
What hf_transfer was: a power-user tool for pushing past roughly 500 MB/s, with no progress bars, as its own README still describes it. That README has never mentioned the deprecation, which is a fair part of why the old advice keeps ranking: the posts were written before the storage switch, and the tool's own page never corrected them.
What to set instead: the environment variable reference is the authoritative list. For speed, the modern equivalent is HF_XET_HIGH_PERFORMANCE=1 on a machine with the RAM for it. For everything else, plain hf download already does adaptive concurrency from 1 to 64 streams.
Resuming without starting over
Interrupted hf downloads leave partial blobs behind. In the cache documentation's own words, .incomplete files are partial blobs left behind when a download is interrupted. The next run of the same command picks them up. So if a download dies at 60 percent, you do not start over: re-run the command.
When a partial goes bad, the symptom is a download that keeps failing at the same spot. hf cache prune clears the leftovers so the next attempt starts clean. Direct file URLs resume too: aria2c -c continues over HTTP, and wget -c does the same job.
One cost nobody warns you about: finding out where a resume stands can itself be slow; users report waiting half an hour to learn where the restart picks up. That is discovery work inside the client, not your bandwidth, and no variable in fix 3 or fix 4 removes it.
The structural fix: a download that resumes by design
Everything above tunes a download that still comes from one source. The other option is a transport built around the failure mode. A torrent client keeps every finished piece across restarts, fetches only what is missing, needs no account or token, and no request window counts against it.
The honest caveat is speed: it depends on seeders, so a torrent can beat a single HTTPS stream and can also lose to it. The promise is not faster. The promise is that no single server, quota, or account sits between you and the bytes.
That is the structure this archive runs on. Every payload was verified against upstream Hugging Face at fetch time, with the exact revision pinned, and the file list travels as a minisign-signed manifest you re-check client-side: per-file digests with the method labeled, sha256 for LFS files and sha1+size for git blobs. To prove the bytes before you load them: the verification walkthrough is the deep dive, the verify page the three-command version.
New to torrents as a distribution method? The legality and trust questions are covered in the AI model torrents guide, and the vocabulary you will meet, magnets and infohashes and seeding, in the magnet links and infohashes guide. Picking a client is on the help page, and the models themselves are in the catalog.
One ask when a download finishes: leave the client running. A finished torrent seeds automatically, a share ratio of 2.0 or better is the goal, and every seeder is someone else's fast download. What that sustains is on the contribute page, and if the model you need is not archived yet, requests is where to ask for it.
Frequently asked questions
Is there a way to resume a stalled Hugging Face download?
Yes. Re-run the same hf download command. Interrupted downloads leave partial .incomplete blobs in the cache, and the next run picks them up instead of starting over. Keep about twice the model size free on that disk. If a partial file has gone bad, hf cache prune removes the leftovers so the next attempt starts clean. Direct file URLs also resume with aria2c -c or wget -c.
Does hf_transfer still speed up downloads?
Not on current huggingface_hub. Hugging Face's docs mark hf_transfer deprecated and its HF_HUB_ENABLE_HF_TRANSFER variable ignored, because the Hub now serves large files through the Xet backend. The modern equivalent is HF_XET_HIGH_PERFORMANCE=1. Most older guides still recommend the old variable, so check the date on any advice you follow.
Why does my download start fast and then sit at 0 B/s?
That pattern is usually a rate limit, not a broken network. Download requests are counted in five-minute windows, and the client library quietly waits out the window and retries, which looks like a freeze. Logging in with hf auth login moves you off the shared anonymous quota. The full story of the 429, 403, and 418 errors is the error-codes guide in this section.
Why is my download stuck at 100 percent?
The file is usually still being assembled. Large files arrive as chunks and get rebuilt on your disk, and on a slow or busy disk that final step can take a while after the progress bar fills. Give it a minute and check disk activity. If it never finishes, try the Xet variables in fix 3, or clear the partial cache entry with hf cache prune and rerun.
Is a browser download slower than the CLI?
For big files, yes. A browser tab uses one connection and throws away partial work if it fails. The hf CLI downloads files in parallel, resumes partials, and lets you tune the backend. For a multi-gigabyte model, the CLI is the right tool.
How long should a model take to download?
Divide 1000 by your speed in MB/s to get seconds per gigabyte. At 10 MB/s that is 100 seconds per GB, so a 16 GB model is about 27 minutes. At 2 MB/s the same model is over two hours, which is why some downloads feel broken when they are merely slow. Test your real rate at fast.hf.co before blaming anyone.
Is BitTorrent actually faster for model weights?
It can be, and sometimes it is slower, because your speed comes from other seeders, not a datacenter. What it reliably is, is resumable and unthrottled: pieces you finish are kept, no login is needed, and no request window counts against you. If you value never babysitting a 50 GB download again, that is the trade.
What is the hf cache doing on my disk?
It stores each downloaded file once under a hash name, then links it into per-revision snapshot folders, so re-downloads and version switches are cheap. Use hf cache ls to see what is there, hf cache prune to clear leftovers from interrupted downloads, and hf cache verify to check cached files against the Hub's own checksums.