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}