code wiki / (root) / nx_gen_blockbench.nx

nx_gen_blockbench.nx source

↩ module page · 236 lines · 10339 B

1// nx_gen_blockbench.nx -- SOVEREIGN runner for the whole gen verification suite. NO SHELL. 2// 3// Walks a complete DiT block op by op, running each verifier organ and reporting a table. 4// This replaces the _block.sh / _suite.sh scaffolding: the suite definition, the argument 5// vectors, the process spawning and the scoring all live in one NishiLang organ. The only 6// third-party thing left in the loop was /bin/sh, and a sovereign stack that needs a POSIX 7// shell to prove it works has not finished the job. 8// 9// Usage: nx_gen_blockbench <model_id> [elf_dir] 10// 11// Spawns each organ with sys_fork + sys_execve and collects its exit code -- the same fork/exec 12// primitives the estate already uses for its worker pools. It does NOT re-implement the checks: 13// each organ stays independently runnable, so a single failing op can still be re-run alone with 14// the exact arguments printed here. 15// 16// THE CHAIN (Z-Image block 0; every step's reference is an oracle dump from stable-diffusion.cpp): 17// blk_in -[prenorm+mod ch0]- h_attn -[qkv]- qkv -[qk-norm]- q/k -[RoPE]- -[SDPA]- ao_pre 18// -[out proj]- attn_out -[rmsnorm]- attn_norm2 -[gate ch1]- mid 19// -[prenorm+mod ch2]- h_ffn -[w1][w3]- -[swiglu]- ffn_act 20// -[w2]- ffn_down -[rmsnorm]- ffn_norm2 -[gate ch3]- layers.1.blk_in 21// license_tier: ORIGINAL 22 23import "nx_syscalls.nx" 24import "nx_strconv.nx" 25 26const NX_BB_MAX_ARGS: i64 = 16 27 28func bb_puts(s: *u8) -> i64 { 29 var n: i64 = 0 30 while s[n] != (0 as u8) { n = n + 1 } 31 return sys_write(1, s, n) 32} 33 34func bb_num(v: i64) -> i64 { 35 let b: *u8 = sys_mmap(32) 36 let n: i64 = nx_strconv_format_i64(v, b) 37 return sys_write(1, b, n) 38} 39 40func bb_pad(s: *u8, width: i64) -> i64 { 41 var n: i64 = 0 42 while s[n] != (0 as u8) { n = n + 1 } 43 sys_write(1, s, n) 44 var i: i64 = n 45 while i < width { sys_write(1, " " as *u8, 1); i = i + 1 } 46 return 0 47} 48 49// Join <dir>/<organ>.sov.elf 50func bb_elf_path(dir: *u8, organ: *u8) -> *u8 { 51 let p: *u8 = sys_mmap(512) 52 var o: i64 = 0 53 var i: i64 = 0 54 while dir[i] != (0 as u8) { p[o] = dir[i]; o = o + 1; i = i + 1 } 55 if o > 0 { if p[o - 1] != (0x2F as u8) { p[o] = 0x2F; o = o + 1 } } 56 i = 0 57 while organ[i] != (0 as u8) { p[o] = organ[i]; o = o + 1; i = i + 1 } 58 let suf: *u8 = ".sov.elf" as *u8 59 i = 0 60 while suf[i] != (0 as u8) { p[o] = suf[i]; o = o + 1; i = i + 1 } 61 p[o] = 0 62 return p 63} 64 65// Run one verifier. argv_tail is a NULL-terminated array of *u8 (the organ's args after argv[0]). 66// Returns the child's exit code, or a large sentinel if the spawn itself failed. 67func bb_run(elf: *u8, argv_tail: *i64) -> i64 { 68 let argv: *i64 = sys_mmap(NX_BB_MAX_ARGS * 8) as *i64 69 argv[0] = elf as i64 70 var n: i64 = 0 71 while argv_tail[n] != 0 { 72 argv[n + 1] = argv_tail[n] 73 n = n + 1 74 if n >= NX_BB_MAX_ARGS - 2 { argv_tail[n] = 0 } 75 } 76 argv[n + 1] = 0 77 let envp: *i64 = sys_mmap(16) as *i64 78 envp[0] = 0 79 80 let pid: i64 = sys_fork() 81 if pid == 0 { 82 // Child stdout is inherited; each organ prints its own measurement lines, which is what 83 // makes a RED row diagnosable without re-running anything. 84 sys_execve(elf, argv, envp) 85 sys_exit(127) // only reached if execve failed 86 } 87 let st: *i64 = sys_mmap(64) as *i64 88 st[0] = 0 89 sys_wait4(pid, st, 0) 90 return wait_exit_code(st[0]) 91} 92 93func bb_args(a0: *u8, a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8, a6: *u8, a7: *u8, a8: *u8) -> *i64 { 94 let v: *i64 = sys_mmap(NX_BB_MAX_ARGS * 8) as *i64 95 var n: i64 = 0 96 if (a0 as i64) != 0 { v[n] = a0 as i64; n = n + 1 } 97 if (a1 as i64) != 0 { v[n] = a1 as i64; n = n + 1 } 98 if (a2 as i64) != 0 { v[n] = a2 as i64; n = n + 1 } 99 if (a3 as i64) != 0 { v[n] = a3 as i64; n = n + 1 } 100 if (a4 as i64) != 0 { v[n] = a4 as i64; n = n + 1 } 101 if (a5 as i64) != 0 { v[n] = a5 as i64; n = n + 1 } 102 if (a6 as i64) != 0 { v[n] = a6 as i64; n = n + 1 } 103 if (a7 as i64) != 0 { v[n] = a7 as i64; n = n + 1 } 104 if (a8 as i64) != 0 { v[n] = a8 as i64; n = n + 1 } 105 v[n] = 0 106 return v 107} 108 109static g_pass: i64 110static g_fail: i64 111 112func bb_step(label: *u8, dir: *u8, organ: *u8, args: *i64) -> i64 { 113 bb_puts("--- " as *u8) 114 bb_pad(label, 40) 115 let rc: i64 = bb_run(bb_elf_path(dir, organ), args) 116 if rc == 0 { 117 g_pass = g_pass + 1 118 bb_puts(" GREEN\n" as *u8) 119 } else { 120 g_fail = g_fail + 1 121 bb_puts(" RED rc=" as *u8) 122 bb_num(rc) 123 bb_puts("\n" as *u8) 124 } 125 return rc 126} 127 128func main(argc: i64, argv: *i64) -> i64 { 129 if argc < 2 { 130 bb_puts("usage: nx_gen_blockbench <model_id> [elf_dir]\n" as *u8) 131 return 2 132 } 133 let M: *u8 = argv[1] as *u8 134 var dir: *u8 = "/mnt/c/Users/elder/nishi-fixtures" as *u8 135 if argc >= 3 { dir = argv[2] as *u8 } 136 137 g_pass = 0 138 g_fail = 0 139 140 let L: *u8 = "layers.0" as *u8 141 let NIL: *u8 = 0 as *u8 142 143 // tensor names 144 let blk_in: *u8 = "layers.0.blk_in" as *u8 145 let adaln: *u8 = "layers.0.adaln_m" as *u8 146 let h_attn: *u8 = "layers.0.h_attn" as *u8 147 let qkv: *u8 = "layers.0.qkv" as *u8 148 let qkv_ex: *u8 = "layers.0.qkv.exact" as *u8 149 let q_qkn: *u8 = "layers.0.q_qknorm" as *u8 150 let k_qkn: *u8 = "layers.0.k_qknorm" as *u8 151 let q_rope: *u8 = "layers.0.q_rope" as *u8 152 let k_rope: *u8 = "layers.0.k_rope" as *u8 153 let pe: *u8 = "pe" as *u8 154 let ao_pre: *u8 = "layers.0.ao_pre" as *u8 155 let ao_ex: *u8 = "layers.0.attn_out.exact" as *u8 156 let attn_out: *u8 = "layers.0.attn_out" as *u8 157 let an2: *u8 = "layers.0.attn_norm2" as *u8 158 let mid: *u8 = "layers.0.mid" as *u8 159 let h_ffn: *u8 = "layers.0.h_ffn" as *u8 160 let w1_ex: *u8 = "layers.0.ffn_w1.exact" as *u8 161 let w3_ex: *u8 = "layers.0.ffn_w3.exact" as *u8 162 let act: *u8 = "layers.0.ffn_act" as *u8 163 let down_ex: *u8 = "layers.0.ffn_down.exact" as *u8 164 let ffn_down: *u8 = "layers.0.ffn_down" as *u8 165 let fn2: *u8 = "layers.0.ffn_norm2" as *u8 166 let blk_out: *u8 = "layers.1.blk_in" as *u8 167 168 // weights (checkpoint names) 169 let W_n1: *u8 = "model.diffusion_model.layers.0.attention_norm1.weight" as *u8 170 let W_n2: *u8 = "model.diffusion_model.layers.0.attention_norm2.weight" as *u8 171 let W_qkv: *u8 = "model.diffusion_model.layers.0.attention.qkv.weight" as *u8 172 let W_out: *u8 = "model.diffusion_model.layers.0.attention.out.weight" as *u8 173 let W_qn: *u8 = "model.diffusion_model.layers.0.attention.q_norm.weight" as *u8 174 let W_kn: *u8 = "model.diffusion_model.layers.0.attention.k_norm.weight" as *u8 175 let W_f1: *u8 = "model.diffusion_model.layers.0.ffn_norm1.weight" as *u8 176 let W_f2: *u8 = "model.diffusion_model.layers.0.ffn_norm2.weight" as *u8 177 let W_w1: *u8 = "model.diffusion_model.layers.0.feed_forward.w1.weight" as *u8 178 let W_w2: *u8 = "model.diffusion_model.layers.0.feed_forward.w2.weight" as *u8 179 let W_w3: *u8 = "model.diffusion_model.layers.0.feed_forward.w3.weight" as *u8 180 181 let O_pnm: *u8 = "nx_gen_prenorm_mod_verify" as *u8 182 let O_lin: *u8 = "nx_gen_linear_verify" as *u8 183 let O_qkn: *u8 = "nx_gen_qknorm_verify" as *u8 184 let O_rop: *u8 = "nx_gen_rope_verify" as *u8 185 let O_sdp: *u8 = "nx_gen_sdpa_verify" as *u8 186 let O_rms: *u8 = "nx_gen_rmsnorm_verify" as *u8 187 let O_gat: *u8 = "nx_gen_adaln_gate_verify" as *u8 188 let O_swi: *u8 = "nx_gen_swiglu_verify" as *u8 189 190 bb_puts("=== SOVEREIGN GEN BLOCKBENCH -- model " as *u8) 191 bb_puts(M) 192 bb_puts(" (no shell; fork+execve) ===\n" as *u8) 193 194 bb_step("01 prenorm+mod attn (scale=chunk0)" as *u8, dir, O_pnm, 195 bb_args(M, blk_in, W_n1, adaln, "4" as *u8, "0" as *u8, h_attn, "4" as *u8, NIL)) 196 bb_step("02 qkv projection" as *u8, dir, O_lin, 197 bb_args(M, h_attn, W_qkv, qkv_ex, "4" as *u8, "4" as *u8, "13" as *u8, "16" as *u8, NIL)) 198 bb_step("03 qk-norm Q" as *u8, dir, O_qkn, 199 bb_args(M, qkv, W_qn, q_qkn, "128" as *u8, "30" as *u8, "0" as *u8, "4" as *u8, NIL)) 200 bb_step("04 qk-norm K" as *u8, dir, O_qkn, 201 bb_args(M, qkv, W_kn, k_qkn, "128" as *u8, "30" as *u8, "30" as *u8, "4" as *u8, NIL)) 202 bb_step("05 RoPE Q" as *u8, dir, O_rop, 203 bb_args(M, q_qkn, pe, q_rope, "128" as *u8, "30" as *u8, "4" as *u8, NIL, NIL)) 204 bb_step("06 RoPE K" as *u8, dir, O_rop, 205 bb_args(M, k_qkn, pe, k_rope, "128" as *u8, "30" as *u8, "4" as *u8, NIL, NIL)) 206 bb_step("07 SDPA (softmax attention)" as *u8, dir, O_sdp, 207 bb_args(M, q_rope, k_rope, qkv, ao_pre, "128" as *u8, "30" as *u8, "60" as *u8, "2" as *u8)) 208 bb_step("08 out projection" as *u8, dir, O_lin, 209 bb_args(M, ao_pre, W_out, ao_ex, "4" as *u8, "3" as *u8, "13" as *u8, "16" as *u8, NIL)) 210 bb_step("09 rmsnorm attn_norm2" as *u8, dir, O_rms, 211 bb_args(M, attn_out, W_n2, an2, "4" as *u8, NIL, NIL, NIL, NIL)) 212 bb_step("10 gate+residual msa (chunk1)" as *u8, dir, O_gat, 213 bb_args(M, an2, adaln, "4" as *u8, "1" as *u8, blk_in, mid, "4" as *u8, NIL)) 214 bb_step("11 prenorm+mod ffn (scale=chunk2)" as *u8, dir, O_pnm, 215 bb_args(M, mid, W_f1, adaln, "4" as *u8, "2" as *u8, h_ffn, "4" as *u8, NIL)) 216 bb_step("12 ffn w1 projection" as *u8, dir, O_lin, 217 bb_args(M, h_ffn, W_w1, w1_ex, "4" as *u8, "3" as *u8, "13" as *u8, "16" as *u8, NIL)) 218 bb_step("13 ffn w3 projection" as *u8, dir, O_lin, 219 bb_args(M, h_ffn, W_w3, w3_ex, "4" as *u8, "3" as *u8, "13" as *u8, "16" as *u8, NIL)) 220 bb_step("14 swiglu activation" as *u8, dir, O_swi, 221 bb_args(M, L, NIL, NIL, NIL, NIL, NIL, NIL, NIL)) 222 bb_step("15 ffn down projection" as *u8, dir, O_lin, 223 bb_args(M, act, W_w2, down_ex, "4" as *u8, "3" as *u8, "13" as *u8, "16" as *u8, NIL)) 224 bb_step("16 rmsnorm ffn_norm2" as *u8, dir, O_rms, 225 bb_args(M, ffn_down, W_f2, fn2, "4" as *u8, NIL, NIL, NIL, NIL)) 226 bb_step("17 gate+residual mlp (chunk3)" as *u8, dir, O_gat, 227 bb_args(M, fn2, adaln, "4" as *u8, "3" as *u8, mid, blk_out, "4" as *u8, NIL)) 228 229 bb_puts("=== BLOCKBENCH: " as *u8) 230 bb_num(g_pass) 231 bb_puts(" GREEN / " as *u8) 232 bb_num(g_fail) 233 bb_puts(" RED ===\n" as *u8) 234 if g_fail != 0 { return 1 } 235 return 0 236}