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.

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 rclone for object-heavy blobs
  • Use rsync for symlink and reference trees under snapshots and refs

This separates file transfer from reference preservation.

Procedure outline

The procedure has these steps:

  • blobs should be treated as parallel file transfer work
  • snapshots and refs should be treated as structure-preservation work
  • .incomplete files 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 --transfers and --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.