code wiki / _hdl_build / nx_gguf_write_gate.nx
nx_gguf_write_gate.nx source
↩ module page · 131 lines · 9106 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_gguf_write_gate.nx -- the TRAIN->SERVE BRIDGE: a SOVEREIGN GGUF v3 WRITER, so any trained weights (ours
4// from the f32 trainer, OR a PyTorch model's) serialize into the exact format our no-float inference already
5// LOADS (nx_gguf_parse). We could parse gguf but never WRITE it; this closes the loop -- train (anywhere) ->
6// gguf -> run on OUR stack. Proven by ROUND-TRIP: write named F32 weight tensors + metadata, then load with
7// OUR parser and assert names/dims/type + tensor DATA are BYTE-EXACT, and metadata KVs read back. The writer
8// (ggw_* funcs) is model-agnostic -> plug the char-LM / transformer / any weight buffers into it.
9// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
10import "nx_syscalls.nx"
11import "nx_le.nx"
12import "nx_gguf.nx"
13import "nx_gguf_meta.nx"
14import "nx_f32_hw.nx"
15
16func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
17" as *u8); return ok }
18func gslen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
19
20// ---- writer primitives: LE into buf at *pos, advancing pos ----
21func w_u8(buf: *u8, pos: *i64, v: i64) -> i64 { buf[pos[0]]=(v & 0xff) as u8; pos[0]=pos[0]+1; return 0 }
22func w_u32(buf: *u8, pos: *i64, v: i64) -> i64 { w_u8(buf,pos,v); w_u8(buf,pos,v>>8); w_u8(buf,pos,v>>16); w_u8(buf,pos,v>>24); return 0 }
23func w_u64(buf: *u8, pos: *i64, v: i64) -> i64 { w_u32(buf,pos,v & 0xffffffff); w_u32(buf,pos,(v>>32) & 0xffffffff); return 0 }
24func w_bytes(buf: *u8, pos: *i64, src: *u8, n: i64) -> i64 { var i: i64=0; while i<n { buf[pos[0]]=src[i]; pos[0]=pos[0]+1; i=i+1 } return 0 }
25func w_gstr(buf: *u8, pos: *i64, s: *u8, slen: i64) -> i64 { w_u64(buf,pos,slen); w_bytes(buf,pos,s,slen); return 0 }
26func w_align(buf: *u8, pos: *i64, a: i64) -> i64 { while (pos[0] % a) != 0 { buf[pos[0]]=0 as u8; pos[0]=pos[0]+1 } return 0 }
27
28// tensor spec packed i64[8]: [name_ptr, name_len, ndims, dim0, dim1, ggml_type, data_ptr(*i64 f32-cells), ncells]
29// write a full GGUF v3 into buf; returns total bytes. metadata: general.architecture=arch_str + n custom KVs
30// skipped for minimality (just the arch string). data is F32 (type 0) = 4 bytes per cell (low 32 of each slot).
31func ggw_write(buf: *u8, arch: *u8, tspecs: *i64, ntensor: i64) -> i64 {
32 let pos: *i64 = sys_mmap(8) as *i64; pos[0]=0
33 // precompute each tensor's data offset RELATIVE to the data section (align 32 between tensors)
34 let reloff: *i64 = sys_mmap((ntensor+1)*8) as *i64; reloff[0]=0
35 var i: i64=0
36 while i<ntensor { let bytes: i64=tspecs[i*8+7]*4; var nx: i64=reloff[i]+bytes; while (nx % 32)!=0 { nx=nx+1 } reloff[i+1]=nx; i=i+1 }
37 // header
38 w_u32(buf,pos,0x46554747); w_u32(buf,pos,3); w_u64(buf,pos,ntensor); w_u64(buf,pos,1) // 1 metadata KV
39 // metadata KV: "general.architecture" (string) = arch
40 let kk: *u8="general.architecture" as *u8
41 w_gstr(buf,pos,kk,20); w_u32(buf,pos,8); w_gstr(buf,pos,arch,gslen(arch)) // type 8 = STRING
42 // tensor infos
43 i=0
44 while i<ntensor {
45 w_gstr(buf,pos, tspecs[i*8] as *u8, tspecs[i*8+1])
46 let nd: i64=tspecs[i*8+2]; w_u32(buf,pos,nd)
47 w_u64(buf,pos,tspecs[i*8+3]); if nd>=2 { w_u64(buf,pos,tspecs[i*8+4]) }
48 w_u32(buf,pos, tspecs[i*8+5]); w_u64(buf,pos, reloff[i])
49 i=i+1
50 }
51 w_align(buf,pos,32) // -> data section start (data_off)
52 let data0: i64=pos[0]
53 // tensor data (F32 cells; pos tracks data0+reloff[i] by construction of align)
54 i=0
55 while i<ntensor {
56 let cells: *i64=tspecs[i*8+6] as *i64; let n: i64=tspecs[i*8+7]
57 var c: i64=0; while c<n { w_u32(buf,pos, cells[c] & 0xffffffff); c=c+1 }
58 w_align(buf,pos,32)
59 i=i+1
60 }
61 if data0>0 { } // (data0 available for callers that want it)
62 return pos[0]
63}
64
65func main() -> i64 {
66 gw("=== nx_gguf_write_gate: SOVEREIGN gguf writer -> round-trip through OUR loader (train->serve bridge) ===\n" as *u8)
67 var pass: i64=0; var total: i64=0
68
69 // three named F32 weight tensors with known values (as a trainer's buffers would look).
70 let te: *i64=sys_mmap(6*8) as *i64; var i: i64=0; while i<6 { te[i]=f32_of((i*3)+1); i=i+1 } // "token_embd.weight" [3,2]
71 let ow: *i64=sys_mmap(4*8) as *i64; i=0; while i<4 { ow[i]=f32_of(100-i*7); i=i+1 } // "output.weight" [2,2]
72 let on: *i64=sys_mmap(2*8) as *i64; on[0]=f32_of(5); on[1]=f32_of(9) // "output_norm.weight" [2]
73 let n1: *u8="token_embd.weight" as *u8; let n2: *u8="output.weight" as *u8; let n3: *u8="output_norm.weight" as *u8
74 let ts: *i64=sys_mmap(3*8*8) as *i64
75 ts[0]=n1 as i64; ts[1]=gslen(n1); ts[2]=2; ts[3]=2; ts[4]=3; ts[5]=0; ts[6]=te as i64; ts[7]=6
76 ts[8]=n2 as i64; ts[9]=gslen(n2); ts[10]=2; ts[11]=2; ts[12]=2; ts[13]=0; ts[14]=ow as i64; ts[15]=4
77 ts[16]=n3 as i64; ts[17]=gslen(n3); ts[18]=1; ts[19]=2; ts[20]=0; ts[21]=0; ts[22]=on as i64; ts[23]=2
78
79 let buf: *u8=sys_mmap(65536)
80 let nbytes: i64=ggw_write(buf, "nishi-charlm" as *u8, ts, 3)
81 let fd: i64=sys_openat_wr("/tmp/nx_written.gguf" as *u8, 0x1a4); sys_write(fd, buf, nbytes); sys_close(fd)
82 gw(" wrote /tmp/nx_written.gguf: " as *u8); gn(nbytes); gw(" bytes (3 F32 tensors + arch metadata)\n" as *u8)
83
84 // ---- load it with OUR parser ----
85 let lenp: *i64=sys_mmap(16) as *i64
86 let fbuf: *u8=sys_read_file("/tmp/nx_written.gguf" as *u8, lenp)
87 if (fbuf as i64)==0 { gw(" FAIL cannot reread\nNX-GGUF-WRITE verdict=RED\n" as *u8); return 1 }
88 let hdr: *NxGgufHeader=sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
89 let prc: nx_int=nx_gguf_parse(fbuf, lenp[0], hdr)
90 total=total+1; if prc==NX_GGUF_OK { if hdr.tensor_count==3 { if hdr.n_tensors==3 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } } else { gw(" [FAIL] " as *u8) } } else { gw(" [FAIL] " as *u8) }
91 gw("T1 OUR PARSER accepts it: rc=" as *u8); gn(prc); gw(" tensor_count=" as *u8); gn(hdr.tensor_count); gw(" metadata_count=" as *u8); gn(hdr.metadata_count); gw("\n" as *u8)
92
93 // T2: each tensor found by name, dims + type match.
94 let i1: nx_int=nx_gguf_find_tensor(hdr, n1, gslen(n1)); let i2: nx_int=nx_gguf_find_tensor(hdr, n2, gslen(n2)); let i3: nx_int=nx_gguf_find_tensor(hdr, n3, gslen(n3))
95 var ok2: i64=0
96 if i1>=0 { if i2>=0 { if i3>=0 {
97 let e1: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr,i1)
98 if e1.dim_0==2 { if e1.dim_1==3 { if e1.ggml_type==0 { ok2=1 } } }
99 } } }
100 total=total+1; if ok2==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
101 gw("T2 tensors found by name; token_embd dims+type match (F32)\n" as *u8)
102
103 // T3: tensor DATA byte-exact. Read the F32 at data_off+offset for each and compare to what we wrote.
104 var ok3: i64=1
105 let e1: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr,i1); let b1: i64=hdr.data_off+e1.offset
106 i=0; while i<6 { if nx_le_read_u32(fbuf, b1+i*4)!=(te[i] & 0xffffffff) { ok3=0 } i=i+1 }
107 let e2: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr,i2); let b2: i64=hdr.data_off+e2.offset
108 i=0; while i<4 { if nx_le_read_u32(fbuf, b2+i*4)!=(ow[i] & 0xffffffff) { ok3=0 } i=i+1 }
109 let e3: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr,i3); let b3: i64=hdr.data_off+e3.offset
110 i=0; while i<2 { if nx_le_read_u32(fbuf, b3+i*4)!=(on[i] & 0xffffffff) { ok3=0 } i=i+1 }
111 total=total+1; if ok3==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
112 gw("T3 tensor DATA byte-exact: all 12 F32 cells across 3 tensors read back == written (round-trip lossless)\n" as *u8)
113
114 // T4: metadata KV round-trips (general.architecture -> nishi-charlm).
115 let voff: *i64=sys_mmap(8) as *i64; let vty: *i64=sys_mmap(8) as *i64
116 let ka: *u8="general.architecture" as *u8
117 var ok4: i64=0
118 if nx_gguf_meta_find(fbuf, lenp[0], hdr, ka, 20, voff, vty)==NX_GMETA_OK {
119 let slen: i64=nx_gguf_meta_read_string_len(fbuf, voff[0]); let sp: *u8=nx_gguf_meta_read_string_ptr(fbuf, voff[0])
120 if slen==12 { var m: i64=1; let want: *u8="nishi-charlm" as *u8; var c: i64=0; while c<12 { if sp[c]!=want[c] { m=0 } c=c+1 } if m==1 { ok4=1 } }
121 }
122 total=total+1; if ok4==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
123 gw("T4 metadata round-trips: general.architecture == 'nishi-charlm'\n" as *u8)
124
125 gw("\n BRIDGE: a sovereign GGUF v3 writer -- named F32 weight tensors + metadata serialize to the EXACT format\n" as *u8)
126 gw(" our no-float inference loads, proven byte-exact through OUR own parser. Train anywhere (our f32 trainer or\n" as *u8)
127 gw(" PyTorch on the 5080) -> ggw_write -> gguf -> runs on our stack. The loop closes.\n" as *u8)
128 gw("NX-GGUF-WRITE verdict=" as *u8)
129 if pass==total { gw("GREEN passes=" as *u8); gn(pass); gw("/" as *u8); gn(total); gw(" -- sovereign gguf writer round-trips through our loader byte-exact\n" as *u8); sys_exit(0); return 0 }
130 gw("RED passes=" as *u8); gn(pass); gw("/" as *u8); gn(total); gw("\n" as *u8); sys_exit(1); return 1
131}