GGUF Tensor Loader #
Loads tensor data from parsed GGUF files and uploads to GPU buffers.
Architecture #
GGUF File (on disk)
│
├─► Parser → GGUFFile structure (in memory)
│ ├─ Header
│ ├─ Metadata
│ ├─ Tensor Info (names, shapes, offsets)
│ └─ Data Blob (raw bytes)
│
├─► Loader → Extract specific tensors by name
│ ├─ Lookup tensor info
│ ├─ Extract ByteArray slice
│ └─ Return (data, shape, quantization type)
│
└─► Upload → GPU Buffer
├─ If quantized (TQ2_0): Upload packed + scales
└─ If Float32: Upload directly
Tensor Naming Conventions #
GGUF files use specific naming patterns (from llama.cpp):
Embedding #
token_embd.weight → [vocab_size, dim]
Transformer Blocks (per layer N) #
blk.N.attn_norm.weight → [dim] (RMSNorm scales)
blk.N.attn_q.weight → [dim, dim] (Q projection)
blk.N.attn_k.weight → [dim, kv_dim] (K projection)
blk.N.attn_v.weight → [dim, kv_dim] (V projection)
blk.N.attn_output.weight → [dim, dim] (Output projection)
blk.N.ffn_norm.weight → [dim] (RMSNorm scales)
blk.N.ffn_gate.weight → [dim, ffn_dim] (Gate projection)
blk.N.ffn_up.weight → [dim, ffn_dim] (Up projection)
blk.N.ffn_down.weight → [ffn_dim, dim] (Down projection)
Output #
output_norm.weight → [dim] (Final RMSNorm)
output.weight → [dim, vocab_size] (LM head)
Quantization Handling #
Different tensors use different quantization:
- TQ2_0 (ternary): Most weight matrices (BitLinear)
- Float32: RMSNorm scales, some small tensors
- FP16: Sometimes used for scales
We handle this by:
- Check tensor's
ggml_typefield - Extract appropriate data format
- Upload to GPU with correct interpretation
Performance #
Zero-copy extraction: Tensor data is a ByteArray.extract slice - no memory copying.
References #
- llama.cpp:
convert_hf_to_gguf.py(tensor naming) - llama.cpp:
ggml-quants.h(quantization types) - GGUF spec: https://github.com/ggerganov/ggml/blob/master/docs/gguf.md
Tensor Data Types #
GGML quantization type IDs (from ggml-quants.h)
- F32 : GGMLType
- F16 : GGMLType
- BF16 : GGMLType
- Q4_0 : GGMLType
- Q4_1 : GGMLType
- Q5_0 : GGMLType
- Q5_1 : GGMLType
- Q8_0 : GGMLType
- Q8_1 : GGMLType
- Q2_K : GGMLType
- Q3_K : GGMLType
- Q4_K : GGMLType
- Q5_K : GGMLType
- Q6_K : GGMLType
- Q8_K : GGMLType
- IQ2_XXS : GGMLType
- TQ2_0 : GGMLType
- IQ4_NL_4_4 : GGMLType
- IQ4_NL_4_8 : GGMLType
- IQ4_NL_8_8 : GGMLType
- MXFP4 : GGMLType
- Unknown (id : Nat) : GGMLType
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Hesper.GGUF.Loader.GGMLType.fromNat 0 = Hesper.GGUF.Loader.GGMLType.F32
- Hesper.GGUF.Loader.GGMLType.fromNat 1 = Hesper.GGUF.Loader.GGMLType.F16
- Hesper.GGUF.Loader.GGMLType.fromNat 30 = Hesper.GGUF.Loader.GGMLType.BF16
- Hesper.GGUF.Loader.GGMLType.fromNat 2 = Hesper.GGUF.Loader.GGMLType.Q4_0
- Hesper.GGUF.Loader.GGMLType.fromNat 3 = Hesper.GGUF.Loader.GGMLType.Q4_1
- Hesper.GGUF.Loader.GGMLType.fromNat 6 = Hesper.GGUF.Loader.GGMLType.Q5_0
- Hesper.GGUF.Loader.GGMLType.fromNat 7 = Hesper.GGUF.Loader.GGMLType.Q5_1
- Hesper.GGUF.Loader.GGMLType.fromNat 8 = Hesper.GGUF.Loader.GGMLType.Q8_0
- Hesper.GGUF.Loader.GGMLType.fromNat 9 = Hesper.GGUF.Loader.GGMLType.Q8_1
- Hesper.GGUF.Loader.GGMLType.fromNat 10 = Hesper.GGUF.Loader.GGMLType.Q2_K
- Hesper.GGUF.Loader.GGMLType.fromNat 11 = Hesper.GGUF.Loader.GGMLType.Q3_K
- Hesper.GGUF.Loader.GGMLType.fromNat 12 = Hesper.GGUF.Loader.GGMLType.Q4_K
- Hesper.GGUF.Loader.GGMLType.fromNat 13 = Hesper.GGUF.Loader.GGMLType.Q5_K
- Hesper.GGUF.Loader.GGMLType.fromNat 14 = Hesper.GGUF.Loader.GGMLType.Q6_K
- Hesper.GGUF.Loader.GGMLType.fromNat 15 = Hesper.GGUF.Loader.GGMLType.Q8_K
- Hesper.GGUF.Loader.GGMLType.fromNat 16 = Hesper.GGUF.Loader.GGMLType.IQ2_XXS
- Hesper.GGUF.Loader.GGMLType.fromNat n = Hesper.GGUF.Loader.GGMLType.Unknown n
Instances For
Equations
- Hesper.GGUF.Loader.GGMLType.F32.bytesPerElement = 4
- Hesper.GGUF.Loader.GGMLType.F16.bytesPerElement = 2
- Hesper.GGUF.Loader.GGMLType.BF16.bytesPerElement = 2
- Hesper.GGUF.Loader.GGMLType.Q4_0.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q4_1.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q5_0.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q5_1.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q8_0.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q8_1.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q2_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q3_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q4_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q5_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q6_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.Q8_K.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.IQ2_XXS.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.TQ2_0.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.IQ4_NL_4_4.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.IQ4_NL_4_8.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.IQ4_NL_8_8.bytesPerElement = 0
- Hesper.GGUF.Loader.GGMLType.MXFP4.bytesPerElement = 0
- (Hesper.GGUF.Loader.GGMLType.Unknown a).bytesPerElement = 0
Instances For
Equations
- One or more equations did not get rendered due to their size.
Tensor Info #
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Tensor Extraction #
Find tensor by name in GGUF file
@param gguf Parsed GGUF file @param name Tensor name (e.g., "blk.0.attn_q.weight") @return Tensor info if found
Equations
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.F32 = Hesper.GGUF.Loader.GGMLType.F32
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.F16 = Hesper.GGUF.Loader.GGMLType.F16
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.BF16 = Hesper.GGUF.Loader.GGMLType.BF16
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q4_0 = Hesper.GGUF.Loader.GGMLType.Q4_0
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q4_1 = Hesper.GGUF.Loader.GGMLType.Q4_1
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q5_0 = Hesper.GGUF.Loader.GGMLType.Q5_0
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q5_1 = Hesper.GGUF.Loader.GGMLType.Q5_1
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q8_0 = Hesper.GGUF.Loader.GGMLType.Q8_0
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q8_1 = Hesper.GGUF.Loader.GGMLType.Q8_1
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q2_K = Hesper.GGUF.Loader.GGMLType.Q2_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q3_K = Hesper.GGUF.Loader.GGMLType.Q3_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q4_K = Hesper.GGUF.Loader.GGMLType.Q4_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q5_K = Hesper.GGUF.Loader.GGMLType.Q5_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q6_K = Hesper.GGUF.Loader.GGMLType.Q6_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.Q8_K = Hesper.GGUF.Loader.GGMLType.Q8_K
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.IQ2_XXS = Hesper.GGUF.Loader.GGMLType.IQ2_XXS
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.TQ2_0 = Hesper.GGUF.Loader.GGMLType.TQ2_0
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.IQ4_NL_4_4 = Hesper.GGUF.Loader.GGMLType.IQ4_NL_4_4
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.IQ4_NL_4_8 = Hesper.GGUF.Loader.GGMLType.IQ4_NL_4_8
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.IQ4_NL_8_8 = Hesper.GGUF.Loader.GGMLType.IQ4_NL_8_8
- Hesper.GGUF.Loader.convertGGMLType Hesper.GGUF.GGMLType.MXFP4 = Hesper.GGUF.Loader.GGMLType.MXFP4
- Hesper.GGUF.Loader.convertGGMLType t = Hesper.GGUF.Loader.GGMLType.Unknown 999
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract tensor data by name
Returns raw bytes for the tensor. Caller must interpret based on ggmlType.
@param gguf Parsed GGUF file @param name Tensor name @return (TensorInfo, ByteArray) - metadata and data
Equations
- One or more equations did not get rendered due to their size.
Instances For
mmap-aware tensor data getter. When the file was loaded via
loadGGUFMmap and dataBlob is empty (zero-copy mode), copies the
bytes from the mmap region instead. Otherwise falls back to the
pure-byteArray path.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract Float32 tensor data
Unpacks F32 data into Float array.
@param gguf Parsed GGUF file @param name Tensor name @return Array of Float32 values
Instances For
Extract F16 (Float16) tensor data as ByteArray
Returns raw F16 data as ByteArray (ready for GPU upload).
@param gguf Parsed GGUF file @param name Tensor name @return ByteArray of F16 data
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract I2_S (BitNet ternary) tensor data
Returns packed 2-bit ternary data and scale factor. I2_S format: 2 bits per weight {-1, 0, +1} Encoding: 00 → -1, 01 → 0, 10 → +1
@param gguf Parsed GGUF file @param name Tensor name @return (packed_data: ByteArray, scale: Float, num_elements: Nat)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract TQ2_0 quantized tensor data
Returns packed ternary data and FP16 scales for TQ2_0 tensors.
@param gguf Parsed GGUF file @param name Tensor name @return (packed_data, scales_data, num_blocks)
Equations
- One or more equations did not get rendered due to their size.
Instances For
GPU Upload #
Extract Float32 tensor as ByteArray
@param gguf Parsed GGUF file @param name Tensor name @return ByteArray of Float32 data (ready for GPU upload)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract F16 tensor as ByteArray
@param gguf Parsed GGUF file @param name Tensor name @return ByteArray of F16 data (ready for GPU upload)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract I2_S tensor and dequantize to Float32
Dequantizes BitNet ternary weights to F32 for GPU computation.
@param gguf Parsed GGUF file @param name Tensor name @return ByteArray of F32 dequantized data
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract TQ2_0 quantized tensor as ByteArrays
Returns two ByteArrays: packed data and scales.
@param gguf Parsed GGUF file @param name Tensor name @return (packed_data, scales_data)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Utilities #
List all tensor names in GGUF file
Useful for debugging and validation.
@param gguf Parsed GGUF file
Equations
- One or more equations did not get rendered due to their size.
Instances For
Validate tensor exists and has expected shape
@param gguf Parsed GGUF file @param name Tensor name @param expectedShape Expected dimensions @return true if tensor exists with correct shape
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract Q4_K tensor data as raw ByteArray
Returns raw Q4_K block data ready for GPU upload. Q4_K blocks: 144 bytes per 256 elements.
@param gguf Parsed GGUF file @param name Tensor name @return (raw_data: ByteArray, num_elements: Nat)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Extract Q4_K tensor and upload raw block data to GPU
@param gguf Parsed GGUF file @param name Tensor name @return (ByteArray of raw Q4_K block data, num_elements)
Equations
- One or more equations did not get rendered due to their size.