Moving Hugging Face models between cold and hot storage
Use rclone for GLM-5-GGUF blobs and rsync for snapshots and refs. The procedure preserves symlinks and checks references when placing models for local LLM integration.
Model and transfer method
I organized a transfer procedure for GLM-5-GGUF from cold archive storage to hot inference storage. rclone copies blobs; rsync copies snapshots and refs.
Local LLM integration separates archived models from active models. This procedure changes their placement while preserving Hugging Face references.
Hub directory structure
Most bytes in a Hugging Face hub directory are under blobs. Revision resolution also needs snapshots and refs.
Separate tools handle parallel copying of large files and preservation of the symlink tree.
Prerequisites
I start by fixing the model-specific paths.
BASE="models--unsloth--GLM-5-GGUF"
SRC_BASE="/srv/archive/cold/hf/hub/$BASE"
DST_BASE="/srv/archive/hot/hf/hub/$BASE"
mkdir -p "$DST_BASE"
With this layout, /srv/archive/cold/hf/hub/ is the archive side and /srv/archive/hot/hf/hub/ is the active side. For another model, the main change is just BASE.
Copying blobs in Parallel with rclone
The first step is to move the actual file objects under blobs.
rclone copy "$SRC_BASE/blobs" "$DST_BASE/blobs" \
--exclude "*.incomplete" \
--transfers 16 --checkers 32 \
--local-no-check-updated \
-P
The starting settings are --transfers 16 --checkers 32. On 10GbE with SSD storage, 32/64 may be worth testing.
Exclude .incomplete files so unfinished objects are not copied to hot storage.
Copying snapshots While Keeping Symlinks Intact
Next, I copy snapshots.
mkdir -p "$DST_BASE/snapshots"
rsync -aH --info=progress2 \
--exclude="*.incomplete" \
"$SRC_BASE/snapshots/" "$DST_BASE/snapshots/"
rsync -aH preserves symlinks without following them. This retains the links from snapshots to blobs.
--info=progress2 is also useful here because snapshot trees can still take time, and I want a single progress view while the copy is running.
Copying refs for Repository Consistency
refs is small, but I still move it explicitly.
mkdir -p "$DST_BASE/refs"
rsync -aH --info=progress2 \
"$SRC_BASE/refs/" "$DST_BASE/refs/"
refs is needed for named-reference resolution even when files and snapshot directories are present.
Running a Minimal Integrity Check
After the copy, I run one quick validation step.
find "$DST_BASE/snapshots" -type l ! -exec test -e {} \; -print | head
No output means no broken symlinks were detected under snapshots. This is a reference check, not a complete file-integrity audit.
Copying a specific revision and quantization
Sometimes I do not want the whole snapshot set. In that case, I can narrow the copy to one revision and one quantization subtree.
REV="acc91597d28b7ebd3a8c20fd5331ceaf07a4ece1"
mkdir -p "$DST_BASE/snapshots/$REV"
rsync -aH --info=progress2 \
"$SRC_BASE/snapshots/$REV/IQ4_NL/" "$DST_BASE/snapshots/$REV/IQ4_NL/"
This can copy only IQ4_NL to hot storage instead of promoting the entire repository.
Partial copies require a defined list of revisions and quantizations for the hot tier.
Using the procedure for other models
The same structure can be reused for another model such as DeepSeek-V3.2-Speciale by changing BASE=.
The tools have the same roles for each model:
- Use
rclonefor object-heavyblobs - Use
rsyncfor symlink and reference trees undersnapshotsandrefs
This separates file transfer from reference preservation.
Procedure outline
The procedure has these steps:
blobsshould be treated as parallel file transfer worksnapshotsandrefsshould be treated as structure-preservation work.incompletefiles should be excluded from the hot-side copy- a broken-symlink check should be part of the workflow
- partial promotion by revision or quantization is possible when needed
Future Work
The planned additions are:
- Add post-transfer file-count or size verification for
blobs - Record model-size-based presets for
--transfersand--checkers - Define a separate policy for which revisions belong on hot storage
The transfer policy should also record which revisions are selected for each tier.
