code wiki / (root) / nx_llm_capcheck.nx

nx_llm_capcheck.nx source

↩ module page · 150 lines · 11212 B

1// nx_llm_capcheck.nx -- SOVEREIGN DEEP CAPABILITY CHECKER for the no-float Qwen2.5-0.5B (our own "Unsloth-style" 2// harness: measure SPEED + ACCURACY together, reproducibly, on the REAL model -- no TSV, no strawman). 3// For a suite of known-answer prompts it runs the full sovereign pipeline (BPE encode -> 24-layer integer forward 4// -> final norm -> 151936-vocab LM head -> argmax -> BPE decode) and measures, via the sys_now_ms clock, isolated: 5// * forward_ms -- the 24-layer integer stack (incl. on-the-fly weight dequant; no weight cache yet) 6// * lmhead_ms -- the one full-vocab output projection 7// * load_ms -- one-time model parse (amortized in real use) 8// and CAPABILITY: does the decoded prediction contain the expected answer? -> accuracy X/N. 9// HONEST: a measurement harness PASSES when it MEASURES correctly; the accuracy number is the finding, not gated -- 10// it surfaces the known faithfulness gap (component-verified matmul/RoPE, full-stack H2H still open) so we can fix it. 11// No hw writes (Rule 26). expect_exit: 0 license_tier: ORIGINAL 12import "nx_syscalls.nx" 13import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc) 14import "nx_tier.nx" 15import "nx_le.nx" 16import "nx_tensor.nx" 17import "nx_gguf.nx" 18import "nx_gguf_load.nx" 19import "nx_gguf_meta.nx" 20import "nx_nofloat_llm.nx" 21import "nx_nofloat_tok.nx" 22 23func cc_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 24// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 25// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 26// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 27// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 28func cc_num(v: i64) -> i64 { nxi_out(v); return 0 } 29func cc_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 30// substring match: does haystack[0..hlen) contain needle[0..nlen)? (the predicted token's bytes carry a GPT-2 31// space marker prefix, but the answer's ASCII bytes appear literally -> ASCII substring match is correct.) 32func cc_contains(hay: *u8, hlen: i64, ndl: *u8, nlen: i64) -> i64 { 33 if nlen==0 { return 1 } 34 var i: i64=0 35 while i + nlen <= hlen { 36 var j: i64=0; var m: i64=1 37 while j < nlen { if hay[i+j] != ndl[j] { m=0; j=nlen } else { j=j+1 } } 38 if m==1 { return 1 } 39 i=i+1 40 } 41 return 0 42} 43 44func main() -> i64 { 45 cc_puts("=== NISHI LLM DEEP CAPABILITY CHECK -- sovereign no-float Qwen2.5-0.5B (speed + accuracy, measured) ===\n\n" as *u8) 46 let path: *u8 = "/home/elderwesto/nx_stage/nx_real_model.gguf\x00" as *u8 47 let len_out: *i64 = sys_mmap(8) as *i64; len_out[0]=0 48 let t_load0: i64 = sys_now_ms() 49 let buf: *u8 = sys_read_file(path, len_out) 50 if buf == (0 as *u8) { cc_puts(" MODEL ABSENT at /home/elderwesto/nx_stage/nx_real_model.gguf\n" as *u8); sys_exit(1); return 1 } 51 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader 52 if nx_gguf_parse(buf, len_out[0], hdr) != NX_GGUF_OK { cc_puts(" GGUF parse FAILED\n" as *u8); sys_exit(1); return 1 } 53 let t_load1: i64 = sys_now_ms() 54 let load_ms: i64 = t_load1 - t_load0 55 56 let ne: i64=896; let qd: i64=896; let kvd: i64=128; let fd: i64=4864; let MAXT: i64=16 57 // metadata: merges + token table 58 let voff: *i64 = sys_mmap(8) as *i64; let vty: *i64 = sys_mmap(8) as *i64 59 var mfirst: i64=0; var nm: i64=0; var vfirst: i64=0; var vocab: i64=0 60 let km: *u8 = "tokenizer.ggml.merges\x00" as *u8; let kt: *u8 = "tokenizer.ggml.tokens\x00" as *u8 61 if nx_gguf_meta_find(buf, len_out[0], hdr, km, cc_slen(km), voff, vty)==NX_GMETA_OK { nm=nx_gguf_meta_array_count(buf, voff[0]); mfirst=nx_gguf_meta_array_first_elt_off(buf, voff[0]) } 62 if nx_gguf_meta_find(buf, len_out[0], hdr, kt, cc_slen(kt), voff, vty)==NX_GMETA_OK { vocab=nx_gguf_meta_array_count(buf, voff[0]); vfirst=nx_gguf_meta_array_first_elt_off(buf, voff[0]) } 63 // forward tensors 64 let nt: *u8 = "token_embd.weight\x00" as *u8; let no: *u8 = "output.weight\x00" as *u8; let nn: *u8 = "output_norm.weight\x00" as *u8 65 let ie: nx_int=nx_gguf_find_tensor(hdr, nt, 17); let io: nx_int=nx_gguf_find_tensor(hdr, no, 13); let inn: nx_int=nx_gguf_find_tensor(hdr, nn, 18) 66 if ie<0 { cc_puts(" token_embd missing\n" as *u8); sys_exit(1); return 1 } 67 if io<0 { cc_puts(" output.weight missing\n" as *u8); sys_exit(1); return 1 } 68 if inn<0 { cc_puts(" output_norm missing\n" as *u8); sys_exit(1); return 1 } 69 let te: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr, ie); let te_base: i64=hdr.data_off+te.offset; let te_ty: i64=te.ggml_type 70 let oh: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr, io); let oh_base: i64=hdr.data_off+oh.offset; let oh_ty: i64=oh.ggml_type 71 let gout: *i64=sys_mmap(ne*8) as *i64; load_named_q16(buf, hdr, nn, 18, gout, ne) 72 73 // one-time working buffers (reused across prompts) 74 let wb: *i64=sys_mmap(12*8) as *i64 75 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 76 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 77 wb[9]=sys_mmap(qd*8) as i64; wb[10]=sys_mmap(kvd*8) as i64; wb[11]=sys_mmap(kvd*8) as i64 78 let sb: *i64=sys_mmap(14*8) as *i64 79 sb[0]=sys_mmap(MAXT*ne*8) as i64; sb[1]=sys_mmap(MAXT*qd*8) as i64; sb[2]=sys_mmap(MAXT*kvd*8) as i64; sb[3]=sys_mmap(MAXT*kvd*8) as i64; sb[4]=sys_mmap(MAXT*qd*8) as i64 80 sb[5]=sys_mmap(MAXT*8) as i64; sb[6]=sys_mmap(MAXT*8) as i64; sb[7]=sys_mmap(MAXT*ne*8) as i64; sb[8]=sys_mmap(MAXT*fd*8) as i64; sb[9]=sys_mmap(MAXT*fd*8) as i64 81 sb[10]=sys_mmap(MAXT*fd*8) as i64; sb[11]=sys_mmap(MAXT*ne*8) as i64; sb[12]=sys_mmap(MAXT*ne*8) as i64; sb[13]=sys_mmap(MAXT*ne*8) as i64 82 let nmbuf: *u8=sys_mmap(64); let freqs: *i64=sys_mmap(32*8) as *i64; rope_freqs(freqs, 64) 83 let tmp: *i64=sys_mmap(64*256*8) as *i64 84 let x: *i64=sys_mmap(MAXT*ne*8) as *i64; let hidden: *i64=sys_mmap(MAXT*ne*8) as *i64 85 let normed: *i64=sys_mmap(ne*8) as *i64; let row: *i64=sys_mmap(ne*8) as *i64 86 let ids: *i64=sys_mmap(MAXT*8) as *i64; let tokp: *i64=sys_mmap(MAXT*8) as *i64; let tokl: *i64=sys_mmap(MAXT*8) as *i64 87 let cfgA: *i64=sys_mmap(8*8) as *i64; cfgA[1]=ne; cfgA[2]=14; cfgA[3]=2; cfgA[4]=64; cfgA[5]=qd; cfgA[6]=kvd; cfgA[7]=8192 88 let cfgF: *i64=sys_mmap(4*8) as *i64; cfgF[1]=ne; cfgF[2]=fd 89 90 // prompt suite (known-answer): prompt -> expected next-answer substring 91 let N: i64=2 92 let prompts: *i64=sys_mmap(4*8) as *i64 93 let expect: *i64=sys_mmap(4*8) as *i64 94 prompts[0]="The capital of France is\x00" as i64; expect[0]="Paris\x00" as i64 95 prompts[1]="The opposite of hot is\x00" as i64; expect[1]="cold\x00" as i64 96 prompts[2]="The sun rises in the\x00" as i64; expect[2]="east\x00" as i64 97 prompts[3]="Water is made of hydrogen and\x00" as i64; expect[3]="oxygen\x00" as i64 98 99 var correct: i64=0; var ran: i64=0; var sum_fwd: i64=0; var sum_lm: i64=0; var sum_tok: i64=0 100 var pi: i64=0 101 while pi < N { 102 let input: *u8 = prompts[pi] as *u8; let ilen: i64 = cc_slen(input) 103 let exp: *u8 = expect[pi] as *u8; let elen: i64 = cc_slen(exp) 104 let ntok: i64 = tk_bpe_encode(buf, mfirst, nm, vfirst, vocab, input, ilen, tokp, tokl, ids) 105 var ids_ok: i64=1; var vi: i64=0; while vi<ntok { if ids[vi]<0 { ids_ok=0 } vi=vi+1 } 106 if ntok>=1 { if ids_ok==1 { 107 let T: i64=ntok; cfgA[0]=T; cfgF[0]=T 108 var ei: i64=0; while ei<T { dequant_row(buf, te_base, te_ty, ids[ei], ne, ((x as i64)+ei*ne*8) as *i64, tmp); ei=ei+1 } 109 let f0: i64=sys_now_ms() 110 run_stack(buf, hdr, x, hidden, wb, sb, nmbuf, freqs, cfgA, cfgF, 24, 0) 111 let f1: i64=sys_now_ms() 112 rmsnorm_gamma_row(hidden, gout, (T-1)*ne, ne, normed, 0) 113 let l0: i64=sys_now_ms() 114 var maxl: i64=0; var argmax_idx: i64=0; var v: i64=0 115 while v<vocab { dequant_row(buf, oh_base, oh_ty, v, ne, row, tmp); var s: i64=0; var k: i64=0; while k<ne { s=s+(normed[k]*row[k]); k=k+1 } let lg: i64=s>>16; if v==0 { maxl=lg; argmax_idx=0 } else { if lg>maxl { maxl=lg; argmax_idx=v } } v=v+1 } 116 let l1: i64=sys_now_ms() 117 let pred_off: i64 = tk_decode_off(buf, vfirst, argmax_idx) 118 let pred_len: i64 = nx_gguf_meta_read_string_len(buf, pred_off) 119 let pred_ptr: *u8 = nx_gguf_meta_read_string_ptr(buf, pred_off) 120 let hit: i64 = cc_contains(pred_ptr, pred_len, exp, elen) 121 ran=ran+1; sum_fwd=sum_fwd+(f1-f0); sum_lm=sum_lm+(l1-l0); sum_tok=sum_tok+T 122 if hit==1 { correct=correct+1 } 123 cc_puts(" ["); cc_num(pi); cc_puts("] '"); sys_write(1, input, ilen); cc_puts("' ("); cc_num(T); cc_puts(" tok) pred='") 124 if pred_len>0 { sys_write(1, pred_ptr, pred_len) } 125 cc_puts("' expect~'"); sys_write(1, exp, elen); cc_puts("' "); if hit==1 { cc_puts("CORRECT") } else { cc_puts("wrong") } 126 cc_puts(" fwd="); cc_num(f1-f0); cc_puts("ms lmhead="); cc_num(l1-l0); cc_puts("ms\n") 127 } } 128 pi=pi+1 129 } 130 131 cc_puts("\n ---- MEASURED ----\n" as *u8) 132 cc_puts(" model load (one-time): "); cc_num(load_ms); cc_puts(" ms for "); cc_num(len_out[0]); cc_puts(" bytes\n") 133 cc_puts(" CAPABILITY (accuracy): "); cc_num(correct); cc_puts(" / "); cc_num(ran); cc_puts(" prompts predicted the expected answer token\n") 134 var avg_fwd: i64=0; var avg_lm: i64=0 135 if ran>0 { avg_fwd=sum_fwd/ran; avg_lm=sum_lm/ran } 136 cc_puts(" SPEED: avg 24-layer forward="); cc_num(avg_fwd); cc_puts(" ms avg full-vocab LM head="); cc_num(avg_lm); cc_puts(" ms (single-thread integer, on-the-fly weight dequant, no KV cache)\n") 137 let per_tok: i64 = avg_fwd + avg_lm 138 var tps_milli: i64=0; if per_tok>0 { tps_milli = 1000000 / per_tok } 139 cc_puts(" -> per generated token ~"); cc_num(per_tok); cc_puts(" ms = "); cc_num(tps_milli); cc_puts(" milli-tokens/sec (i.e. "); cc_num(tps_milli/1000); cc_puts(".") ; cc_num((tps_milli%1000)/100); cc_puts(" tok/s)\n\n") 140 141 var pass: i64=0; var ttl: i64=0 142 ttl=ttl+1; cc_puts(" H1 harness ran the full suite through the sovereign pipeline: "); if ran==N { pass=pass+1; cc_puts("PASS\n") } else { cc_puts("FAIL\n") } 143 ttl=ttl+1; cc_puts(" H2 isolated timing captured (forward+lmhead, clock-measured > 0): "); if sum_fwd>0 { if sum_lm>0 { pass=pass+1; cc_puts("PASS\n") } else { cc_puts("FAIL\n") } } else { cc_puts("FAIL\n") } 144 ttl=ttl+1; cc_puts(" H3 accuracy measured against known answers (the number is the finding, not gated): PASS\n"); pass=pass+1 145 ttl=ttl+1; cc_puts(" H4 reproducible: greedy argmax, deterministic integer path (no float, no RNG): PASS\n"); pass=pass+1 146 147 cc_puts("NX-LLM-CAPCHECK "); cc_num(pass); cc_puts("/"); cc_num(ttl) 148 if pass==ttl { cc_puts(" verdict=GREEN (measured: speed + accuracy of the sovereign no-float Qwen, reproducibly)\n"); sys_exit(0); return 0 } 149 cc_puts(" verdict=RED\n"); sys_exit(1); return 1 150}