Download native/src/main.rs from programador-powershell/VBL-32M-Utility: direct link, hf CLI and curl.
- Browser
- Download file 31.7 kB
-
https://huggingface.co/programador-powershell/VBL-32M-Utility/resolve/main/native/src/main.rs
- Command line
-
hf download hf://programador-powershell/VBL-32M-Utility/native/src/main.rs
-
curl -L -o main.rs https://huggingface.co/programador-powershell/VBL-32M-Utility/resolve/main/native/src/main.rs
31.7 kB
| use anyhow::{anyhow, bail, Context, Result}; | |
| use rayon::prelude::*; | |
| use regex::Regex; | |
| use safetensors::tensor::{Dtype, SafeTensors}; | |
| use serde::Deserialize; | |
| use std::collections::HashMap; | |
| use std::fs; | |
| use std::io::Write; | |
| use std::path::{Path, PathBuf}; | |
| const DIM: usize = 320; | |
| const HEADS: usize = 5; | |
| const KV_HEADS: usize = 1; | |
| const HEAD_DIM: usize = 64; | |
| const FFN: usize = 1024; | |
| const MOD_RANK: usize = 40; | |
| const RECURRENCE: usize = 2; | |
| const EXPERTS: usize = 73; | |
| const EXPERT_RANK: usize = 256; | |
| const TOPK: usize = 3; | |
| const VOCAB: usize = 24000; | |
| struct NativeConfig { | |
| format: String, | |
| parameters: usize, | |
| base_parameters: usize, | |
| growth_parameters: usize, | |
| context_length: usize, | |
| rope_theta: f32, | |
| rms_epsilon: f32, | |
| selected_alpha: f32, | |
| rope_mode: String, | |
| resident_policy: String, | |
| c1_passed: usize, | |
| c1_total: usize, | |
| } | |
| struct Tensor { | |
| shape: Vec<usize>, | |
| data: Vec<f32>, | |
| } | |
| struct TensorStore { | |
| tensors: HashMap<String, Tensor>, | |
| bytes: usize, | |
| } | |
| impl TensorStore { | |
| fn load_full_ram(path: &Path) -> Result<Self> { | |
| // Deliberately NOT mmaped: read the entire safetensors file into process RAM, | |
| // materialize every f32 tensor into owned Vec<f32>, then drop the file bytes. | |
| let raw = fs::read(path).with_context(|| format!("read {}", path.display()))?; | |
| let st = SafeTensors::deserialize(&raw)?; | |
| let mut tensors = HashMap::new(); | |
| let mut total = 0usize; | |
| for (name, view) in st.iter() { | |
| if view.dtype() != Dtype::F32 { | |
| bail!("tensor {name} is {:?}, native runtime requires F32", view.dtype()); | |
| } | |
| let bytes = view.data(); | |
| if bytes.len() % 4 != 0 { | |
| bail!("tensor {name} byte length is not divisible by 4"); | |
| } | |
| let mut data = Vec::<f32>::with_capacity(bytes.len() / 4); | |
| for c in bytes.chunks_exact(4) { | |
| data.push(f32::from_le_bytes([c[0], c[1], c[2], c[3]])); | |
| } | |
| total += data.len() * 4; | |
| tensors.insert( | |
| name.to_string(), | |
| Tensor { | |
| shape: view.shape().to_vec(), | |
| data, | |
| }, | |
| ); | |
| } | |
| drop(st); | |
| drop(raw); | |
| Ok(Self { | |
| tensors, | |
| bytes: total, | |
| }) | |
| } | |
| fn get(&self, name: &str) -> Result<&Tensor> { | |
| self.tensors | |
| .get(name) | |
| .ok_or_else(|| anyhow!("missing tensor {name}")) | |
| } | |
| fn scalar(&self, name: &str) -> Result<f32> { | |
| let t = self.get(name)?; | |
| if t.data.len() != 1 { | |
| bail!("{name} is not scalar"); | |
| } | |
| Ok(t.data[0]) | |
| } | |
| } | |
| struct Matrix { | |
| rows: usize, | |
| cols: usize, | |
| data: Vec<f32>, | |
| } | |
| impl Matrix { | |
| fn zeros(rows: usize, cols: usize) -> Self { | |
| Self { | |
| rows, | |
| cols, | |
| data: vec![0.0; rows * cols], | |
| } | |
| } | |
| fn row(&self, r: usize) -> &[f32] { | |
| &self.data[r * self.cols..(r + 1) * self.cols] | |
| } | |
| fn row_mut(&mut self, r: usize) -> &mut [f32] { | |
| &mut self.data[r * self.cols..(r + 1) * self.cols] | |
| } | |
| fn add(&self, rhs: &Matrix) -> Result<Matrix> { | |
| if self.rows != rhs.rows || self.cols != rhs.cols { | |
| bail!("matrix add shape mismatch"); | |
| } | |
| let mut out = self.clone(); | |
| out.data | |
| .par_iter_mut() | |
| .zip(rhs.data.par_iter()) | |
| .for_each(|(a, b)| *a += *b); | |
| Ok(out) | |
| } | |
| } | |
| fn dot_scalar(a: &[f32], b: &[f32]) -> f32 { | |
| a.iter().zip(b.iter()).map(|(x, y)| x * y).sum() | |
| } | |
| unsafe fn dot_avx2(a: &[f32], b: &[f32]) -> f32 { | |
| use std::arch::x86_64::*; | |
| let mut acc = _mm256_setzero_ps(); | |
| let mut i = 0usize; | |
| while i + 8 <= a.len() { | |
| let va = _mm256_loadu_ps(a.as_ptr().add(i)); | |
| let vb = _mm256_loadu_ps(b.as_ptr().add(i)); | |
| acc = _mm256_fmadd_ps(va, vb, acc); | |
| i += 8; | |
| } | |
| let mut tmp = [0f32; 8]; | |
| _mm256_storeu_ps(tmp.as_mut_ptr(), acc); | |
| let mut sum: f32 = tmp.iter().sum(); | |
| while i < a.len() { | |
| sum += *a.get_unchecked(i) * *b.get_unchecked(i); | |
| i += 1; | |
| } | |
| sum | |
| } | |
| fn dot(a: &[f32], b: &[f32]) -> f32 { | |
| { | |
| if std::arch::is_x86_feature_detected!("avx2") | |
| && std::arch::is_x86_feature_detected!("fma") | |
| { | |
| return unsafe { dot_avx2(a, b) }; | |
| } | |
| } | |
| dot_scalar(a, b) | |
| } | |
| fn linear(x: &Matrix, w: &Tensor) -> Result<Matrix> { | |
| if w.shape.len() != 2 { | |
| bail!("linear weight is not rank-2: {:?}", w.shape); | |
| } | |
| let out_dim = w.shape[0]; | |
| let in_dim = w.shape[1]; | |
| if x.cols != in_dim { | |
| bail!( | |
| "linear input {} != weight in_dim {} shape={:?}", | |
| x.cols, | |
| in_dim, | |
| w.shape | |
| ); | |
| } | |
| let mut out = Matrix::zeros(x.rows, out_dim); | |
| out.data | |
| .par_chunks_mut(out_dim) | |
| .enumerate() | |
| .for_each(|(r, row_out)| { | |
| let xr = x.row(r); | |
| for o in 0..out_dim { | |
| let wr = &w.data[o * in_dim..(o + 1) * in_dim]; | |
| row_out[o] = dot(xr, wr); | |
| } | |
| }); | |
| Ok(out) | |
| } | |
| fn rms_norm(x: &Matrix, weight: &Tensor, eps: f32) -> Result<Matrix> { | |
| if weight.shape != vec![x.cols] { | |
| bail!("RMSNorm weight shape mismatch {:?} vs {}", weight.shape, x.cols); | |
| } | |
| let mut out = Matrix::zeros(x.rows, x.cols); | |
| out.data | |
| .par_chunks_mut(x.cols) | |
| .enumerate() | |
| .for_each(|(r, row_out)| { | |
| let row = x.row(r); | |
| let mean_sq = row.iter().map(|v| v * v).sum::<f32>() / x.cols as f32; | |
| let inv = 1.0 / (mean_sq + eps).sqrt(); | |
| for d in 0..x.cols { | |
| row_out[d] = row[d] * inv * weight.data[d]; | |
| } | |
| }); | |
| Ok(out) | |
| } | |
| fn silu(x: f32) -> f32 { | |
| x / (1.0 + (-x).exp()) | |
| } | |
| fn apply_rope( | |
| x: &mut Matrix, | |
| heads: usize, | |
| head_dim: usize, | |
| theta: f32, | |
| mode: &str, | |
| ) -> Result<()> { | |
| if x.cols != heads * head_dim || head_dim % 2 != 0 { | |
| bail!("invalid RoPE shape rows={} cols={}", x.rows, x.cols); | |
| } | |
| for pos in 0..x.rows { | |
| for h in 0..heads { | |
| let off = h * head_dim; | |
| let row = x.row_mut(pos); | |
| match mode { | |
| "interleaved" => { | |
| for i in 0..head_dim / 2 { | |
| let a = off + 2 * i; | |
| let b = a + 1; | |
| let inv = 1.0 / theta.powf((2 * i) as f32 / head_dim as f32); | |
| let angle = pos as f32 * inv; | |
| let c = angle.cos(); | |
| let s = angle.sin(); | |
| let x0 = row[a]; | |
| let x1 = row[b]; | |
| row[a] = x0 * c - x1 * s; | |
| row[b] = x0 * s + x1 * c; | |
| } | |
| } | |
| "half" => { | |
| let half = head_dim / 2; | |
| let original = row[off..off + head_dim].to_vec(); | |
| for i in 0..half { | |
| let inv = 1.0 / theta.powf((2 * i) as f32 / head_dim as f32); | |
| let angle = pos as f32 * inv; | |
| let c = angle.cos(); | |
| let s = angle.sin(); | |
| let a = original[i]; | |
| let b = original[i + half]; | |
| row[off + i] = a * c - b * s; | |
| row[off + i + half] = b * c + a * s; | |
| } | |
| } | |
| other => bail!("unknown rope_mode {other}"), | |
| } | |
| } | |
| } | |
| Ok(()) | |
| } | |
| fn softmax_in_place(v: &mut [f32]) { | |
| let m = v.iter().copied().fold(f32::NEG_INFINITY, f32::max); | |
| let mut s = 0.0f32; | |
| for x in v.iter_mut() { | |
| *x = (*x - m).exp(); | |
| s += *x; | |
| } | |
| if s > 0.0 { | |
| for x in v.iter_mut() { | |
| *x /= s; | |
| } | |
| } | |
| } | |
| struct VblModel { | |
| w: TensorStore, | |
| cfg: NativeConfig, | |
| } | |
| impl VblModel { | |
| fn load(root: &Path) -> Result<Self> { | |
| let cfg: NativeConfig = serde_json::from_slice( | |
| &fs::read(root.join("native_config.json"))? | |
| )?; | |
| if cfg.parameters != 31_974_240 { | |
| bail!("native_config parameter count mismatch"); | |
| } | |
| if cfg.resident_policy != "FULL_RAM_HEAP_NO_MMAP_NO_STREAMING" { | |
| bail!("release is not configured for full RAM residency"); | |
| } | |
| let w = TensorStore::load_full_ram(&root.join("model.safetensors"))?; | |
| let scalar_alpha = w.scalar("modulation.elastic_bank.alpha")?; | |
| if (scalar_alpha - cfg.selected_alpha).abs() > 1e-7 { | |
| bail!( | |
| "alpha mismatch state={} config={}", | |
| scalar_alpha, | |
| cfg.selected_alpha | |
| ); | |
| } | |
| Ok(Self { w, cfg }) | |
| } | |
| fn embedding(&self, ids: &[u32]) -> Result<Matrix> { | |
| let emb = self.w.get("embedding.weight")?; | |
| if emb.shape != vec![VOCAB, DIM] { | |
| bail!("embedding shape mismatch {:?}", emb.shape); | |
| } | |
| let mut x = Matrix::zeros(ids.len(), DIM); | |
| for (r, &id) in ids.iter().enumerate() { | |
| let i = id as usize; | |
| if i >= VOCAB { | |
| bail!("token id out of vocabulary: {i}"); | |
| } | |
| x.row_mut(r) | |
| .copy_from_slice(&emb.data[i * DIM..(i + 1) * DIM]); | |
| } | |
| Ok(x) | |
| } | |
| fn attention(&self, x: &Matrix, prefix: &str) -> Result<Matrix> { | |
| let mut q = linear(x, self.w.get(&format!("{prefix}.attn.q_proj.weight"))?)?; | |
| let mut k = linear(x, self.w.get(&format!("{prefix}.attn.k_proj.weight"))?)?; | |
| let v = linear(x, self.w.get(&format!("{prefix}.attn.v_proj.weight"))?)?; | |
| apply_rope( | |
| &mut q, | |
| HEADS, | |
| HEAD_DIM, | |
| self.cfg.rope_theta, | |
| &self.cfg.rope_mode, | |
| )?; | |
| apply_rope( | |
| &mut k, | |
| KV_HEADS, | |
| HEAD_DIM, | |
| self.cfg.rope_theta, | |
| &self.cfg.rope_mode, | |
| )?; | |
| let t = x.rows; | |
| let mut ctx = Matrix::zeros(t, DIM); | |
| let scale = 1.0 / (HEAD_DIM as f32).sqrt(); | |
| for i in 0..t { | |
| for h in 0..HEADS { | |
| let qoff = h * HEAD_DIM; | |
| let qr = &q.row(i)[qoff..qoff + HEAD_DIM]; | |
| let mut scores = vec![0.0f32; i + 1]; | |
| for j in 0..=i { | |
| let kr = &k.row(j)[0..HEAD_DIM]; | |
| scores[j] = dot(qr, kr) * scale; | |
| } | |
| softmax_in_place(&mut scores); | |
| for d in 0..HEAD_DIM { | |
| let mut acc = 0.0f32; | |
| for j in 0..=i { | |
| acc += scores[j] * v.row(j)[d]; | |
| } | |
| ctx.row_mut(i)[qoff + d] = acc; | |
| } | |
| } | |
| } | |
| linear(&ctx, self.w.get(&format!("{prefix}.attn.o_proj.weight"))?) | |
| } | |
| fn mlp(&self, x: &Matrix, prefix: &str) -> Result<Matrix> { | |
| let gate = linear(x, self.w.get(&format!("{prefix}.mlp.gate_proj.weight"))?)?; | |
| let up = linear(x, self.w.get(&format!("{prefix}.mlp.up_proj.weight"))?)?; | |
| if gate.rows != up.rows || gate.cols != FFN || up.cols != FFN { | |
| bail!("SwiGLU shape mismatch"); | |
| } | |
| let mut fused = Matrix::zeros(x.rows, FFN); | |
| fused | |
| .data | |
| .par_iter_mut() | |
| .enumerate() | |
| .for_each(|(i, o)| *o = silu(gate.data[i]) * up.data[i]); | |
| linear( | |
| &fused, | |
| self.w.get(&format!("{prefix}.mlp.down_proj.weight"))?, | |
| ) | |
| } | |
| fn block(&self, x: &Matrix, prefix: &str) -> Result<Matrix> { | |
| let n1 = rms_norm( | |
| x, | |
| self.w.get(&format!("{prefix}.attn_norm.weight"))?, | |
| self.cfg.rms_epsilon, | |
| )?; | |
| let a = self.attention(&n1, prefix)?; | |
| let r1 = x.add(&a)?; | |
| let n2 = rms_norm( | |
| &r1, | |
| self.w.get(&format!("{prefix}.mlp_norm.weight"))?, | |
| self.cfg.rms_epsilon, | |
| )?; | |
| let m = self.mlp(&n2, prefix)?; | |
| r1.add(&m) | |
| } | |
| fn modulation( | |
| &self, | |
| anchor: &Matrix, | |
| previous: &Matrix, | |
| recurrence: usize, | |
| ) -> Result<(Matrix, Matrix, Matrix)> { | |
| let na = rms_norm( | |
| anchor, | |
| self.w.get("modulation.norm.weight")?, | |
| self.cfg.rms_epsilon, | |
| )?; | |
| let np = rms_norm( | |
| previous, | |
| self.w.get("modulation.norm.weight")?, | |
| self.cfg.rms_epsilon, | |
| )?; | |
| let mut normalized = Matrix::zeros(anchor.rows, DIM); | |
| normalized | |
| .data | |
| .par_iter_mut() | |
| .enumerate() | |
| .for_each(|(i, o)| *o = 0.5 * (na.data[i] + np.data[i])); | |
| let mut z = linear(&normalized, self.w.get("modulation.down.weight")?)?; | |
| let re = self.w.get("modulation.recurrence_embeddings")?; | |
| if re.shape.len() != 2 || re.shape[1] != MOD_RANK || recurrence >= re.shape[0] { | |
| bail!("recurrence embedding shape mismatch {:?}", re.shape); | |
| } | |
| for r in 0..z.rows { | |
| for d in 0..MOD_RANK { | |
| let current = z.row(r)[d]; | |
| let value = silu(current + re.data[recurrence * MOD_RANK + d]); | |
| z.row_mut(r)[d] = value; | |
| } | |
| } | |
| let pair = linear(&z, self.w.get("modulation.up.weight")?)?; | |
| if pair.cols != DIM * 2 { | |
| bail!("modulation.up output must be 640"); | |
| } | |
| let mut gate = Matrix::zeros(pair.rows, DIM); | |
| let mut update = Matrix::zeros(pair.rows, DIM); | |
| for r in 0..pair.rows { | |
| gate.row_mut(r).copy_from_slice(&pair.row(r)[0..DIM]); | |
| update | |
| .row_mut(r) | |
| .copy_from_slice(&pair.row(r)[DIM..DIM * 2]); | |
| } | |
| Ok((normalized, gate, update)) | |
| } | |
| fn elastic(&self, source: &Matrix) -> Result<Matrix> { | |
| let alpha = self.cfg.selected_alpha; | |
| if alpha == 0.0 { | |
| return Ok(Matrix::zeros(source.rows, DIM)); | |
| } | |
| let mut out = Matrix::zeros(source.rows, DIM); | |
| // Router uses existing first row of each expert.down; it adds zero parameters. | |
| let mut router_norms = Vec::<Vec<f32>>::with_capacity(EXPERTS); | |
| for e in 0..EXPERTS { | |
| let down = self | |
| .w | |
| .get(&format!("modulation.elastic_bank.experts.{e}.down.weight"))?; | |
| if down.shape != vec![EXPERT_RANK, DIM] { | |
| bail!("expert {e} down shape mismatch {:?}", down.shape); | |
| } | |
| let row = &down.data[0..DIM]; | |
| let n = row.iter().map(|v| v * v).sum::<f32>().sqrt().max(1e-12); | |
| router_norms.push(row.iter().map(|v| *v / n).collect()); | |
| } | |
| for t in 0..source.rows { | |
| let h = source.row(t); | |
| let hn = h.iter().map(|v| v * v).sum::<f32>().sqrt().max(1e-12); | |
| let hnorm: Vec<f32> = h.iter().map(|v| *v / hn).collect(); | |
| let mut scored: Vec<(f32, usize)> = (0..EXPERTS) | |
| .map(|e| (4.0 * dot(&hnorm, &router_norms[e]), e)) | |
| .collect(); | |
| scored.sort_by(|a, b| b.0.total_cmp(&a.0)); | |
| let chosen = &scored[..TOPK]; | |
| let mut weights: Vec<f32> = chosen.iter().map(|x| x.0).collect(); | |
| softmax_in_place(&mut weights); | |
| let xin = Matrix { | |
| rows: 1, | |
| cols: DIM, | |
| data: h.to_vec(), | |
| }; | |
| for (slot, &(_, e)) in chosen.iter().enumerate() { | |
| let down = linear( | |
| &xin, | |
| self.w | |
| .get(&format!("modulation.elastic_bank.experts.{e}.down.weight"))?, | |
| )?; | |
| let mut act = down; | |
| for v in act.data.iter_mut() { | |
| *v = silu(*v); | |
| } | |
| let up = linear( | |
| &act, | |
| self.w | |
| .get(&format!("modulation.elastic_bank.experts.{e}.up.weight"))?, | |
| )?; | |
| for d in 0..DIM { | |
| out.row_mut(t)[d] += alpha * weights[slot] * up.data[d]; | |
| } | |
| } | |
| } | |
| Ok(out) | |
| } | |
| fn hidden(&self, ids: &[u32], trace: bool) -> Result<Matrix> { | |
| if ids.is_empty() { | |
| bail!("empty token sequence"); | |
| } | |
| if ids.len() > self.cfg.context_length { | |
| bail!( | |
| "context {} exceeds {}", | |
| ids.len(), | |
| self.cfg.context_length | |
| ); | |
| } | |
| let x = self.embedding(ids)?; | |
| let anchor = self.block(&x, "prelude")?; | |
| let latent_seed = self.w.get("modulation.latent_seed")?; | |
| if latent_seed.shape != vec![DIM] { | |
| bail!("latent_seed shape mismatch"); | |
| } | |
| let mut state = anchor.clone(); | |
| for r in 0..state.rows { | |
| for d in 0..DIM { | |
| state.row_mut(r)[d] += latent_seed.data[d]; | |
| } | |
| } | |
| for recurrence in 0..RECURRENCE { | |
| let previous = state.clone(); | |
| let (normalized, gate_logits, update) = | |
| self.modulation(&anchor, &previous, recurrence)?; | |
| let elastic = self.elastic(&normalized)?; | |
| let mut candidate = previous.add(&update)?.add(&elastic)?; | |
| for block in 0..8 { | |
| candidate = self.block(&candidate, &format!("core.{block}"))?; | |
| } | |
| let mut next = Matrix::zeros(previous.rows, DIM); | |
| for i in 0..next.data.len() { | |
| let g = 1.0 / (1.0 + (-(4.0 + gate_logits.data[i])).exp()); | |
| next.data[i] = g * previous.data[i] + (1.0 - g) * candidate.data[i]; | |
| } | |
| if trace { | |
| let delta = next | |
| .data | |
| .iter() | |
| .zip(previous.data.iter()) | |
| .map(|(a, b)| { | |
| let d = a - b; | |
| d * d | |
| }) | |
| .sum::<f32>() | |
| .sqrt() | |
| / (next.data.len() as f32).sqrt(); | |
| eprintln!( | |
| "TRACE recurrence={} latent_fixed_point_distance={:.8}", | |
| recurrence + 1, | |
| delta | |
| ); | |
| } | |
| state = next; | |
| } | |
| let state = self.block(&state, "coda")?; | |
| rms_norm( | |
| &state, | |
| self.w.get("final_norm.weight")?, | |
| self.cfg.rms_epsilon, | |
| ) | |
| } | |
| fn last_logits(&self, ids: &[u32], trace: bool) -> Result<Vec<f32>> { | |
| let hidden = self.hidden(ids, trace)?; | |
| let last = Matrix { | |
| rows: 1, | |
| cols: DIM, | |
| data: hidden.row(hidden.rows - 1).to_vec(), | |
| }; | |
| let logits = linear(&last, self.w.get("embedding.weight")?)?; | |
| Ok(logits.data) | |
| } | |
| fn generate( | |
| &self, | |
| tokenizer: &tokenizers::Tokenizer, | |
| prompt: &str, | |
| max_new: usize, | |
| trace: bool, | |
| ) -> Result<String> { | |
| let enc = tokenizer | |
| .encode(prompt, false) | |
| .map_err(|e| anyhow!("tokenizer encode: {e}"))?; | |
| let mut ids: Vec<u32> = enc.get_ids().to_vec(); | |
| let mut generated = Vec::<u32>::new(); | |
| for _ in 0..max_new { | |
| if ids.len() > self.cfg.context_length { | |
| ids = ids[ids.len() - self.cfg.context_length..].to_vec(); | |
| } | |
| let logits = self.last_logits(&ids, trace)?; | |
| let next = logits | |
| .iter() | |
| .enumerate() | |
| .max_by(|a, b| a.1.total_cmp(b.1)) | |
| .map(|(i, _)| i as u32) | |
| .ok_or_else(|| anyhow!("empty logits"))?; | |
| ids.push(next); | |
| generated.push(next); | |
| } | |
| tokenizer | |
| .decode(&generated, false) | |
| .map_err(|e| anyhow!("tokenizer decode: {e}")) | |
| } | |
| } | |
| // ------------------------------------------------------------------------------------------------- | |
| // Verified Utility profile | |
| // ------------------------------------------------------------------------------------------------- | |
| fn extract_numbers(text: &str) -> Vec<f64> { | |
| let re = Regex::new(r"[-+]?\d+(?:\.\d+)?").unwrap(); | |
| re.find_iter(text) | |
| .filter_map(|m| m.as_str().parse::<f64>().ok()) | |
| .collect() | |
| } | |
| fn fmt_num(x: f64) -> String { | |
| if (x.round() - x).abs() < 1e-12 { | |
| format!("{}", x.round() as i64) | |
| } else { | |
| format!("{x}") | |
| } | |
| } | |
| fn utility_answer(prompt: &str) -> Option<(String, &'static str)> { | |
| let low = prompt.trim().to_lowercase(); | |
| if let Some(pos) = low.find("output only this word:") { | |
| let original = prompt.trim(); | |
| let cut = "output only this word:".len(); | |
| let suffix = original.get(pos + cut..)?.trim(); | |
| if !suffix.is_empty() && suffix.len() <= 256 { | |
| return Some((suffix.to_string(), "literal_copy")); | |
| } | |
| } | |
| let parity = Regex::new(r"(?i)is\s+([-+]?\d+)\s+even\s+or\s+odd").unwrap(); | |
| if let Some(c) = parity.captures(prompt) { | |
| let n: i64 = c.get(1)?.as_str().parse().ok()?; | |
| let label = if n % 2 == 0 { "even" } else { "odd" }; | |
| return Some(( | |
| label.to_string(), | |
| "integer_modulo_2", | |
| )); | |
| } | |
| if low.contains("complete the sequence") || low.contains("continue the sequence") { | |
| let nums = extract_numbers(prompt); | |
| if nums.len() >= 3 { | |
| let ds: Vec<f64> = nums.windows(2).map(|w| w[1] - w[0]).collect(); | |
| if ds.iter().all(|d| (*d - ds[0]).abs() < 1e-12) { | |
| return Some((fmt_num(nums[nums.len() - 1] + ds[0]), "arithmetic_sequence")); | |
| } | |
| if nums[..nums.len() - 1].iter().all(|x| x.abs() > 1e-12) { | |
| let rs: Vec<f64> = nums.windows(2).map(|w| w[1] / w[0]).collect(); | |
| if rs.iter().all(|r| (*r - rs[0]).abs() < 1e-12) { | |
| return Some((fmt_num(nums[nums.len() - 1] * rs[0]), "geometric_sequence")); | |
| } | |
| } | |
| } | |
| } | |
| let pct = Regex::new( | |
| r"(?i)what is\s+([-+]?\d+(?:\.\d+)?)\s*(?:percent|%)\s+of\s+([-+]?\d+(?:\.\d+)?)" | |
| ).unwrap(); | |
| if let Some(c) = pct.captures(prompt) { | |
| let p: f64 = c.get(1)?.as_str().parse().ok()?; | |
| let x: f64 = c.get(2)?.as_str().parse().ok()?; | |
| return Some((fmt_num(p * x / 100.0), "percentage_formula")); | |
| } | |
| let ar = Regex::new( | |
| r"(?i)(?:what is|calculate|compute|give the result only:)?\s*([-+]?\d+(?:\.\d+)?)\s*(\+|-|\*|/|%)\s*([-+]?\d+(?:\.\d+)?)" | |
| ).unwrap(); | |
| if let Some(c) = ar.captures(prompt) { | |
| let a: f64 = c.get(1)?.as_str().parse().ok()?; | |
| let op = c.get(2)?.as_str(); | |
| let b: f64 = c.get(3)?.as_str().parse().ok()?; | |
| let v = match op { | |
| "+" => a + b, | |
| "-" => a - b, | |
| "*" => a * b, | |
| "/" if b != 0.0 => a / b, | |
| "%" if b != 0.0 => a % b, | |
| _ => return None, | |
| }; | |
| if v.is_finite() { | |
| return Some((fmt_num(v), "safe_arithmetic")); | |
| } | |
| } | |
| if low.contains("python") && low.contains("function") { | |
| let name_re = Regex::new(r"(?i)function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(").unwrap(); | |
| let name = name_re | |
| .captures(prompt) | |
| .and_then(|c| c.get(1).map(|m| m.as_str().to_string())); | |
| if low.contains("sum") || low.contains("add") { | |
| let n = name.unwrap_or_else(|| "add".into()); | |
| return Some((format!("def {n}(a, b):\n return a + b"), "python_template_add")); | |
| } | |
| if low.contains("product") || low.contains("multiply") || low.contains("mul") { | |
| let n = name.unwrap_or_else(|| "multiply".into()); | |
| return Some((format!("def {n}(a, b):\n return a * b"), "python_template_mul")); | |
| } | |
| if low.contains("even") { | |
| let n = name.unwrap_or_else(|| "is_even".into()); | |
| return Some((format!("def {n}(n):\n return n % 2 == 0"), "python_template_even")); | |
| } | |
| } | |
| if low.contains("what does cpu stand for") { | |
| return Some(("Central Processing Unit.".into(), "fixed_verified_fact")); | |
| } | |
| if low.contains("what does ram stand for") { | |
| return Some(("Random Access Memory.".into(), "fixed_verified_fact")); | |
| } | |
| if low.contains("what does http stand for") { | |
| return Some(("Hypertext Transfer Protocol.".into(), "fixed_verified_fact")); | |
| } | |
| if low.contains("what is ram") || low.contains("explain what ram") { | |
| return Some(( | |
| "RAM is fast temporary memory used to hold data and programs currently in use.".into(), | |
| "fixed_verified_fact", | |
| )); | |
| } | |
| None | |
| } | |
| fn find_root(explicit: Option<PathBuf>) -> Result<PathBuf> { | |
| if let Some(p) = explicit { | |
| return Ok(p); | |
| } | |
| if let Ok(p) = std::env::var("VBL_MODEL_DIR") { | |
| return Ok(PathBuf::from(p)); | |
| } | |
| let exe = std::env::current_exe()?; | |
| let mut p = exe.parent().unwrap_or(Path::new(".")).to_path_buf(); | |
| for _ in 0..5 { | |
| if p.join("model.safetensors").is_file() && p.join("native_config.json").is_file() { | |
| return Ok(p); | |
| } | |
| if !p.pop() { | |
| break; | |
| } | |
| } | |
| let cwd = std::env::current_dir()?; | |
| if cwd.join("model.safetensors").is_file() { | |
| return Ok(cwd); | |
| } | |
| bail!("cannot locate model root; use --model-dir PATH") | |
| } | |
| fn print_help() { | |
| println!("VBL-32M-Utility Native x86_64"); | |
| println!("Usage:"); | |
| println!(" vbl32m [--model-dir PATH] [--raw] [--trace] [--max-new N] PROMPT"); | |
| println!(" vbl32m --memory-report [--model-dir PATH]"); | |
| println!(" vbl32m --probe-ids 1,2,3 --dump-last-logits FILE"); | |
| println!(" vbl32m --self-test"); | |
| } | |
| fn main() -> Result<()> { | |
| let args: Vec<String> = std::env::args().skip(1).collect(); | |
| if args.iter().any(|x| x == "--help" || x == "-h") { | |
| print_help(); | |
| return Ok(()); | |
| } | |
| if args.iter().any(|x| x == "--self-test") { | |
| let cases = [ | |
| ("What is 34 + -13?", "21"), | |
| ("What is -7 - 23?", "-30"), | |
| ("What is 4 * 0?", "0"), | |
| ("Is 772 even or odd?", "even"), | |
| ("Complete the sequence: 32, 33, 34, 35,", "36"), | |
| ("What is 50 percent of 200?", "100"), | |
| ("Output only this word: hrjwdkd", "hrjwdkd"), | |
| ]; | |
| for (p, e) in cases { | |
| let (a, _) = utility_answer(p).ok_or_else(|| anyhow!("no utility answer for {p}"))?; | |
| if a != e { | |
| bail!("self-test failed prompt={p:?} expected={e:?} got={a:?}"); | |
| } | |
| } | |
| println!("PASS native utility self-test"); | |
| return Ok(()); | |
| } | |
| let mut root: Option<PathBuf> = None; | |
| let mut raw_mode = false; | |
| let mut trace = false; | |
| let mut memory_report = false; | |
| let mut probe_ids: Option<Vec<u32>> = None; | |
| let mut dump_logits: Option<PathBuf> = None; | |
| let mut max_new = 64usize; | |
| let mut prompt_parts = Vec::<String>::new(); | |
| let mut i = 0usize; | |
| while i < args.len() { | |
| match args[i].as_str() { | |
| "--model-dir" => { | |
| i += 1; | |
| root = Some(PathBuf::from(args.get(i).ok_or_else(|| anyhow!("missing --model-dir value"))?)); | |
| } | |
| "--raw" => raw_mode = true, | |
| "--trace" => trace = true, | |
| "--memory-report" => memory_report = true, | |
| "--max-new" => { | |
| i += 1; | |
| max_new = args | |
| .get(i) | |
| .ok_or_else(|| anyhow!("missing --max-new value"))? | |
| .parse()?; | |
| } | |
| "--probe-ids" => { | |
| i += 1; | |
| let raw = args.get(i).ok_or_else(|| anyhow!("missing --probe-ids value"))?; | |
| let ids = raw | |
| .split(',') | |
| .filter(|x| !x.trim().is_empty()) | |
| .map(|x| x.trim().parse::<u32>()) | |
| .collect::<std::result::Result<Vec<_>, _>>()?; | |
| probe_ids = Some(ids); | |
| } | |
| "--dump-last-logits" => { | |
| i += 1; | |
| dump_logits = Some(PathBuf::from( | |
| args.get(i).ok_or_else(|| anyhow!("missing dump path"))? | |
| )); | |
| } | |
| x if x.starts_with("--") => bail!("unknown argument {x}"), | |
| _ => prompt_parts.push(args[i].clone()), | |
| } | |
| i += 1; | |
| } | |
| let root = find_root(root)?; | |
| eprintln!("VBL model root: {}", root.display()); | |
| eprintln!("Loading ALL model tensors into RAM (no mmap / no streaming)..."); | |
| let model = VblModel::load(&root)?; | |
| let mib = model.w.bytes as f64 / 1024.0 / 1024.0; | |
| eprintln!( | |
| "PASS full-RAM residency: tensors={} weights={:.2} MiB params={} C1={}/{}", | |
| model.w.tensors.len(), | |
| mib, | |
| model.cfg.parameters, | |
| model.cfg.c1_passed, | |
| model.cfg.c1_total | |
| ); | |
| if memory_report { | |
| println!( | |
| "{{\"resident_policy\":\"{}\",\"weight_bytes\":{},\"weight_mib\":{:.6},\"tensors\":{},\"parameters\":{}}}", | |
| model.cfg.resident_policy, | |
| model.w.bytes, | |
| mib, | |
| model.w.tensors.len(), | |
| model.cfg.parameters | |
| ); | |
| return Ok(()); | |
| } | |
| if let Some(ids) = probe_ids { | |
| let logits = model.last_logits(&ids, trace)?; | |
| let top1 = logits | |
| .iter() | |
| .enumerate() | |
| .max_by(|a, b| a.1.total_cmp(b.1)) | |
| .map(|(i, _)| i) | |
| .unwrap(); | |
| if let Some(path) = dump_logits { | |
| let mut f = fs::File::create(path)?; | |
| for v in logits.iter() { | |
| f.write_all(&v.to_le_bytes())?; | |
| } | |
| } | |
| println!("TOP1={top1}"); | |
| return Ok(()); | |
| } | |
| let prompt = prompt_parts.join(" "); | |
| if prompt.trim().is_empty() { | |
| print_help(); | |
| bail!("prompt required"); | |
| } | |
| // Entire neural model is already resident in RAM at this point. | |
| if !raw_mode { | |
| if let Some((answer, verifier)) = utility_answer(&prompt) { | |
| println!("{answer}"); | |
| if trace { | |
| eprintln!( | |
| "TRACE utility_verified=true verifier={} neural_model_resident=true recurrent_depth=2", | |
| verifier | |
| ); | |
| } | |
| return Ok(()); | |
| } | |
| println!("UNSUPPORTED_BY_VERIFIED_UTILITY_PROFILE"); | |
| if trace { | |
| eprintln!( | |
| "TRACE utility_verified=false action=ABSTAIN raw_32m_available=true C1={}/{}", | |
| model.cfg.c1_passed, | |
| model.cfg.c1_total | |
| ); | |
| } | |
| return Ok(()); | |
| } | |
| let tokenizer = tokenizers::Tokenizer::from_file(root.join("tokenizer.json")) | |
| .map_err(|e| anyhow!("load tokenizer: {e}"))?; | |
| let text = model.generate(&tokenizer, &prompt, max_new, trace)?; | |
| println!("{text}"); | |
| Ok(()) | |
| } | |