nx_gguf_typecensus.nx source
↩ module page · 45 lines · 1562 B
1// nx_gguf_typecensus.nx -- tally the real model's tensors by ggml_type,
2// so we know what quant the weights actually are (the memory-bound decode
3// lever depends on it: Q8_0=1B/val, Q4_K=0.56B/val, F32=4B/val).
4// ggml types: 0=F32 1=F16 2=Q4_0 3=Q4_1 8=Q8_0 12=Q4_K 14=Q6_K.
5// expect_exit: 0
6
7import "nx_syscalls.nx"
8import "nx_tier.nx"
9import "nx_gguf.nx"
10import "nx_gguf_load.nx"
11import "nx_fmt.nx"
12
13func main() -> i64 {
14 let path: *u8 = "/tmp/nx_real_model.gguf" as *u8
15 let len_out: *i64 = sys_mmap(8) as *i64
16 let buf: *u8 = sys_read_file(path, len_out)
17 if buf == (0 as *u8) { fmt_puts("no model\n" as *u8); return 10 }
18 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
19 if nx_gguf_parse(buf, len_out[0], hdr) != NX_GGUF_OK { return 20 }
20
21 let n: i64 = hdr.n_tensors
22 let counts: *i64 = sys_mmap(64 * 8) as *i64
23 let vals: *i64 = sys_mmap(64 * 8) as *i64
24 var i: i64 = 0
25 while i < n {
26 let ti: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, i)
27 let t: i64 = ti.ggml_type
28 if t >= 0 { if t < 64 {
29 counts[t] = counts[t] + 1
30 vals[t] = vals[t] + nx_gguf_tensor_n_values(ti)
31 } }
32 i = i + 1
33 }
34
35 fmt_puts("n_tensors="); fmt_putn(n); fmt_puts("\n" as *u8)
36 var t: i64 = 0
37 while t < 64 {
38 if counts[t] > 0 {
39 fmt_puts("ggml_type "); fmt_putn(t); fmt_puts(": "); fmt_putn(counts[t])
40 fmt_puts(" tensors, "); fmt_putn(vals[t]); fmt_puts(" values\n" as *u8)
41 }
42 t = t + 1
43 }
44 return 0
45}