Read-only GGUF container parsing and ggml block dequantization, in pure MoonBit
moon add soehi/gguffn inspect(buf : Bytes) -> Unit {
// parse with full metadata when you need the vocabulary; plain `parse`
// summarizes large arrays (a 100k-entry token list) instead of materializing.
let file = match @gguf.parse(buf) {
Ok(f) => f
Err(e) => {
println("parse failed: \{e.message()}")
return
}
}
// Metadata is typed, by key: get_string / get_int / get_double / get.
let arch = file.get_string("general.architecture") // String?
println(arch.unwrap_or("unknown"))
// Tensor lookup is an Option, not a Result.
let idx = match file.index_of_tensor("blk.0.attn_q.weight") {
Some(i) => i
None => {
println("no such tensor")
return
}
}
let info = file.tensors[idx]
println("dims: \{info.n_dims()}, dequantizable: \{info.is_dequantizable()}")
// Raw payload (owned copy), or decoded floats. Both are Result; an
// unsupported storage type is an Err that names the type.
let raw = match file.tensor_bytes(idx) {
Ok(b) => b
Err(e) => {
println("cannot read payload: \{e.message()}")
return
}
}
println("payload bytes: \{raw.length()}")
let vals = match file.dequant_tensor(idx) {
Ok(v) => v
Err(e) => {
println("cannot dequantize: \{e.message()}")
return
}
}
println("decoded floats: \{vals.length()}")
}| Import | What it holds |
|---|---|
| soehi/gguf | The GGUF container: header, metadata key/values, tensor directory. |
| soehi/gguf/tensor | The ggml type table (all 43 ids) and block dequantization kernels. |
pip install numpy
python tools/gen_fixtures.pypub(all) suberror GgufError {
Truncated(offset~ : Int64, needed~ : Int64, remaining~ : Int64)
BadMagic(found~ : UInt)
UnsupportedVersion(version~ : UInt, supported_max~ : UInt)
UnknownValueType(offset~ : Int64, type_id~ : UInt)
BadAlignment(value~ : UInt)
AlignmentWrongType(type_id~ : UInt)
ArrayNestingTooDeep(offset~ : Int64, depth~ : Int)
IllegalArrayElementType(offset~ : Int64, type_id~ : UInt)
CountOverflow(offset~ : Int64, count~ : UInt64, elem_size~ : Int64)
CountTooLarge(offset~ : Int64, count~ : UInt64)
TensorCountImplausible(count~ : UInt64, remaining~ : Int64)
TooManyDims(offset~ : Int64, n_dims~ : UInt, max_dims~ : Int)
DataSectionOutOfRange(data_start~ : Int64, buffer_len~ : Int64)
TensorOutOfRange(name~ : String, offset~ : Int64, nbytes~ : Int64, data_len~ : Int64)
TensorNotSupported(name~ : String, type_id~ : UInt, type_name~ : String)
DequantFailed(name~ : String, reason~ : String)
} derive(Eq, Debug)pub(all) struct GgufFile {
version : UInt
alignment : UInt
tensors : Array[TensorInfo]
metadata : Array[(String, MetaValue)]
data_start : Int64
buf : Bytes
}pub(all) enum MetaArray {
Materialized(Array[MetaValue])
Summarized(MetaArraySummary)
} derive(Eq, Debug)let array_materialize_limit : Intlet array_prefix_len : Intfn decode_utf8_lossy(raw : Bytes) -> Stringlet gguf_default_alignment : UIntfn is_scalar_value_type(type_id : UInt) -> Boolfn quote_short(s : String) -> Stringfn read_meta_value(c : ByteCursor, type_id : UInt, materialize? : Bool) -> Result[MetaValue, GgufError]fn value_type_name(type_id : UInt) -> StringInstall
Download zipRead-only GGUF container parsing and ggml block dequantization, in pure MoonBit