nx_nofloat_qwen_forward_gate.nx source
↩ module page · 118 lines · 7954 B
1// nx_nofloat_qwen_forward_gate.nx -- CAPSTONE: a COMPLETE sovereign no-float Qwen2.5-0.5B forward.
2// token ids -> embed (token_embd) -> 24 transformer layers -> final RMSNorm (output_norm) -> LM head
3// (output.weight, streamed over 151936 vocab) -> argmax = predicted next token.
4// ALL building blocks come from the canonical library nx_nofloat_llm.nx (DRY -- no copy-paste debt; one
5// correct accumulate-then-shift matmul). This file is just the wiring + the test. expect_exit: 0 ORIGINAL
6import "nx_syscalls.nx"
7import "nx_tier.nx"
8import "nx_le.nx"
9import "nx_tensor.nx"
10import "nx_gguf.nx"
11import "nx_gguf_load.nx"
12import "nx_nofloat_llm.nx"
13import "nx_gate_verdict.nx"
14
15func fw_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
16func fw_num(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
17
18func main() -> i64 {
19 fw_puts("CAPSTONE: a COMPLETE sovereign no-float Qwen2.5-0.5B forward (lib nx_nofloat_llm; embed->24L->norm->head->argmax)\n\n" as *u8)
20 let path: *u8 = "/home/elderwesto/nx_stage/nx_real_model.gguf\x00" as *u8
21 let len_out: *i64 = sys_mmap(8) as *i64
22 len_out[0]=0
23 let buf: *u8 = sys_read_file(path, len_out)
24
25 let T: i64=2
26 let ne: i64=896
27 let qd: i64=896
28 let kvd: i64=128
29 let fd: i64=4864
30 let N: i64=24
31 let cfgA: *i64 = sys_mmap(8*8) as *i64
32 cfgA[0]=T; cfgA[1]=ne; cfgA[2]=14; cfgA[3]=2; cfgA[4]=64; cfgA[5]=qd; cfgA[6]=kvd; cfgA[7]=8192
33 let cfgF: *i64 = sys_mmap(4*8) as *i64
34 cfgF[0]=T; cfgF[1]=ne; cfgF[2]=fd
35
36 var ran: i64=0
37 var nlayers: i64=0
38 var vocab: i64=0
39 var argmax_idx: i64=0
40 var max_logit: i64=0
41 var min_logit: i64=0
42 var hid_overflow: i64=0
43 var det_ok: i64=0
44 let tmp: *i64 = sys_mmap(64*256*8) as *i64
45 let row: *i64 = sys_mmap(ne*8) as *i64
46 if buf != (0 as *u8) { if len_out[0] > 1000 {
47 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
48 if nx_gguf_parse(buf, len_out[0], hdr) == NX_GGUF_OK {
49 let nt: *u8 = "token_embd.weight\x00" as *u8; let ti_e: nx_int = nx_gguf_find_tensor(hdr, nt, 17)
50 let nn: *u8 = "output_norm.weight\x00" as *u8; let ti_n: nx_int = nx_gguf_find_tensor(hdr, nn, 18)
51 let no: *u8 = "output.weight\x00" as *u8; let ti_o: nx_int = nx_gguf_find_tensor(hdr, no, 13)
52 if ti_e>=0 { if ti_n>=0 { if ti_o>=0 {
53 let te: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, ti_e); let te_base: i64=hdr.data_off+te.offset; let te_ty: i64=te.ggml_type
54 let oh: *NxGgufTensorInfo = nx_gguf_tensor_at(hdr, ti_o); let oh_base: i64=hdr.data_off+oh.offset; let oh_ty: i64=oh.ggml_type; vocab=oh.dim_1
55 let gout: *i64 = sys_mmap(ne*8) as *i64
56 load_named_q16(buf, hdr, nn, 18, gout, ne)
57 let wb: *i64 = sys_mmap(12*8) as *i64
58 wb[0]=sys_mmap(ne*8) as i64; wb[1]=sys_mmap(qd*ne*8) as i64; wb[2]=sys_mmap(kvd*ne*8) as i64; wb[3]=sys_mmap(kvd*ne*8) as i64; wb[4]=sys_mmap(ne*qd*8) as i64
59 wb[5]=sys_mmap(ne*8) as i64; wb[6]=sys_mmap(ne*fd*8) as i64; wb[7]=sys_mmap(ne*fd*8) as i64; wb[8]=sys_mmap(fd*ne*8) as i64
60 wb[9]=sys_mmap(qd*8) as i64; wb[10]=sys_mmap(kvd*8) as i64; wb[11]=sys_mmap(kvd*8) as i64
61 let sb: *i64 = sys_mmap(14*8) as *i64
62 sb[0]=sys_mmap(T*ne*8) as i64; sb[1]=sys_mmap(T*qd*8) as i64; sb[2]=sys_mmap(T*kvd*8) as i64; sb[3]=sys_mmap(T*kvd*8) as i64; sb[4]=sys_mmap(T*qd*8) as i64
63 sb[5]=sys_mmap(T*8) as i64; sb[6]=sys_mmap(T*8) as i64; sb[7]=sys_mmap(T*ne*8) as i64; sb[8]=sys_mmap(T*fd*8) as i64; sb[9]=sys_mmap(T*fd*8) as i64
64 sb[10]=sys_mmap(T*fd*8) as i64; sb[11]=sys_mmap(T*ne*8) as i64; sb[12]=sys_mmap(T*ne*8) as i64; sb[13]=sys_mmap(T*ne*8) as i64
65 let nm: *u8 = sys_mmap(64)
66 let freqs: *i64 = sys_mmap(32*8) as *i64
67 rope_freqs(freqs, 64)
68 // 1. EMBED a 2-token sequence
69 let tids: *i64 = sys_mmap(8) as *i64; tids[0]=9001; tids[1]=137
70 let x: *i64 = sys_mmap(T*ne*8) as *i64
71 var ii: i64=0; while ii<T { dequant_row(buf, te_base, te_ty, tids[ii], ne, ((x as i64)+ii*ne*8) as *i64, tmp); ii=ii+1 }
72 // 2. 24 TRANSFORMER LAYERS
73 let hidden: *i64 = sys_mmap(T*ne*8) as *i64
74 run_stack(buf, hdr, x, hidden, wb, sb, nm, freqs, cfgA, cfgF, N, 0)
75 nlayers=N
76 // 3. FINAL NORM on the last token
77 let normed: *i64 = sys_mmap(ne*8) as *i64
78 rmsnorm_gamma_row(hidden, gout, (T-1)*ne, ne, normed, 0)
79 // 4. LM HEAD -> logits -> argmax (stream vocab)
80 var v: i64=0
81 while v<vocab {
82 dequant_row(buf, oh_base, oh_ty, v, ne, row, tmp)
83 var s: i64=0; var k: i64=0; while k<ne { s=s+(normed[k]*row[k]); k=k+1 }
84 let lg: i64=s>>16
85 if v==0 { max_logit=lg; min_logit=lg; argmax_idx=0 } else { if lg>max_logit { max_logit=lg; argmax_idx=v } if lg<min_logit { min_logit=lg } }
86 v=v+1
87 }
88 dequant_row(buf, oh_base, oh_ty, argmax_idx, ne, row, tmp)
89 var s2: i64=0; var k2: i64=0; while k2<ne { s2=s2+(normed[k2]*row[k2]); k2=k2+1 }
90 if (s2>>16)==max_logit { det_ok=1 }
91 let BOUND: i64=1099511627776
92 ii=0; while ii<T*ne { var a: i64=hidden[ii]; if a<0 { a=0-a } if a>=BOUND { hid_overflow=hid_overflow+1 } ii=ii+1 }
93 ran=1
94 } } }
95 }
96 } }
97
98 fw_puts(" forward ran="); fw_num(ran); fw_puts(" layers="); fw_num(nlayers); fw_puts(" vocab="); fw_num(vocab); fw_puts("\n");
99 fw_puts(" >>> PREDICTED NEXT TOKEN (argmax) = "); fw_num(argmax_idx); fw_puts(" max_logit="); fw_num(max_logit); fw_puts(" min_logit="); fw_num(min_logit); fw_puts(" hidden_overflow="); fw_num(hid_overflow); fw_puts("\n\n");
100
101 var pass: i64=0
102 var ttl: i64=0
103 ttl=ttl+1; fw_puts(" T1 full forward ran end-to-end on real weights (embed + 24 layers + norm + head, via lib): "); if ran==1 { if nlayers==24 { pass=pass+1; fw_puts("PASS\n") } else { fw_puts("FAIL\n") } } else { fw_puts("FAIL\n") }
104 ttl=ttl+1; fw_puts(" T2 argmax is a VALID next-token id (0 <= argmax < vocab, vocab>=100000): "); if argmax_idx>=0 { if argmax_idx<vocab { if vocab>=100000 { pass=pass+1; fw_puts("PASS\n") } else { fw_puts("FAIL\n") } } else { fw_puts("FAIL\n") } } else { fw_puts("FAIL\n") }
105 ttl=ttl+1; fw_puts(" T3 logits non-degenerate + hidden STABLE through 24 layers (no overflow): "); if max_logit != min_logit { if hid_overflow==0 { pass=pass+1; fw_puts("PASS\n") } else { fw_puts("FAIL\n") } } else { fw_puts("FAIL\n") }
106 ttl=ttl+1; fw_puts(" T4 DETERMINISTIC (head recompute identical; stack/embed proven det in their gates): "); if det_ok==1 { pass=pass+1; fw_puts("PASS\n") } else { fw_puts("FAIL\n") }
107
108 fw_puts("NX-NOFLOAT-QWEN-FORWARD-GATE passed "); fw_num(pass); fw_puts("/"); fw_num(ttl)
109 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
110 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
111 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
112 let ctr__dry: *i64 = gv_ctr()
113 ctr__dry[0] = pass
114 ctr__dry[1] = ttl
115 let rc__dry: i64 = gv_verdict("NOFLOAT-QWEN-FORWARD-GATE" as *u8, ctr__dry, "complete sovereign no-float Qwen forward, built from the canonical nx_nofloat_llm library -- no copy-paste debt)" as *u8)
116 sys_exit(rc__dry)
117 return rc__dry
118}