nx_f32_llm_diag_test.nx source
↩ module page · 137 lines · 5658 B
1// nx_f32_llm_diag_test.nx -- enumerate all tensor ggml_types in
2// the real Qwen2.5 GGUF. Writes counts to /tmp/nx_gguf_types.tsv.
3
4import "nx_syscalls.nx"
5import "nx_tier.nx"
6import "nx_le.nx"
7import "nx_strconv.nx"
8import "nx_gguf.nx"
9import "nx_gguf_load.nx"
10
11func _emit_kv(fd: i64, key: *u8, key_len: nx_int, value: i64) -> i64 {
12 let line: *u8 = sys_mmap(128)
13 var lo: i64 = 0
14 var ki: nx_int = 0
15 while ki < key_len { line[lo] = key[ki]; lo = lo + 1; ki = ki + 1 }
16 line[lo] = 0x09 as u8; lo = lo + 1
17 let dec: *u8 = sys_mmap(32)
18 let n_dec: i64 = nx_strconv_format_i64(value, dec)
19 var k: i64 = 0
20 while k < n_dec { line[lo] = dec[k]; lo = lo + 1; k = k + 1 }
21 line[lo] = 0x0A as u8; lo = lo + 1
22 return sys_write(fd, line, lo)
23}
24
25func main() -> i64 {
26 let path: *u8 = sys_mmap(64)
27 path[0]=0x2F as u8; path[1]=0x74 as u8; path[2]=0x6D as u8; path[3]=0x70 as u8
28 path[4]=0x2F as u8; path[5]=0x6E as u8; path[6]=0x78 as u8; path[7]=0x5F as u8
29 path[8]=0x72 as u8; path[9]=0x65 as u8; path[10]=0x61 as u8; path[11]=0x6C as u8
30 path[12]=0x5F as u8; path[13]=0x6D as u8; path[14]=0x6F as u8; path[15]=0x64 as u8
31 path[16]=0x65 as u8; path[17]=0x6C as u8; path[18]=0x2E as u8
32 path[19]=0x67 as u8; path[20]=0x67 as u8; path[21]=0x75 as u8; path[22]=0x66 as u8
33 path[23]=0 as u8
34
35 let len_out: *i64 = sys_mmap(8) as *i64
36 let buf: *u8 = sys_read_file(path, len_out)
37 if buf == (0 as *u8) { return 10 }
38
39 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
40 if nx_gguf_parse(buf, len_out[0], hdr) != NX_GGUF_OK { return 20 }
41
42 // Tally counts per type (indices 0..30).
43 let counts: *i64 = sys_mmap(32 * 8) as *i64
44 var ci: nx_int = 0
45 while ci < 32 { counts[ci] = 0; ci = ci + 1 }
46
47 var i: nx_int = 0
48 while i < hdr.n_tensors {
49 let ti: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, i)
50 let t: nx_int = ti.ggml_type as nx_int
51 if t >= 0 {
52 if t < 32 { counts[t] = counts[t] + 1 }
53 }
54 i = i + 1
55 }
56
57 // Get embed type specifically.
58 let n_te: *u8 = sys_mmap(17)
59 n_te[0]=0x74 as u8; n_te[1]=0x6f as u8; n_te[2]=0x6b as u8; n_te[3]=0x65 as u8
60 n_te[4]=0x6e as u8; n_te[5]=0x5f as u8; n_te[6]=0x65 as u8; n_te[7]=0x6d as u8
61 n_te[8]=0x62 as u8; n_te[9]=0x64 as u8; n_te[10]=0x2e as u8; n_te[11]=0x77 as u8
62 n_te[12]=0x65 as u8; n_te[13]=0x69 as u8; n_te[14]=0x67 as u8; n_te[15]=0x68 as u8
63 n_te[16]=0x74 as u8
64 let idx_te: nx_int = nx_gguf_find_tensor(hdr, n_te, 17)
65 var embed_type: i64 = -1
66 if idx_te >= 0 {
67 let ti_te: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, idx_te)
68 embed_type = ti_te.ggml_type
69 }
70
71 // Get blk.0.attn_q.weight type.
72 let n_q: *u8 = sys_mmap(20)
73 n_q[0]=0x62 as u8; n_q[1]=0x6c as u8; n_q[2]=0x6b as u8; n_q[3]=0x2e as u8
74 n_q[4]=0x30 as u8; n_q[5]=0x2e as u8; n_q[6]=0x61 as u8; n_q[7]=0x74 as u8
75 n_q[8]=0x74 as u8; n_q[9]=0x6e as u8; n_q[10]=0x5f as u8; n_q[11]=0x71 as u8
76 n_q[12]=0x2e as u8; n_q[13]=0x77 as u8; n_q[14]=0x65 as u8; n_q[15]=0x69 as u8
77 n_q[16]=0x67 as u8; n_q[17]=0x68 as u8; n_q[18]=0x74 as u8
78 let idx_q: nx_int = nx_gguf_find_tensor(hdr, n_q, 19)
79 var wq_type: i64 = -1
80 if idx_q >= 0 {
81 let ti_q: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, idx_q)
82 wq_type = ti_q.ggml_type
83 }
84
85 // Write TSV to /tmp/nx_gguf_types.tsv.
86 let tsv_path: *u8 = sys_mmap(64)
87 tsv_path[0]=0x2F as u8; tsv_path[1]=0x74 as u8; tsv_path[2]=0x6D as u8; tsv_path[3]=0x70 as u8
88 tsv_path[4]=0x2F as u8; tsv_path[5]=0x6E as u8; tsv_path[6]=0x78 as u8; tsv_path[7]=0x5F as u8
89 tsv_path[8]=0x67 as u8; tsv_path[9]=0x67 as u8; tsv_path[10]=0x75 as u8; tsv_path[11]=0x66 as u8
90 tsv_path[12]=0x5F as u8; tsv_path[13]=0x74 as u8; tsv_path[14]=0x79 as u8; tsv_path[15]=0x70 as u8
91 tsv_path[16]=0x65 as u8; tsv_path[17]=0x73 as u8; tsv_path[18]=0x2E as u8
92 tsv_path[19]=0x74 as u8; tsv_path[20]=0x73 as u8; tsv_path[21]=0x76 as u8
93 tsv_path[22]=0 as u8
94
95 let fd: i64 = sys_openat_wr(tsv_path, 0x1A4)
96 if fd < 0 { return 30 }
97
98 let k_n: *u8 = sys_mmap(9)
99 k_n[0]=0x6E as u8; k_n[1]=0x5F as u8; k_n[2]=0x74 as u8; k_n[3]=0x65 as u8
100 k_n[4]=0x6E as u8; k_n[5]=0x73 as u8; k_n[6]=0x6F as u8; k_n[7]=0x72 as u8
101 k_n[8]=0x73 as u8
102 _emit_kv(fd, k_n, 9, hdr.n_tensors as i64)
103
104 let k_e: *u8 = sys_mmap(10)
105 k_e[0]=0x65 as u8; k_e[1]=0x6D as u8; k_e[2]=0x62 as u8; k_e[3]=0x65 as u8
106 k_e[4]=0x64 as u8; k_e[5]=0x5F as u8; k_e[6]=0x74 as u8; k_e[7]=0x79 as u8
107 k_e[8]=0x70 as u8; k_e[9]=0x65 as u8
108 _emit_kv(fd, k_e, 10, embed_type)
109
110 let k_q: *u8 = sys_mmap(7)
111 k_q[0]=0x77 as u8; k_q[1]=0x71 as u8; k_q[2]=0x5F as u8; k_q[3]=0x74 as u8
112 k_q[4]=0x79 as u8; k_q[5]=0x70 as u8; k_q[6]=0x65 as u8
113 _emit_kv(fd, k_q, 7, wq_type)
114
115 // Emit counts for each type 0..30.
116 let prefix_t: *u8 = sys_mmap(7)
117 prefix_t[0]=0x74 as u8; prefix_t[1]=0x79 as u8; prefix_t[2]=0x70 as u8
118 prefix_t[3]=0x65 as u8; prefix_t[4]=0x5F as u8
119 let dec_buf: *u8 = sys_mmap(8)
120 var t: nx_int = 0
121 while t < 31 {
122 if counts[t] > 0 {
123 // emit "type_<n>\t<count>\n"
124 let key: *u8 = sys_mmap(16)
125 key[0]=0x74 as u8; key[1]=0x79 as u8; key[2]=0x70 as u8
126 key[3]=0x65 as u8; key[4]=0x5F as u8
127 let n_dec: i64 = nx_strconv_format_i64(t as i64, dec_buf)
128 var dd: i64 = 0
129 while dd < n_dec { key[5 + dd] = dec_buf[dd]; dd = dd + 1 }
130 _emit_kv(fd, key, (5 + n_dec) as nx_int, counts[t])
131 }
132 t = t + 1
133 }
134
135 sys_close(fd)
136 return 0
137}