code wiki / (root) / nx_f32_bpe_load_test.nx

nx_f32_bpe_load_test.nx source

↩ module page · 124 lines · 4909 B

1// nx_f32_bpe_load_test.nx -- smoke for nx_f32_bpe_load.nx. 2// 3// Builds a synthetic GGUF with tokenizer.ggml.tokens and 4// tokenizer.ggml.merges arrays. Verifies the loader populates 5// the vocab + merge rules. 6 7import "nx_syscalls.nx" 8import "nx_tier.nx" 9import "nx_le.nx" 10import "nx_intern.nx" 11import "nx_bpe.nx" 12import "nx_gguf.nx" 13import "nx_gguf_load.nx" 14import "nx_gguf_meta.nx" 15import "nx_f32_bpe_load.nx" 16 17func _write_str_at(buf: *u8, p_in: i64, s: *u8, s_len: i64) -> i64 { 18 var p: i64 = p_in 19 nx_le_write_u64(buf, p, s_len); p = p + 8 20 var i: i64 = 0 21 while i < s_len { buf[p + i] = s[i]; i = i + 1 } 22 return p + s_len 23} 24 25func main() -> i64 { 26 var vi: nx_int = 0 27 while vi < NX_FBL_N_VERDICTS { 28 if nx_fbl_verdict_is_valid(vi) != 1 { return 5 + vi } 29 vi = vi + 1 30 } 31 32 let buf: *u8 = sys_mmap(2048) 33 buf[0]=0x47 as u8; buf[1]=0x47 as u8; buf[2]=0x55 as u8; buf[3]=0x46 as u8 34 nx_le_write_u32(buf, 4, 3) 35 nx_le_write_u64(buf, 8, 0) // 0 tensors 36 nx_le_write_u64(buf, 16, 2) // 2 metadata entries 37 38 var p: i64 = 24 39 40 // ===== Entry 1: tokenizer.ggml.tokens = ["a", "b", "c", "ab", "cb"] ===== 41 let k_tok: *u8 = sys_mmap(21) 42 k_tok[0]=0x74 as u8; k_tok[1]=0x6f as u8; k_tok[2]=0x6b as u8; k_tok[3]=0x65 as u8 43 k_tok[4]=0x6e as u8; k_tok[5]=0x69 as u8; k_tok[6]=0x7a as u8; k_tok[7]=0x65 as u8 44 k_tok[8]=0x72 as u8; k_tok[9]=0x2e as u8; k_tok[10]=0x67 as u8; k_tok[11]=0x67 as u8 45 k_tok[12]=0x6d as u8; k_tok[13]=0x6c as u8; k_tok[14]=0x2e as u8; k_tok[15]=0x74 as u8 46 k_tok[16]=0x6f as u8; k_tok[17]=0x6b as u8; k_tok[18]=0x65 as u8; k_tok[19]=0x6e as u8 47 k_tok[20]=0x73 as u8 48 49 nx_le_write_u64(buf, p, 21); p = p + 8 50 var ki: i64 = 0 51 while ki < 21 { buf[p + ki] = k_tok[ki]; ki = ki + 1 } 52 p = p + 21 53 nx_le_write_u32(buf, p, NX_GGUF_TYPE_ARRAY); p = p + 4 54 nx_le_write_u32(buf, p, NX_GGUF_TYPE_STRING); p = p + 4 // inner type 55 nx_le_write_u64(buf, p, 5); p = p + 8 // count 56 57 let sa: *u8 = sys_mmap(1); sa[0] = 0x61 as u8 58 let sb: *u8 = sys_mmap(1); sb[0] = 0x62 as u8 59 let sc: *u8 = sys_mmap(1); sc[0] = 0x63 as u8 60 let sab: *u8 = sys_mmap(2); sab[0] = 0x61 as u8; sab[1] = 0x62 as u8 61 let scb: *u8 = sys_mmap(2); scb[0] = 0x63 as u8; scb[1] = 0x62 as u8 62 63 p = _write_str_at(buf, p, sa, 1) 64 p = _write_str_at(buf, p, sb, 1) 65 p = _write_str_at(buf, p, sc, 1) 66 p = _write_str_at(buf, p, sab, 2) 67 p = _write_str_at(buf, p, scb, 2) 68 69 // ===== Entry 2: tokenizer.ggml.merges = ["a b", "c b"] ===== 70 let k_mrg: *u8 = sys_mmap(21) 71 k_mrg[0]=0x74 as u8; k_mrg[1]=0x6f as u8; k_mrg[2]=0x6b as u8; k_mrg[3]=0x65 as u8 72 k_mrg[4]=0x6e as u8; k_mrg[5]=0x69 as u8; k_mrg[6]=0x7a as u8; k_mrg[7]=0x65 as u8 73 k_mrg[8]=0x72 as u8; k_mrg[9]=0x2e as u8; k_mrg[10]=0x67 as u8; k_mrg[11]=0x67 as u8 74 k_mrg[12]=0x6d as u8; k_mrg[13]=0x6c as u8; k_mrg[14]=0x2e as u8; k_mrg[15]=0x6d as u8 75 k_mrg[16]=0x65 as u8; k_mrg[17]=0x72 as u8; k_mrg[18]=0x67 as u8; k_mrg[19]=0x65 as u8 76 k_mrg[20]=0x73 as u8 77 78 nx_le_write_u64(buf, p, 21); p = p + 8 79 var ki2: i64 = 0 80 while ki2 < 21 { buf[p + ki2] = k_mrg[ki2]; ki2 = ki2 + 1 } 81 p = p + 21 82 nx_le_write_u32(buf, p, NX_GGUF_TYPE_ARRAY); p = p + 4 83 nx_le_write_u32(buf, p, NX_GGUF_TYPE_STRING); p = p + 4 84 nx_le_write_u64(buf, p, 2); p = p + 8 85 86 let m_ab: *u8 = sys_mmap(3); m_ab[0]=0x61 as u8; m_ab[1]=0x20 as u8; m_ab[2]=0x62 as u8 87 let m_cb: *u8 = sys_mmap(3); m_cb[0]=0x63 as u8; m_cb[1]=0x20 as u8; m_cb[2]=0x62 as u8 88 p = _write_str_at(buf, p, m_ab, 3) 89 p = _write_str_at(buf, p, m_cb, 3) 90 91 // ===== Parse + load ===== 92 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader 93 let v_p: nx_int = nx_gguf_parse(buf, 2048, hdr) 94 if v_p != NX_GGUF_OK { return 20 + v_p } 95 96 let vocab: *NxBpeVocab = nx_bpe_vocab_new(4096, 1024, 16) 97 let n_tok_out: *i64 = sys_mmap(8) as *i64 98 let n_mrg_out: *i64 = sys_mmap(8) as *i64 99 let out_err: *i64 = sys_mmap(8) as *i64 100 101 let v: nx_int = nx_f32_bpe_load_from_gguf(buf, 2048, hdr, vocab, 102 n_tok_out, n_mrg_out, out_err) 103 if v != NX_FBL_OK { return 30 + v } 104 105 if n_tok_out[0] != 5 { return 50 } 106 if n_mrg_out[0] != 2 { return 51 } 107 108 // Verify tokens were interned: lookup should return same ids. 109 let id_a: i64 = nx_bpe_add_token(vocab, sa, 1) 110 let id_b: i64 = nx_bpe_add_token(vocab, sb, 1) 111 let id_c: i64 = nx_bpe_add_token(vocab, sc, 1) 112 let id_ab: i64 = nx_bpe_add_token(vocab, sab, 2) 113 let id_cb: i64 = nx_bpe_add_token(vocab, scb, 2) 114 if id_a != 0 { return 60 } 115 if id_b != 1 { return 61 } 116 if id_c != 2 { return 62 } 117 if id_ab != 3 { return 63 } 118 if id_cb != 4 { return 64 } 119 120 // Verify merge rules registered. 121 if vocab.n_merges != 2 { return 70 } 122 123 return 0 124}