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}