code wiki / _hdl_build / nx_vram_budget_test.nx
nx_vram_budget_test.nx source
↩ module page · 60 lines · 4076 B
1// nx_vram_budget_test.nx -- the team REASONS about VRAM: a real 7B model on the operator's 16GB
2// RTX 5080. Proves the investigation's core finding: fp16 does NOT fit, but accounting for ALL
3// components and reducing each under the quality floor (weights Q4 + KV Q8) fits with huge headroom
4// -- which BUYS much longer context (improving functionality, not just shrinking memory). Exit 0
5// only if all hold. license_tier: ORIGINAL
6
7import "nx_vram_budget.nx"
8import "nx_syscalls.nx"
9
10func vt_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func vt_num(v: i64) -> i64 { let bb: *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;k=1}; while m>0 {t[k]=48+(m%10); m=m/10; k=k+1}; var i: i64=0; while i<k {bb[i]=t[k-1-i]; i=i+1}; sys_write(1, bb, k); return 0 }
12
13func main() -> i64 {
14 vt_puts("=== VRAM investigation: 7B on a 16GB RTX 5080 (rule #21 made executable) ===\n" as *u8)
15 let P: i64 = 7000 // 7B params (millions)
16 let L: i64 = 32; let H: i64 = 32; let HD: i64 = 128
17 let SEQ: i64 = 4096; let BAT: i64 = 1
18 let ACT: i64 = 1000; let OVH: i64 = 15
19 let BUD: i64 = VRAM_RTX5080_GB
20 let FLOOR: i64 = 20
21
22 // component breakdown at fp16 (the baseline)
23 let w16: i64 = vram_weights_mb(P, 16)
24 let kv16: i64 = vram_kv_mb(L, H, HD, SEQ, BAT, 16)
25 let fp16_total: i64 = vram_config_mb(P, L, H, HD, SEQ, BAT, ACT, OVH, 16, 16)
26 vt_puts(" fp16: weights=" as *u8); vt_num(w16); vt_puts("MB KV@4096=" as *u8); vt_num(kv16); vt_puts("MB total=" as *u8); vt_num(fp16_total)
27 vt_puts("MB fits16GB=" as *u8); vt_num(vram_fits(fp16_total, BUD)); vt_puts("\n" as *u8)
28
29 // the reducer: minimal footprint that meets the quality floor
30 let out: *i64 = sys_mmap(8 * 8) as *i64
31 let found: i64 = vram_best_config(P, L, H, HD, SEQ, BAT, ACT, OVH, BUD, FLOOR, out)
32 vt_puts(" best config: weights=" as *u8); vt_num(out[0]); vt_puts("-bit KV=" as *u8); vt_num(out[1])
33 vt_puts("-bit total=" as *u8); vt_num(out[2]); vt_puts("MB quality-loss=" as *u8); vt_num(out[3]); vt_puts(" permil\n" as *u8)
34
35 // headroom -> how much context the freed VRAM buys at the chosen config (improving functionality)
36 let avail_kv: i64 = (BUD * 1000) * 100 / (100 + OVH) - vram_weights_mb(P, out[0]) - ACT
37 let kv_at_seq: i64 = vram_kv_mb(L, H, HD, SEQ, BAT, out[1])
38 var maxctx: i64 = 0
39 if kv_at_seq > 0 { maxctx = (SEQ * avail_kv) / kv_at_seq }
40 vt_puts(" headroom -> max context at this config ~ " as *u8); vt_num(maxctx); vt_puts(" tokens (vs 4096 baseline)\n" as *u8)
41
42 // GQA lever: kv_heads 32 -> 8 cuts KV 4x (architectural, compounds with KV-quant)
43 let kv_mha: i64 = vram_kv_mb(L, 32, HD, SEQ, BAT, 16)
44 let kv_gqa: i64 = vram_kv_mb(L, 8, HD, SEQ, BAT, 16)
45 vt_puts(" GQA: KV 32-head=" as *u8); vt_num(kv_mha); vt_puts("MB 8-head=" as *u8); vt_num(kv_gqa); vt_puts("MB (4x less)\n" as *u8)
46
47 let r: *i64 = sys_mmap(8*8) as *i64
48 r[0] = 0; if vram_fits(fp16_total, BUD) == 0 { r[0] = 1 } // fp16 does NOT fit
49 r[1] = 0; if found == 1 { if out[0] == 4 { if out[1] == 8 { r[1] = 1 } } } // reducer picks Q4 weights + Q8 KV
50 r[2] = 0; if vram_fits(out[2], BUD) == 1 { if out[2] * 2 < fp16_total { r[2] = 1 } } // fits + >=2x smaller
51 r[3] = 0; if out[3] <= FLOOR { r[3] = 1 } // meets the quality floor
52 r[4] = 0; if maxctx >= 4096 * 4 { r[4] = 1 } // buys >=4x longer context
53 r[5] = 0; if kv_gqa * 4 <= kv_mha + 8 { if kv_gqa * 4 >= kv_mha - 8 { r[5] = 1 } } // GQA ~4x
54
55 var pass: i64 = 0; var i: i64 = 0
56 while i < 6 { pass = pass + r[i]; i = i + 1 }
57 vt_puts("----\n passed " as *u8); vt_num(pass); vt_puts("/6\n" as *u8)
58 if pass == 6 { vt_puts(" INVESTIGATED: fp16 overflows 16GB; Q4 weights + Q8 KV fits with headroom for ~4x+ context, within floor.\n" as *u8); sys_exit(0); return 0 }
59 vt_puts(" FAIL\n" as *u8); sys_exit(1); return 1
60}