use crate::{
Engine, QT_BF16, QT_F32, QT_F8_E4M3, QT_IQ3_S, QT_IQ4_XS, QT_NVFP4, QT_NVFP4_RP, QT_Q2_K,
QT_Q3_K, QT_Q4_0, QT_Q4_K, QT_Q5_K, QT_Q6_K, QT_Q8_0,
};
use memra_gguf::config::ModelConfig;
use memra_gguf::source::{DiskExtent, GgufSource, TensorSource};
use memra_gguf::{dequant, GgmlType, GgufFile};
use cudarc::driver::CudaSlice;
use std::collections::HashMap;
static RESIDENCY_CENSUS: [(std::sync::atomic::AtomicUsize, std::sync::atomic::AtomicU64); 16] = {
#[allow(clippy::declare_interior_mutable_const)]
const Z: (std::sync::atomic::AtomicUsize, std::sync::atomic::AtomicU64) =
(std::sync::atomic::AtomicUsize::new(0), std::sync::atomic::AtomicU64::new(0));
[Z; 16]
};
fn residency_census_note(qtype: i32, bytes: usize) {
use std::sync::atomic::Ordering::Relaxed;
if let Some(slot) = RESIDENCY_CENSUS.get(qtype as usize) {
slot.0.fetch_add(1, Relaxed);
slot.1.fetch_add(bytes as u64, Relaxed);
}
}
pub fn residency_census_report() -> String {
use std::sync::atomic::Ordering::Relaxed;
let name = |q: usize| -> &'static str {
match q as i32 {
QT_Q8_0 => "Q8_0", QT_Q4_K => "Q4_K", QT_Q6_K => "Q6_K", QT_Q5_K => "Q5_K",
QT_Q3_K => "Q3_K", QT_IQ4_XS => "IQ4_XS", QT_IQ3_S => "IQ3_S", QT_NVFP4 => "NVFP4",
QT_F32 => "F32", QT_NVFP4_RP => "NVFP4_RP", QT_F8_E4M3 => "F8_E4M3",
QT_BF16 => "BF16", QT_Q4_0 => "Q4_0", QT_Q2_K => "Q2_K",
crate::QT_F8_E4M3_BLK => "F8_E4M3_BLK", _ => "?",
}
};
let mut out = String::from("residency census (2D matmul weights, resident container):\n");
let (mut tn, mut tb) = (0usize, 0u64);
for (q, slot) in RESIDENCY_CENSUS.iter().enumerate() {
let (n, b) = (slot.0.load(Relaxed), slot.1.load(Relaxed));
if n == 0 { continue; }
tn += n; tb += b;
out += &format!(" {:>9}: {:>4} tensors {:>9.3} MiB\n", name(q), n,
b as f64 / (1024.0 * 1024.0));
}
out += &format!(" {:>9}: {:>4} tensors {:>9.3} MiB", "TOTAL", tn,
tb as f64 / (1024.0 * 1024.0));
out
}
pub enum GpuTensor {
Quant {
bytes: CudaSlice<u8>,
qtype: i32,
row_bytes: usize,
ne: Vec<u64>,
scale: f32,
rp: bool,
#[cfg(memra_cutlass)]
cutlass: Option<CutlassWeight>,
fp8: Option<Fp8Weight>,
rp4: Option<CudaSlice<u8>>,
blk: Option<Fp8BlockScales>,
f16: Option<CudaSlice<u8>>,
},
Float {
data: CudaSlice<f32>,
ne: Vec<u64>,
},
FloatBf16 {
data: CudaSlice<u8>,
ne: Vec<u64>,
},
}
pub struct Fp8Weight {
pub bytes: CudaSlice<u8>,
pub scale: f32,
pub blk: Option<Fp8BlockScales>,
}
pub struct Fp8BlockScales {
pub scales: CudaSlice<f32>,
pub rows: usize, pub cols: usize, }
pub fn repack_nvfp4_split(bytes: &[u8], out_f: usize) -> Vec<u8> {
let row_bytes = bytes.len() / out_f;
let nsb64 = row_bytes / 36;
debug_assert_eq!(
row_bytes % 36,
0,
"NVFP4 row_bytes must be a multiple of 36"
);
let qplane = out_f * nsb64 * 32;
let mut rp = vec![0u8; bytes.len()];
for o in 0..out_f {
for s in 0..nsb64 {
let src = &bytes[o * row_bytes + s * 36..o * row_bytes + s * 36 + 36];
rp[qplane + (o * nsb64 + s) * 4..qplane + (o * nsb64 + s) * 4 + 4]
.copy_from_slice(&src[0..4]);
rp[(o * nsb64 + s) * 32..(o * nsb64 + s) * 32 + 32].copy_from_slice(&src[4..36]);
}
}
rp
}
pub fn unpack_nvfp4_split(rp: &[u8], out_f: usize) -> Vec<u8> {
let row_bytes = rp.len() / out_f;
let nsb64 = row_bytes / 36;
let qplane = out_f * nsb64 * 32;
let mut back = vec![0u8; rp.len()];
for o in 0..out_f {
for s in 0..nsb64 {
back[o * row_bytes + s * 36..o * row_bytes + s * 36 + 4].copy_from_slice(
&rp[qplane + (o * nsb64 + s) * 4..qplane + (o * nsb64 + s) * 4 + 4],
);
back[o * row_bytes + s * 36 + 4..o * row_bytes + s * 36 + 36]
.copy_from_slice(&rp[(o * nsb64 + s) * 32..(o * nsb64 + s) * 32 + 32]);
}
}
back
}
pub fn rp_enabled() -> bool {
static ON: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
*ON.get_or_init(|| std::env::var("MEMRA_RP").map(|v| v != "0").unwrap_or(true))
}
pub fn full_prec_enabled() -> bool {
static ON: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
*ON.get_or_init(|| {
std::env::var("MEMRA_FULL_PREC")
.map(|v| v == "1")
.unwrap_or(false)
})
}
fn float_2d_audited(name: &str) -> bool {
name.ends_with("ffn_gate_inp.weight")
}
fn warn_float_2d_once(name: &str, ne: &[u64], src_type: GgmlType) {
use std::sync::{Mutex, OnceLock};
static SEEN: OnceLock<Mutex<std::collections::HashSet<String>>> = OnceLock::new();
let pat = match name.strip_prefix("blk.").and_then(|r| r.split_once('.')) {
Some((_, suffix)) => format!("blk.*.{suffix}"),
None => name.to_string(),
};
let mut seen = SEEN
.get_or_init(|| Mutex::new(std::collections::HashSet::new()))
.lock()
.unwrap();
if seen.insert(pat.clone()) {
eprintln!(
"[loader-law] WARNING: {pat} loads as 2D Float ne={ne:?} (src {src_type:?}) — \
a Float matmul weight rides cuBLAS f32 GEMV and poisons all-or-nothing q8-fast \
predicates (uses_q8_1_fast/mixer_in_q8_1_fast). If matmul-class: Q8_0-encode at \
load (model.rs ssm arm / source.rs BF16+F8 gates). If deliberately Float: add \
it to float_2d_audited with the audit rationale."
);
}
}
#[cfg(memra_cutlass)]
pub struct CutlassWeight {
pub b_packed: CudaSlice<u8>,
pub sfb_swizzled: CudaSlice<u8>,
}
impl GpuTensor {
pub fn ne(&self) -> &[u64] {
match self {
GpuTensor::Quant { ne, .. } => ne,
GpuTensor::Float { ne, .. } => ne,
GpuTensor::FloatBf16 { ne, .. } => ne,
}
}
pub fn in_features(&self) -> usize {
self.ne()[0] as usize
}
pub fn out_features(&self) -> usize {
self.ne()[1] as usize
}
pub fn scale(&self) -> f32 {
match self {
GpuTensor::Quant { scale, .. } => *scale,
GpuTensor::Float { .. } | GpuTensor::FloatBf16 { .. } => 1.0,
}
}
pub fn load(e: &Engine, g: &GgufFile, name: &str) -> Result<Self, Box<dyn std::error::Error>> {
Self::load_from_source(e, &GgufSource(g), name)
}
pub fn load_from_source(
e: &Engine,
src: &dyn TensorSource,
name: &str,
) -> Result<Self, Box<dyn std::error::Error>> {
let t = Self::load_from_source_inner(e, src, name)?;
if let GpuTensor::Quant { qtype, bytes, ne, .. } = &t {
if ne.len() == 2 {
residency_census_note(*qtype, bytes.len());
}
}
Ok(t)
}
fn load_from_source_inner(
e: &Engine,
src: &dyn TensorSource,
name: &str,
) -> Result<Self, Box<dyn std::error::Error>> {
let cutlass_wants_raw = cfg!(memra_cutlass) && std::env::var("MEMRA_FP4_CUTLASS").is_ok();
let st_direct = std::env::var("MEMRA_ST_DIRECT")
.map(|v| v != "0")
.unwrap_or(true);
if rp_enabled() && st_direct && !cutlass_wants_raw {
if let Some(nv) = src.find_nvfp4_native(name) {
if nv.in_f % 64 == 0 && nv.out_f > 0 {
let stem = name.strip_suffix(".weight").unwrap_or(name);
let scale = match src.find(&format!("{stem}.scale")) {
Some(sv) => f32::from_le_bytes(sv.bytes[..4].try_into().unwrap()),
None => 1.0,
};
let bytes =
e.htod_bytes(&memra_gguf::nvfp4_repack::repack_modelopt_to_split(
nv.wbytes, nv.wscale, nv.out_f, nv.in_f,
))?;
return Ok(GpuTensor::Quant {
bytes,
qtype: QT_NVFP4,
row_bytes: nv.in_f / 64 * 36,
ne: vec![nv.in_f as u64, nv.out_f as u64],
scale,
rp: true,
#[cfg(memra_cutlass)]
cutlass: None,
fp8: None, blk: None, f16: None,
rp4: None,
});
}
}
}
if crate::fp8_ffi::st_e4m3_enabled() {
if let Some(f8) = src.find_fp8_native(name) {
if f8.blk.is_none() && f8.in_f % 32 == 0 && f8.out_f > 0 {
return Ok(GpuTensor::Quant {
bytes: e.htod_bytes(&f8.bytes)?,
qtype: crate::QT_F8_E4M3,
row_bytes: f8.in_f,
ne: vec![f8.in_f as u64, f8.out_f as u64],
scale: f8.scale,
rp: false,
#[cfg(memra_cutlass)]
cutlass: None,
fp8: None, blk: None, f16: None,
rp4: None,
});
}
}
}
if crate::fp8_ffi::st_e4m3_blk_enabled() {
if let Some(f8) = src.find_fp8_native(name) {
if let Some(grid) = f8.blk.as_ref() {
let (in_f, out_f) = (f8.in_f, f8.out_f);
if in_f % 32 == 0 && out_f > 0
&& f8.bytes.len() == out_f * in_f
&& grid.rows == out_f.div_ceil(128)
&& grid.cols == in_f.div_ceil(128)
&& grid.scales.len() == grid.rows * grid.cols
&& f8.scale == 1.0
{
let bytes = e.htod_bytes(&f8.bytes)?;
if e.fp8_blk_nan_count(&bytes)? == 0 {
let scales = e.htod(&grid.scales)?;
return Ok(GpuTensor::Quant {
bytes,
qtype: crate::QT_F8_E4M3_BLK,
row_bytes: in_f,
ne: vec![in_f as u64, out_f as u64],
scale: 1.0,
rp: false,
#[cfg(memra_cutlass)]
cutlass: None,
fp8: None,
blk: Some(Fp8BlockScales {
scales,
rows: grid.rows,
cols: grid.cols,
}),
f16: None,
rp4: None,
});
}
crate::fp8_ffi::note_blk_native_nan_refused();
}
}
}
}
if crate::fp8_ffi::fp8_blk_gpu_enabled() {
if let Some(f8) = src.find_fp8_native(name) {
if let Some(grid) = f8.blk.as_ref() {
let (in_f, out_f) = (f8.in_f, f8.out_f);
if in_f % 32 == 0 && out_f > 0 && f8.bytes.len() == out_f * in_f {
let bytes =
e.fp8_blk_dequant_q8_0(&f8.bytes, &grid.scales, out_f, in_f)?;
return Ok(GpuTensor::Quant {
bytes,
qtype: QT_Q8_0,
row_bytes: in_f / 32 * 34,
ne: vec![in_f as u64, out_f as u64],
scale: 1.0,
rp: false,
#[cfg(memra_cutlass)]
cutlass: None,
fp8: None, blk: None, f16: None,
rp4: None,
});
}
}
}
}
let mut v = src
.find(name)
.unwrap_or_else(|| panic!("missing tensor {name}"));
let kq = std::env::var("MEMRA_KQ_NVFP4")
.ok()
.and_then(|x| x.parse::<u8>().ok())
.unwrap_or(0);
if (kq >= 1 && v.ggml_type == GgmlType::Q4_K || kq >= 2 && v.ggml_type == GgmlType::Q5_K)
&& v.ne.len() == 2
&& v.ne[0] % 64 == 0
&& !name.starts_with("output")
{
let n: u64 = v.ne.iter().product();
let f32v = dequant::dequantize(v.ggml_type, &v.bytes, n as usize);
let packed = memra_gguf::nvfp4_repack::f32_to_nvfp4(&f32v);
v = memra_gguf::source::TensorView {
bytes: std::borrow::Cow::Owned(packed),
ggml_type: GgmlType::NVFP4,
ne: v.ne.clone(),
};
}
let qtype = match v.ggml_type {
GgmlType::Q8_0 => Some(QT_Q8_0),
GgmlType::Q4_K => Some(QT_Q4_K),
GgmlType::Q6_K => Some(QT_Q6_K),
GgmlType::Q5_K => Some(QT_Q5_K),
GgmlType::Q3_K => Some(QT_Q3_K),
GgmlType::IQ4_XS => Some(QT_IQ4_XS),
GgmlType::IQ3_S => Some(QT_IQ3_S),
GgmlType::NVFP4 => Some(QT_NVFP4),
GgmlType::Q4_0 => Some(QT_Q4_0),
_ => None,
};
match qtype {
Some(qt) => {
let out_f = v.ne[1] as usize;
let row_bytes = v.bytes.len() / out_f;
let scale = if qt == QT_NVFP4 {
let stem = name.strip_suffix(".weight").unwrap_or(name);
match src.find(&format!("{stem}.scale")) {
Some(sv) => f32::from_le_bytes(sv.bytes[..4].try_into().unwrap()),
None => 1.0,
}
} else {
1.0
};
let rp = qt == QT_NVFP4
&& v.ne.len() == 2
&& (v.ne[0] as usize) % 64 == 0
&& v.bytes.len() % out_f == 0
&& (v.bytes.len() / out_f) % 36 == 0
&& rp_enabled();
let bytes = if rp {
e.htod_bytes(&repack_nvfp4_split(&v.bytes, out_f))?
} else {
e.htod_bytes(&v.bytes)?
};
#[cfg(memra_cutlass)]
let cutlass = {
let in_f = v.ne[0] as usize;
if qt == QT_NVFP4
&& in_f % 64 == 0
&& v.ne.len() == 2
&& std::env::var("MEMRA_FP4_CUTLASS").is_ok()
&& std::env::var("MEMRA_FP4_CUTLASS_OTF").is_err()
{
let raw_dev;
let src_dev = if rp {
raw_dev = e.htod_bytes(&v.bytes)?;
&raw_dev
} else {
&bytes
};
let (b_packed, sfb_swizzled) =
e.build_cutlass_weight(src_dev, out_f, in_f, row_bytes)?;
Some(CutlassWeight {
b_packed,
sfb_swizzled,
})
} else {
None
}
};
let fp8 = if qt == QT_Q8_0
&& (crate::fp8_ffi::pp_fp8_enabled() || crate::fp8_ffi::fp8_mmq_enabled())
{
match src.find_fp8_native(name) {
Some(f8)
if v.ne.len() == 2
&& f8.in_f as u64 == v.ne[0]
&& f8.out_f as u64 == v.ne[1] =>
{
use std::sync::atomic::{AtomicUsize, Ordering};
static FP8_SPENT: AtomicUsize = AtomicUsize::new(0);
static FP8_BUDGET: std::sync::OnceLock<usize> =
std::sync::OnceLock::new();
let budget = *FP8_BUDGET.get_or_init(|| {
std::env::var("MEMRA_PP_FP8_BUDGET_MB")
.ok()
.and_then(|v| v.parse::<usize>().ok())
.unwrap_or(1536)
<< 20
});
let sz = f8.bytes.len();
if FP8_SPENT.fetch_add(sz, Ordering::Relaxed) + sz <= budget {
let blk = match f8.blk {
Some(g) => Some(Fp8BlockScales {
scales: e.htod(&g.scales)?,
rows: g.rows,
cols: g.cols,
}),
None => None,
};
Some(Fp8Weight {
bytes: e.htod_bytes(&f8.bytes)?,
scale: f8.scale,
blk,
})
} else {
FP8_SPENT.fetch_sub(sz, Ordering::Relaxed);
None
}
}
_ => None,
}
} else {
None
};
Ok(GpuTensor::Quant {
bytes,
qtype: qt,
row_bytes,
ne: v.ne.clone(),
scale,
rp,
#[cfg(memra_cutlass)]
cutlass,
fp8,
blk: None,
rp4: None,
f16: None,
})
}
None => {
let n: u64 = v.ne.iter().product();
if full_prec_enabled() {
if v.ggml_type == GgmlType::BF16 && v.ne.len() == 2 && n >= 1_000_000 {
let data = e.htod_bytes(&v.bytes)?; return Ok(GpuTensor::FloatBf16 {
data,
ne: v.ne.clone(),
});
}
let f32v = dequant::dequantize(v.ggml_type, &v.bytes, n as usize);
return Ok(GpuTensor::Float {
data: e.htod(&f32v)?,
ne: v.ne.clone(),
});
}
let f32v = dequant::dequantize(v.ggml_type, &v.bytes, n as usize);
if v.ne.len() == 2
&& v.ne[0] % 32 == 0
&& (name.ends_with("ssm_beta.weight") || name.ends_with("ssm_alpha.weight")
|| name.ends_with("per_layer_model_proj.weight"))
{
let q8 = memra_gguf::nvfp4_repack::f32_to_q8_0(&f32v);
return GpuTensor::from_quant_bytes(
e,
&q8,
GgmlType::Q8_0,
v.ne[0],
v.ne[1],
1.0,
);
}
if v.ne.len() == 2 && v.ne[0] >= 16 && v.ne[1] >= 16 && !float_2d_audited(name) {
warn_float_2d_once(name, &v.ne, v.ggml_type);
}
Ok(GpuTensor::Float {
data: e.htod(&f32v)?,
ne: v.ne.clone(),
})
}
}
}
pub fn from_quant_bytes(
e: &Engine,
bytes: &[u8],
ty: GgmlType,
ne0: u64,
ne1: u64,
scale: f32,
) -> Result<Self, Box<dyn std::error::Error>> {
let qt = match ty {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::Q4_0 => QT_Q4_0,
other => panic!("from_quant_bytes: unsupported dtype {other:?}"),
};
let row_bytes = bytes.len() / ne1 as usize;
let rp = qt == QT_NVFP4 && ne0 % 64 == 0 && row_bytes % 36 == 0 && rp_enabled();
let dev = if rp {
e.htod_bytes(&repack_nvfp4_split(bytes, ne1 as usize))?
} else {
e.htod_bytes(bytes)?
};
Ok(GpuTensor::Quant {
bytes: dev,
qtype: qt,
row_bytes,
ne: vec![ne0, ne1],
scale,
rp,
#[cfg(memra_cutlass)]
cutlass: None,
fp8: None, blk: None, f16: None,
rp4: None,
})
}
pub fn load_opt(
e: &Engine,
g: &GgufFile,
name: &str,
) -> Result<Option<Self>, Box<dyn std::error::Error>> {
Self::load_opt_from_source(e, &GgufSource(g), name)
}
pub fn load_opt_from_source(
e: &Engine,
src: &dyn TensorSource,
name: &str,
) -> Result<Option<Self>, Box<dyn std::error::Error>> {
if src.has(name) {
Ok(Some(Self::load_from_source(e, src, name)?))
} else {
Ok(None)
}
}
pub fn float_data(&self) -> &CudaSlice<f32> {
match self {
GpuTensor::Float { data, .. } => data,
GpuTensor::Quant { .. } => panic!("expected float tensor (norm), got quantized"),
GpuTensor::FloatBf16 { .. } => {
panic!("expected f32 float tensor (norm), got bf16-resident matmul weight")
}
}
}
}
pub struct Layer {
pub attn_norm: GpuTensor,
pub wq: GpuTensor,
pub wk: GpuTensor,
pub wv: GpuTensor,
pub wo: GpuTensor,
pub q_norm: Option<GpuTensor>,
pub k_norm: Option<GpuTensor>,
pub ffn_norm: GpuTensor,
pub ffn: crate::hybrid::Ffn,
}
pub struct EmbedHost {
pub raw: Vec<u8>,
pub ggml_type: GgmlType,
pub n_embd: usize,
}
impl EmbedHost {
pub fn from_gguf(g: &GgufFile, name: &str) -> Self {
Self::from_source(&GgufSource(g), name)
}
pub fn from_source(src: &dyn TensorSource, name: &str) -> Self {
let v = src
.find(name)
.unwrap_or_else(|| panic!("missing embed {name}"));
EmbedHost {
raw: v.bytes.to_vec(),
ggml_type: v.ggml_type,
n_embd: v.ne[0] as usize,
}
}
pub fn qt_and_row_bytes(&self, n_embd: usize) -> (i32, usize) {
let (blk, tsize) = self.ggml_type.block_and_type_size();
let row_bytes = (n_embd as u64 / blk * tsize) as usize;
let qt = match self.ggml_type {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::F32 => QT_F32,
GgmlType::BF16 => QT_BF16,
other => panic!("embed_gather: unsupported dtype {other:?}"),
};
(qt, row_bytes)
}
pub fn gather(&self, n_embd: usize, tokens: &[u32]) -> Vec<f32> {
let (blk, tsize) = self.ggml_type.block_and_type_size();
let row_bytes = (n_embd as u64 / blk * tsize) as usize;
let mut x = vec![0f32; tokens.len() * n_embd];
for (ti, &tok) in tokens.iter().enumerate() {
let off = tok as usize * row_bytes;
let row = dequant::dequantize(self.ggml_type, &self.raw[off..off + row_bytes], n_embd);
x[ti * n_embd..ti * n_embd + n_embd].copy_from_slice(&row);
}
x
}
}
pub struct Model {
pub cfg: ModelConfig,
pub embd: EmbedHost,
pub output_norm: GpuTensor,
pub output: GpuTensor,
pub layers: Vec<Layer>,
}
impl Model {
pub fn load_dense(e: &Engine, g: &GgufFile) -> Result<Self, Box<dyn std::error::Error>> {
Self::load_dense_from_source(e, &GgufSource(g))
}
pub fn load_dense_from_source(
e: &Engine,
src: &dyn TensorSource,
) -> Result<Self, Box<dyn std::error::Error>> {
let cfg = src.config();
assert!(
cfg.full_attention_interval == 0,
"model has linear-attn layers; use hybrid path"
);
crate::KV_FP8_FORCE.store(0, std::sync::atomic::Ordering::Relaxed);
let embd = EmbedHost::from_source(src, "token_embd.weight");
let output_norm = GpuTensor::load_from_source(e, src, "output_norm.weight")?;
let output = if src.has("output.weight") {
GpuTensor::load_from_source(e, src, "output.weight")?
} else {
GpuTensor::load_from_source(e, src, "token_embd.weight")?
};
let mut resident = crate::hybrid::ResidentPlan::unsharded(e, src, &cfg);
let mut layers = Vec::with_capacity(cfg.n_layer as usize);
for il in 0..cfg.n_layer {
let p = |s: &str| format!("blk.{il}.{s}");
let hy3_dense_ffn = cfg
.hy3
.as_ref()
.is_some_and(|h| il < h.first_k_dense_replace);
let ffn = if hy3_dense_ffn {
crate::hybrid::Ffn::Dense {
ffn_gate: GpuTensor::load_from_source(e, src, &p("ffn_gate.weight"))?,
ffn_up: GpuTensor::load_from_source(e, src, &p("ffn_up.weight"))?,
ffn_down: GpuTensor::load_from_source(e, src, &p("ffn_down.weight"))?,
}
} else {
crate::hybrid::load_ffn(e, src, &cfg, il, None, &mut resident)?
};
layers.push(Layer {
attn_norm: GpuTensor::load_from_source(e, src, &p("attn_norm.weight"))?,
wq: GpuTensor::load_from_source(e, src, &p("attn_q.weight"))?,
wk: GpuTensor::load_from_source(e, src, &p("attn_k.weight"))?,
wv: GpuTensor::load_from_source(e, src, &p("attn_v.weight"))?,
wo: GpuTensor::load_from_source(e, src, &p("attn_output.weight"))?,
q_norm: GpuTensor::load_opt_from_source(e, src, &p("attn_q_norm.weight"))?,
k_norm: GpuTensor::load_opt_from_source(e, src, &p("attn_k_norm.weight"))?,
ffn_norm: GpuTensor::load_from_source(e, src, &p("ffn_norm.weight"))?,
ffn,
});
}
Ok(Model {
cfg,
embd,
output_norm,
output,
layers,
})
}
pub(crate) fn max_moe_block(&self) -> usize {
use crate::hybrid::Ffn;
let mut mx = 0usize;
for l in &self.layers {
if let Ffn::Moe(m) = &l.ffn {
mx = mx
.max(m.gate_exps.max_expert_bytes())
.max(m.up_exps.max_expert_bytes())
.max(m.down_exps.max_expert_bytes());
}
}
mx
}
pub fn embed_tokens(
&self,
e: &Engine,
tokens: &[u32],
) -> Result<CudaSlice<f32>, Box<dyn std::error::Error>> {
let n_embd = self.cfg.n_embd as usize;
let x = self.embd.gather(n_embd, tokens);
Ok(e.htod(&x)?)
}
}
pub type TensorMap = HashMap<String, GpuTensor>;
pub enum HostBuf {
Paged(Vec<u8>),
Pinned {
slice: std::sync::Arc<cudarc::driver::PinnedHostSlice<u8>>,
base: *const u8,
len: usize,
},
PinnedAlias {
owner: std::sync::Arc<HostBuf>,
base: *const u8,
len: usize,
},
Mmap {
map: std::sync::Arc<memmap2::Mmap>,
file: std::sync::Arc<std::fs::File>,
off: usize,
len: usize,
},
}
unsafe impl Send for HostBuf {}
unsafe impl Sync for HostBuf {}
impl HostBuf {
#[inline]
pub fn as_bytes(&self) -> &[u8] {
match self {
HostBuf::Paged(v) => v.as_slice(),
HostBuf::Pinned { base, len, .. } => unsafe { std::slice::from_raw_parts(*base, *len) },
HostBuf::PinnedAlias { base, len, .. } => unsafe {
std::slice::from_raw_parts(*base, *len)
},
HostBuf::Mmap { map, off, len, .. } => &map[*off..*off + *len],
}
}
#[inline]
pub fn len(&self) -> usize {
match self {
HostBuf::Paged(v) => v.len(),
HostBuf::Pinned { len, .. } => *len,
HostBuf::PinnedAlias { len, .. } => *len,
HostBuf::Mmap { len, .. } => *len,
}
}
#[inline]
pub fn advise_willneed(&self, rel_off: usize, len: usize) -> bool {
let HostBuf::Mmap {
map,
off,
len: extent,
..
} = self
else {
return false;
};
if len == 0 || rel_off > *extent || len > *extent - rel_off {
return false;
}
#[cfg(unix)]
{
map.advise_range(memmap2::Advice::WillNeed, *off + rel_off, len)
.is_ok()
}
#[cfg(not(unix))]
{
let _ = (map, off);
false
}
}
#[inline]
fn expert_source(&self, rel_off: usize, len: usize) -> ExpertSource<'_> {
debug_assert!(rel_off <= self.len() && len <= self.len() - rel_off);
match self {
HostBuf::Mmap { map, file, off, .. } => {
let offset = *off + rel_off;
ExpertSource::Disk {
file,
offset: offset as u64,
len,
fallback: &map[offset..offset + len],
keepalive: ExpertKeepalive::Mmap(map.clone()),
}
}
HostBuf::Pinned { slice, .. } => ExpertSource::Memory {
bytes: &self.as_bytes()[rel_off..rel_off + len],
keepalive: Some(ExpertKeepalive::Pinned(slice.clone())),
},
HostBuf::PinnedAlias { owner, .. } => ExpertSource::Memory {
bytes: &self.as_bytes()[rel_off..rel_off + len],
keepalive: Some(ExpertKeepalive::Buffer(owner.clone())),
},
HostBuf::Paged(_) => ExpertSource::Memory {
bytes: &self.as_bytes()[rel_off..rel_off + len],
keepalive: None,
},
}
}
}
#[allow(dead_code)]
pub(crate) enum ExpertKeepalive {
Pinned(std::sync::Arc<cudarc::driver::PinnedHostSlice<u8>>),
Buffer(std::sync::Arc<HostBuf>),
Mmap(std::sync::Arc<memmap2::Mmap>),
}
pub(crate) enum ExpertSource<'a> {
Memory {
bytes: &'a [u8],
keepalive: Option<ExpertKeepalive>,
},
Disk {
file: &'a std::sync::Arc<std::fs::File>,
offset: u64,
len: usize,
fallback: &'a [u8],
keepalive: ExpertKeepalive,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ExpertLayout {
pub offset: usize,
pub len: usize,
pub qtype: i32,
pub row_bytes: usize,
}
fn staged_expert_qtype(ty: GgmlType) -> Option<i32> {
Some(match ty {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q2_K => QT_Q2_K,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::F32 => QT_F32,
GgmlType::BF16 => QT_BF16,
_ => return None,
})
}
fn staged_expert_row_bytes(ty: GgmlType, in_f: usize) -> Option<usize> {
staged_expert_qtype(ty)?;
let (block, type_size) = ty.block_and_type_size();
assert_eq!(
in_f as u64 % block,
0,
"expert row width {in_f} is not divisible by {ty:?} block {block}"
);
Some((in_f as u64 / block * type_size) as usize)
}
fn find_expert_disk_strict(
src: &dyn TensorSource,
name: &str,
) -> Result<Option<DiskExtent>, Box<dyn std::error::Error>> {
if let Some(extent) = src.find_expert_disk(name) {
return Ok(Some(extent));
}
if src.find_expert_mmap(name).is_some() {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!(
"expert tensor {name} exposes legacy find_expert_mmap without find_expert_disk; \
disk-backed expert loading requires a retained Arc<File>"
),
)
.into());
}
Ok(None)
}
pub struct HostExps {
pub bytes: HostBuf, pub tiers: Option<Vec<HostBuf>>,
pub qtype: i32, pub in_f: usize, pub out_f: usize, pub n_expert: usize, pub row_bytes: usize, pub expert_stride: usize, pub layouts: Option<Vec<ExpertLayout>>,
pub macros: Option<Vec<f32>>,
}
impl HostExps {
pub fn load(e: &Engine, g: &GgufFile, name: &str) -> Result<Self, Box<dyn std::error::Error>> {
Self::load_stacked_from_source(e, &GgufSource(g), name)
}
pub fn load_stacked_split_from_source(
e: &Engine,
src: &dyn TensorSource,
name: &str,
row0: usize,
row1: usize,
) -> Result<Self, Box<dyn std::error::Error>> {
let t = src
.find(name)
.unwrap_or_else(|| panic!("missing exps tensor {name}"));
assert_eq!(t.ne.len(), 3, "{name} is not 3D (ne={:?})", t.ne);
let qtype = match t.ggml_type {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::Q4_0 => QT_Q4_0,
other => panic!("exps {name} unsupported quant {other:?}"),
};
let raw: &[u8] = &t.bytes;
let in_f = t.ne[0] as usize;
let out_full = t.ne[1] as usize;
let n_expert = t.ne[2] as usize;
let full_stride = raw.len() / n_expert;
let row_bytes = raw.len() / (out_full * n_expert);
assert_eq!(full_stride, out_full * row_bytes, "{name} stride mismatch");
let out_f = row1 - row0;
let expert_stride = out_f * row_bytes;
let mut buf = vec![0u8; n_expert * expert_stride];
for ex in 0..n_expert {
let s0 = ex * full_stride + row0 * row_bytes;
buf[ex * expert_stride..(ex + 1) * expert_stride]
.copy_from_slice(&raw[s0..s0 + expert_stride]);
}
let pinned = std::env::var("MEMRA_MOE_PINNED").is_ok()
|| std::env::var("MEMRA_MOE_CACHE").as_deref() != Ok("0");
let bytes = if pinned {
let mut pn = unsafe { e.ctx().alloc_pinned::<u8>(buf.len())? };
{
let dst = pn.as_mut_slice()?;
dst.copy_from_slice(&buf);
}
let base = pn.as_ptr()? as *const u8;
let len = buf.len();
HostBuf::Pinned {
slice: std::sync::Arc::new(pn),
base,
len,
}
} else {
HostBuf::Paged(buf)
};
Ok(HostExps {
bytes,
tiers: None,
qtype,
in_f,
out_f,
n_expert,
row_bytes,
expert_stride,
layouts: None,
macros: None,
})
}
fn stacked_macros(src: &dyn TensorSource, name: &str) -> Option<Vec<f32>> {
let stem = name.strip_suffix(".weight")?;
let sv = src.find(&format!("{stem}.scale"))?;
if sv.ggml_type != GgmlType::F32 { return None; }
let macros: Vec<f32> = sv.bytes.chunks_exact(4)
.map(|c| f32::from_le_bytes(c.try_into().unwrap())).collect();
if macros.iter().all(|&m| m == 1.0) { None } else { Some(macros) }
}
pub fn load_stacked_from_source(e: &Engine, src: &dyn TensorSource, name: &str)
-> Result<Self, Box<dyn std::error::Error>> {
let t = src.find(name).unwrap_or_else(|| panic!("missing exps tensor {name}"));
assert_eq!(t.ne.len(), 3, "{name} is not a 3D stacked-expert tensor (ne={:?})", t.ne);
if let Some(DiskExtent {
map,
file,
offset,
len,
}) = find_expert_disk_strict(src, name)?
{
let off = usize::try_from(offset)
.map_err(|_| format!("{name} disk offset {offset} does not fit usize"))?;
let qtype = match t.ggml_type {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::Q4_0 => QT_Q4_0,
other => panic!("exps {name} unsupported quant {other:?}"),
};
let in_f = t.ne[0] as usize;
let out_f = t.ne[1] as usize;
let n_expert = t.ne[2] as usize;
let expert_stride = len / n_expert;
let row_bytes = len / (out_f * n_expert);
assert_eq!(expert_stride, out_f * row_bytes,
"{name} stride mismatch: stride={expert_stride} out_f={out_f} row_bytes={row_bytes}");
assert_eq!(
len,
n_expert * expert_stride,
"{name} mmap len != n_expert*stride"
);
return Ok(HostExps {
bytes: HostBuf::Mmap { map, file, off, len },
tiers: None, qtype, in_f, out_f, n_expert, row_bytes, expert_stride,
layouts: None, macros: Self::stacked_macros(src, name),
});
}
let raw: &[u8] = &t.bytes;
let qtype = match t.ggml_type {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::Q4_0 => QT_Q4_0,
other => panic!("exps {name} unsupported quant {other:?}"),
};
let in_f = t.ne[0] as usize;
let out_f = t.ne[1] as usize;
let n_expert = t.ne[2] as usize;
let expert_stride = raw.len() / n_expert;
let row_bytes = raw.len() / (out_f * n_expert);
assert_eq!(
expert_stride,
out_f * row_bytes,
"{name} stride mismatch: stride={expert_stride} out_f={out_f} row_bytes={row_bytes}"
);
let pinned = std::env::var("MEMRA_MOE_PINNED").is_ok()
|| std::env::var("MEMRA_MOE_CACHE").as_deref() != Ok("0");
let bytes = if pinned {
let mut p = unsafe { e.ctx().alloc_pinned::<u8>(raw.len())? };
{
let dst = p.as_mut_slice()?;
dst.copy_from_slice(raw);
}
let base = p.as_ptr()? as *const u8; let len = raw.len();
HostBuf::Pinned {
slice: std::sync::Arc::new(p),
base,
len,
}
} else {
HostBuf::Paged(raw.to_vec())
};
Ok(HostExps { bytes, tiers: None, qtype, in_f, out_f, n_expert, row_bytes,
expert_stride, layouts: None, macros: Self::stacked_macros(src, name) })
}
pub fn load_tiered(
e: &Engine,
g: &GgufFile,
name: &str,
ctx: &mut crate::spill::SpillCtx,
) -> Result<Self, Box<dyn std::error::Error>> {
let t = g
.find(name)
.unwrap_or_else(|| panic!("missing exps tensor {name}"));
assert_eq!(
t.ne.len(),
3,
"{name} is not a 3D stacked-expert tensor (ne={:?})",
t.ne
);
let raw = g.tensor_data(t);
let qtype = match t.ggml_type {
GgmlType::Q8_0 => QT_Q8_0,
GgmlType::Q4_K => QT_Q4_K,
GgmlType::Q6_K => QT_Q6_K,
GgmlType::Q5_K => QT_Q5_K,
GgmlType::Q3_K => QT_Q3_K,
GgmlType::IQ4_XS => QT_IQ4_XS,
GgmlType::IQ3_S => QT_IQ3_S,
GgmlType::NVFP4 => QT_NVFP4,
GgmlType::Q4_0 => QT_Q4_0,
other => panic!("exps {name} unsupported quant {other:?}"),
};
let in_f = t.ne[0] as usize;
let out_f = t.ne[1] as usize;
let n_expert = t.ne[2] as usize;
let expert_stride = raw.len() / n_expert;
let row_bytes = raw.len() / (out_f * n_expert);
assert_eq!(
expert_stride,
out_f * row_bytes,
"{name} stride mismatch: stride={expert_stride} out_f={out_f} row_bytes={row_bytes}"
);
let (file_start, _file_end) = g.tensor_file_range(t);
let mut tiers = Vec::with_capacity(n_expert);
for ex in 0..n_expert {
let blk = &raw[ex * expert_stride..(ex + 1) * expert_stride];
let file_off = file_start + ex * expert_stride;
tiers.push(crate::spill::place_expert(ctx, e, blk, file_off, t.shard)?);
}
Ok(HostExps {
bytes: HostBuf::Paged(Vec::new()), tiers: Some(tiers),
qtype, in_f, out_f, n_expert, row_bytes, expert_stride, layouts: None,
macros: Self::stacked_macros(&GgufSource(g), name),
})
}
pub fn load_from_source(
e: &Engine,
src: &dyn TensorSource,
ggml_exps_name: &str,
n_expert: usize,
) -> Result<Self, Box<dyn std::error::Error>> {
let rest = ggml_exps_name
.strip_prefix("blk.")
.unwrap_or_else(|| panic!("not a blk.* name: {ggml_exps_name}"));
let (il_s, suffix) = rest.split_once('.').unwrap();
let il: u32 = il_s.parse().unwrap();
let proj = match suffix {
"ffn_gate_exps.weight" => "gate",
"ffn_up_exps.weight" => "up",
"ffn_down_exps.weight" => "down",
other => panic!("not a *_exps suffix: {other}"),
};
let mut signatures = Vec::with_capacity(n_expert);
let active = src.active_experts(il);
for ex in 0..n_expert {
if active.is_some_and(|mask| !mask[ex]) {
signatures.push((i32::MIN, 0));
continue;
}
let name = format!("blk.{il}.ffn_{proj}_exps.{ex}.weight");
if let Some(nv) = src.find_nvfp4_native(&name) {
signatures.push((QT_NVFP4, nv.in_f / 64 * 36));
} else {
let v = src
.find(&name)
.unwrap_or_else(|| panic!("missing expert tensor {name}"));
let in_f = v.ne[0] as usize;
signatures.push(match staged_expert_row_bytes(v.ggml_type, in_f) {
Some(row_bytes) => (staged_expert_qtype(v.ggml_type).unwrap(), row_bytes),
None => (QT_F32, in_f * 4),
});
}
}
let mixed_layout = signatures.windows(2).any(|pair| pair[0] != pair[1]);
if src.preserve_expert_encodings() && !mixed_layout {
if let Some(uniform) = Self::load_uniform_mmap_from_source(src, il, proj, n_expert)? {
return Ok(uniform);
}
}
if src.preserve_expert_encodings() || mixed_layout {
return Self::load_mixed_from_source(src, il, proj, n_expert);
}
{
let name0 = format!("blk.{il}.ffn_{proj}_exps.0.weight");
if let Some(nv0) = src.find_nvfp4_native(&name0) {
let (in_f, out_f) = (nv0.in_f, nv0.out_f);
let row_bytes = in_f / 64 * 36;
let expert_stride = out_f * row_bytes;
let disk = std::env::var("MEMRA_ST_REPACK_DISK")
.map(|v| v != "0")
.unwrap_or(true)
&& src.st_dir().is_some();
let cache_path = src.st_dir().map(|d| {
let cd = d.join(".memra-repack");
let _ = std::fs::create_dir_all(&cd);
cd.join(format!("blk{il}-{proj}-{n_expert}x{out_f}x{in_f}.nvfp4"))
});
let total = n_expert * expert_stride;
let mut macros = vec![1.0f32; n_expert];
let read_macros = |macros: &mut Vec<f32>| {
for ex in 0..n_expert {
let stem = format!("blk.{il}.ffn_{proj}_exps.{ex}");
if let Some(sv) = src.find(&format!("{stem}.scale")) {
macros[ex] = f32::from_le_bytes(sv.bytes[..4].try_into().unwrap());
}
}
};
let bytes = if disk {
let cp = cache_path.as_ref().unwrap();
let fresh = std::fs::metadata(cp)
.map(|m| m.len() as usize == total)
.unwrap_or(false);
if !fresh {
use std::io::Write;
let mut f = std::io::BufWriter::new(std::fs::File::create(cp)?);
for ex in 0..n_expert {
let name = format!("blk.{il}.ffn_{proj}_exps.{ex}.weight");
let nv = src.find_nvfp4_native(&name).unwrap_or_else(|| {
panic!("expert {name} lost NVFP4-native mid-gather")
});
assert_eq!(
(nv.in_f, nv.out_f),
(in_f, out_f),
"expert {ex} dims ({},{}) != expert 0 ({in_f},{out_f})",
nv.in_f,
nv.out_f
);
f.write_all(&memra_gguf::nvfp4_repack::repack_modelopt_to_gguf(
nv.wbytes, nv.wscale, out_f, in_f,
))?;
}
f.flush()?;
}
read_macros(&mut macros);
let file = std::sync::Arc::new(std::fs::File::open(cp)?);
let map = unsafe { memmap2::Mmap::map(file.as_ref())? };
assert_eq!(map.len(), total, "repack cache {cp:?} size mismatch");
let _ = memra_gguf::source::apply_expert_mmap_advice(&map);
let map = std::sync::Arc::new(map);
let tiers = if std::env::var("MEMRA_ST_PINNED")
.map(|v| v == "1")
.unwrap_or(false)
{
static PIN_BUDGET: std::sync::OnceLock<std::sync::Mutex<usize>> =
std::sync::OnceLock::new();
let budget = PIN_BUDGET.get_or_init(|| {
let b = crate::spill::MemBudget::probe(e)
.map(|b| b.free_pinnable_ram)
.unwrap_or(0);
eprintln!("[st-spill] pinned budget {:.1} GB", b as f64 / 1e9);
std::sync::Mutex::new(b)
});
let mut rem = budget.lock().unwrap();
let n_pin = (*rem / expert_stride).min(n_expert);
if n_pin == 0 {
None
} else {
let slab_len = n_pin * expert_stride;
let mut pn = unsafe { e.ctx().alloc_pinned::<u8>(slab_len)? };
{
let dst = pn.as_mut_slice()?;
dst.copy_from_slice(&map[..slab_len]);
}
let base = pn.as_ptr()? as *const u8;
*rem -= slab_len;
let slab = std::sync::Arc::new(HostBuf::Pinned {
slice: std::sync::Arc::new(pn),
base,
len: slab_len,
});
let mut tiers: Vec<HostBuf> = Vec::with_capacity(n_expert);
for ex in 0..n_expert {
let off = ex * expert_stride;
if ex < n_pin {
tiers.push(HostBuf::PinnedAlias {
owner: slab.clone(),
base: unsafe { base.add(off) },
len: expert_stride,
});
} else {
tiers.push(HostBuf::Mmap {
map: map.clone(),
file: file.clone(),
off,
len: expert_stride,
});
}
}
Some(tiers)
}
} else {
None
};
if let Some(tiers) = tiers {
let all_one = macros.iter().all(|&m| m == 1.0);
return Ok(HostExps {
bytes: HostBuf::Mmap {
map,
file,
off: 0,
len: total,
},
tiers: Some(tiers),
qtype: QT_NVFP4,
in_f,
out_f,
n_expert,
row_bytes,
expert_stride,
layouts: None,
macros: if all_one { None } else { Some(macros) },
});
}
HostBuf::Mmap {
map,
file,
off: 0,
len: total,
}
} else {
let mut buf: Vec<u8> = Vec::with_capacity(total);
for ex in 0..n_expert {
let name = format!("blk.{il}.ffn_{proj}_exps.{ex}.weight");
let nv = src.find_nvfp4_native(&name).unwrap_or_else(|| {
panic!("expert {name} lost NVFP4-native mid-gather")
});
assert_eq!(
(nv.in_f, nv.out_f),
(in_f, out_f),
"expert {ex} dims ({},{}) != expert 0 ({in_f},{out_f})",
nv.in_f,
nv.out_f
);
buf.extend_from_slice(&memra_gguf::nvfp4_repack::repack_modelopt_to_gguf(
nv.wbytes, nv.wscale, out_f, in_f,
));
}
assert_eq!(buf.len(), total);
read_macros(&mut macros);
let pinned = std::env::var("MEMRA_MOE_PINNED").is_ok()
|| std::env::var("MEMRA_MOE_CACHE").as_deref() != Ok("0");
if pinned {
let mut p = unsafe { e.ctx().alloc_pinned::<u8>(buf.len())? };
{
let dst = p.as_mut_slice()?;
dst.copy_from_slice(&buf);
}
let base = p.as_ptr()? as *const u8;
let len = buf.len();
HostBuf::Pinned {
slice: std::sync::Arc::new(p),
base,
len,
}
} else {
HostBuf::Paged(buf)
}
};
let all_one = macros.iter().all(|&m| m == 1.0);
return Ok(HostExps {
bytes,
tiers: None,
qtype: QT_NVFP4,
in_f,
out_f,
n_expert,
row_bytes,
expert_stride,
layouts: None,
macros: if all_one { None } else { Some(macros) },
});
}
}
let mut buf: Vec<u8> = Vec::new();
let mut in_f = 0usize;
let mut out_f = 0usize;
for ex in 0..n_expert {
let name = format!("blk.{il}.ffn_{proj}_exps.{ex}.weight");
let v = src
.find(&name)
.unwrap_or_else(|| panic!("missing expert tensor {name}"));
assert_eq!(v.ne.len(), 2, "expert {name} is not 2D (ne={:?})", v.ne);
let (cur_in, cur_out) = (v.ne[0] as usize, v.ne[1] as usize);
if ex == 0 {
in_f = cur_in;
out_f = cur_out;
} else {
assert_eq!(
(cur_in, cur_out),
(in_f, out_f),
"expert {ex} dims {:?} != expert 0 [{in_f},{out_f}]",
(cur_in, cur_out)
);
}
let n = cur_in * cur_out;
let f32v = dequant::dequantize(v.ggml_type, &v.bytes, n);
buf.reserve(n * 4);
for f in &f32v {
buf.extend_from_slice(&f.to_le_bytes());
}
}
let row_bytes = in_f * 4; let expert_stride = out_f * row_bytes;
assert_eq!(
buf.len(),
n_expert * expert_stride,
"{ggml_exps_name} gather size {} != n_expert*stride {}",
buf.len(),
n_expert * expert_stride
);
assert_eq!(expert_stride, out_f * row_bytes,
"{ggml_exps_name} stride mismatch: stride={expert_stride} out_f={out_f} row_bytes={row_bytes}");
let pinned = std::env::var("MEMRA_MOE_PINNED").is_ok()
|| std::env::var("MEMRA_MOE_CACHE").as_deref() != Ok("0");
let bytes = if pinned {
let mut p = unsafe { e.ctx().alloc_pinned::<u8>(buf.len())? };
{
let dst = p.as_mut_slice()?;
dst.copy_from_slice(&buf);
}
let base = p.as_ptr()? as *const u8;
let len = buf.len();
HostBuf::Pinned {
slice: std::sync::Arc::new(p),
base,
len,
}
} else {
HostBuf::Paged(buf)
};
Ok(HostExps {
bytes,
tiers: None,
qtype: QT_F32,
in_f,
out_f,
n_expert,
row_bytes,
expert_stride,
layouts: None,
macros: None,
})
}
fn load_uniform_mmap_from_source(
src: &dyn TensorSource,
il: u32,
proj: &str,
n_expert: usize,
) -> Result<Option<Self>, Box<dyn std::error::Error>> {
if src
.active_experts(il)
.is_some_and(|mask| mask.iter().any(|&active| !active))
{
return Ok(None);
}
let mut first_map = None;
let mut first_file = None;
let mut base_offset = 0u64;
let mut expert_stride = 0usize;
let mut in_f = 0usize;
let mut out_f = 0usize;
let mut qtype = 0i32;
let mut row_bytes = 0usize;
let mut macros = vec![1.0f32; n_expert];
for ex in 0..n_expert {
let stem = format!("blk.{il}.ffn_{proj}_exps.{ex}");
let name = format!("{stem}.weight");
let Some(DiskExtent {
map,
file,
offset,
len,
}) = find_expert_disk_strict(src, &name)?
else {
return Ok(None);
};
let Some(v) = src.find(&name) else {
return Ok(None);
};
if v.ne.len() != 2 {
return Ok(None);
}
let (cur_in, cur_out) = (v.ne[0] as usize, v.ne[1] as usize);
let Some(cur_row_bytes) = staged_expert_row_bytes(v.ggml_type, cur_in) else {
return Ok(None);
};
let cur_qtype = staged_expert_qtype(v.ggml_type).unwrap();
if ex == 0 {
base_offset = offset;
expert_stride = len;
in_f = cur_in;
out_f = cur_out;
qtype = cur_qtype;
row_bytes = cur_row_bytes;
first_map = Some(map);
first_file = Some(file);
} else if !std::sync::Arc::ptr_eq(first_map.as_ref().unwrap(), &map)
|| !std::sync::Arc::ptr_eq(first_file.as_ref().unwrap(), &file)
|| offset != base_offset + (ex * expert_stride) as u64
|| len != expert_stride
|| (cur_in, cur_out, cur_qtype, cur_row_bytes) != (in_f, out_f, qtype, row_bytes)
{
return Ok(None);
}
if let Some(scale) = src.find(&format!("{stem}.scale")) {
macros[ex] = f32::from_le_bytes(scale.bytes[..4].try_into().unwrap());
}
}
assert_eq!(expert_stride, out_f * row_bytes);
let total = n_expert * expert_stride;
let off = usize::try_from(base_offset)
.map_err(|_| format!("uniform expert disk offset {base_offset} does not fit usize"))?;
let all_one = macros.iter().all(|&scale| scale == 1.0);
Ok(Some(HostExps {
bytes: HostBuf::Mmap {
map: first_map.unwrap(),
file: first_file.unwrap(),
off,
len: total,
},
tiers: None,
qtype,
in_f,
out_f,
n_expert,
row_bytes,
expert_stride,
layouts: None,
macros: if all_one { None } else { Some(macros) },
}))
}
fn load_mixed_from_source(
src: &dyn TensorSource,
il: u32,
proj: &str,
n_expert: usize,
) -> Result<Self, Box<dyn std::error::Error>> {
let mut tiers = Vec::with_capacity(n_expert);
let mut layouts = Vec::with_capacity(n_expert);
let mut macros = vec![1.0f32; n_expert];
let mut in_f = 0usize;
let mut out_f = 0usize;
let active = src.active_experts(il);
let mut first_active = None;
for ex in 0..n_expert {
if active.is_some_and(|mask| !mask[ex]) {
layouts.push(ExpertLayout {
offset: 0,
len: 0,
qtype: QT_F32,
row_bytes: 0,
});
tiers.push(HostBuf::Paged(Vec::new()));
continue;
}
let name = format!("blk.{il}.ffn_{proj}_exps.{ex}.weight");
let stem = format!("blk.{il}.ffn_{proj}_exps.{ex}");
if let Some(scale) = src.find(&format!("{stem}.scale")) {
macros[ex] = f32::from_le_bytes(scale.bytes[..4].try_into().unwrap());
}
let (host, byte_len, qtype, row_bytes, cur_in, cur_out) = if let Some(DiskExtent {
map,
file,
offset,
len,
}) =
find_expert_disk_strict(src, &name)?
{
let v = src
.find(&name)
.unwrap_or_else(|| panic!("missing expert tensor {name}"));
assert_eq!(v.ne.len(), 2, "expert {name} is not 2D (ne={:?})", v.ne);
let (cur_in, cur_out) = (v.ne[0] as usize, v.ne[1] as usize);
let row_bytes = staged_expert_row_bytes(v.ggml_type, cur_in).ok_or_else(|| {
format!("mmap expert {name} has unsupported qtype {:?}", v.ggml_type)
})?;
let off = usize::try_from(offset).map_err(|_| {
format!("expert {name} disk offset {offset} does not fit usize")
})?;
(
HostBuf::Mmap {
map,
file,
off,
len,
},
len,
staged_expert_qtype(v.ggml_type).unwrap(),
row_bytes,
cur_in,
cur_out,
)
} else if let Some(nv) = src.find_nvfp4_native(&name) {
let bytes = memra_gguf::nvfp4_repack::repack_modelopt_to_gguf(
nv.wbytes, nv.wscale, nv.out_f, nv.in_f,
);
let row_bytes = nv.in_f / 64 * 36;
let byte_len = bytes.len();
(
HostBuf::Paged(bytes),
byte_len,
QT_NVFP4,
row_bytes,
nv.in_f,
nv.out_f,
)
} else {
let v = src
.find(&name)
.unwrap_or_else(|| panic!("missing expert tensor {name}"));
assert_eq!(v.ne.len(), 2, "expert {name} is not 2D (ne={:?})", v.ne);
let (cur_in, cur_out) = (v.ne[0] as usize, v.ne[1] as usize);
if let Some(row_bytes) = staged_expert_row_bytes(v.ggml_type, cur_in) {
let bytes = v.bytes.into_owned();
let byte_len = bytes.len();
(
HostBuf::Paged(bytes),
byte_len,
staged_expert_qtype(v.ggml_type).unwrap(),
row_bytes,
cur_in,
cur_out,
)
} else {
let f32v = dequant::dequantize(v.ggml_type, &v.bytes, cur_in * cur_out);
let mut bytes = Vec::with_capacity(f32v.len() * 4);
for f in f32v {
bytes.extend_from_slice(&f.to_le_bytes());
}
let byte_len = bytes.len();
(
HostBuf::Paged(bytes),
byte_len,
QT_F32,
cur_in * 4,
cur_in,
cur_out,
)
}
};
if first_active.is_none() {
in_f = cur_in;
out_f = cur_out;
first_active = Some(ex);
} else {
assert_eq!(
(cur_in, cur_out),
(in_f, out_f),
"expert {ex} dims ({cur_in},{cur_out}) != first active expert ({in_f},{out_f})"
);
}
assert_eq!(
byte_len,
cur_out * row_bytes,
"expert {name} bytes {byte_len} != out_f*row_bytes {}",
cur_out * row_bytes
);
layouts.push(ExpertLayout {
offset: 0,
len: byte_len,
qtype,
row_bytes,
});
tiers.push(host);
}
let first = layouts[*first_active
.as_ref()
.expect("expert mask pruned every expert")];
let expert_stride = layouts.iter().map(|layout| layout.len).max().unwrap_or(0);
let all_one = macros.iter().all(|&scale| scale == 1.0);
Ok(HostExps {
bytes: HostBuf::Paged(Vec::new()),
tiers: Some(tiers),
qtype: first.qtype,
in_f,
out_f,
n_expert,
row_bytes: first.row_bytes,
expert_stride,
layouts: Some(layouts),
macros: if all_one { None } else { Some(macros) },
})
}
#[inline]
pub fn macro_scale(&self, e: usize) -> f32 {
self.macros.as_ref().map(|m| m[e]).unwrap_or(1.0)
}
#[inline]
pub fn is_uniform_layout(&self) -> bool {
self.layouts.is_none()
}
#[inline]
pub fn expert_layout(&self, e: usize) -> ExpertLayout {
debug_assert!(
e < self.n_expert,
"expert index {e} >= n_expert {}",
self.n_expert
);
self.layouts
.as_ref()
.map(|layouts| layouts[e])
.unwrap_or(ExpertLayout {
offset: e * self.expert_stride,
len: self.expert_stride,
qtype: self.qtype,
row_bytes: self.row_bytes,
})
}
#[inline]
pub fn max_expert_bytes(&self) -> usize {
self.layouts
.as_ref()
.and_then(|layouts| layouts.iter().map(|layout| layout.len).max())
.unwrap_or(self.expert_stride)
}
#[inline]
pub fn expert_bytes(&self, e: usize) -> &[u8] {
let layout = self.expert_layout(e);
match &self.tiers {
Some(tiers) => {
debug_assert_eq!(tiers[e].len(), layout.len);
tiers[e].as_bytes()
}
None => &self.bytes.as_bytes()[layout.offset..layout.offset + layout.len],
}
}
#[inline]
pub(crate) fn expert_source(&self, e: usize) -> ExpertSource<'_> {
let layout = self.expert_layout(e);
match &self.tiers {
Some(tiers) => tiers[e].expert_source(0, layout.len),
None => self.bytes.expert_source(layout.offset, layout.len),
}
}
#[inline]
pub fn prefetch_expert_pages(&self, e: usize) -> bool {
let layout = self.expert_layout(e);
match &self.tiers {
Some(tiers) => tiers[e].advise_willneed(0, layout.len),
None => self.bytes.advise_willneed(layout.offset, layout.len),
}
}
}
#[cfg(test)]
mod tests {
use super::{
repack_nvfp4_split, unpack_nvfp4_split, ExpertKeepalive, ExpertSource, HostBuf, HostExps,
QT_BF16, QT_NVFP4, QT_Q2_K, QT_Q4_K,
};
use memra_gguf::nvfp4_repack::{repack_modelopt_to_gguf, repack_modelopt_to_split};
use memra_gguf::source::{DiskExtent, TensorSource, TensorView};
use memra_gguf::{config::ModelConfig, GgmlType};
use std::borrow::Cow;
struct MixedExpertSource {
bf16: Vec<u8>,
q4k: Vec<u8>,
}
impl TensorSource for MixedExpertSource {
fn config(&self) -> ModelConfig {
panic!("unused by HostExps mixed-loader test")
}
fn find(&self, name: &str) -> Option<TensorView<'_>> {
let (bytes, ggml_type) = if name == "blk.0.ffn_gate_exps.0.weight" {
(&self.bf16, GgmlType::BF16)
} else if name == "blk.0.ffn_gate_exps.1.weight" {
(&self.q4k, GgmlType::Q4_K)
} else {
return None;
};
Some(TensorView {
bytes: Cow::Borrowed(bytes),
ggml_type,
ne: vec![256, 2],
})
}
}
struct PrunedExpertSource {
q2k: Vec<u8>,
nvfp4: Vec<u8>,
active: Vec<bool>,
}
struct MmapExpertSource {
file: std::sync::Arc<std::fs::File>,
map: std::sync::Arc<memmap2::Mmap>,
base_offset: usize,
expert_len: usize,
}
struct LegacyMmapExpertSource {
map: std::sync::Arc<memmap2::Mmap>,
expert_len: usize,
}
impl TensorSource for MmapExpertSource {
fn config(&self) -> ModelConfig {
panic!("unused by HostExps mmap-loader test")
}
fn preserve_expert_encodings(&self) -> bool {
true
}
fn find(&self, name: &str) -> Option<TensorView<'_>> {
let ex = match name {
"blk.0.ffn_gate_exps.0.weight" => 0,
"blk.0.ffn_gate_exps.1.weight" => 1,
_ => return None,
};
let off = self.base_offset + ex * self.expert_len;
Some(TensorView {
bytes: Cow::Borrowed(&self.map[off..off + self.expert_len]),
ggml_type: GgmlType::Q2_K,
ne: vec![256, 2],
})
}
fn find_expert_disk(&self, name: &str) -> Option<DiskExtent> {
let ex = match name {
"blk.0.ffn_gate_exps.0.weight" => 0,
"blk.0.ffn_gate_exps.1.weight" => 1,
_ => return None,
};
Some(DiskExtent {
map: self.map.clone(),
file: self.file.clone(),
offset: (self.base_offset + ex * self.expert_len) as u64,
len: self.expert_len,
})
}
}
impl TensorSource for LegacyMmapExpertSource {
fn config(&self) -> ModelConfig {
panic!("unused by legacy mmap guard test")
}
fn preserve_expert_encodings(&self) -> bool {
true
}
fn find(&self, name: &str) -> Option<TensorView<'_>> {
let ex = match name {
"blk.0.ffn_gate_exps.0.weight" => 0,
"blk.0.ffn_gate_exps.1.weight" => 1,
_ => return None,
};
let off = ex * self.expert_len;
Some(TensorView {
bytes: Cow::Borrowed(&self.map[off..off + self.expert_len]),
ggml_type: GgmlType::Q2_K,
ne: vec![256, 2],
})
}
fn find_expert_mmap(
&self,
name: &str,
) -> Option<(std::sync::Arc<memmap2::Mmap>, usize, usize)> {
let ex = match name {
"blk.0.ffn_gate_exps.0.weight" => 0,
"blk.0.ffn_gate_exps.1.weight" => 1,
_ => return None,
};
Some((self.map.clone(), ex * self.expert_len, self.expert_len))
}
}
impl TensorSource for PrunedExpertSource {
fn config(&self) -> ModelConfig {
panic!("unused by HostExps pruned-loader test")
}
fn active_experts(&self, layer: u32) -> Option<&[bool]> {
(layer == 0).then_some(self.active.as_slice())
}
fn find(&self, name: &str) -> Option<TensorView<'_>> {
let (bytes, ggml_type) = match name {
"blk.0.ffn_gate_exps.0.weight" => (&self.q2k, GgmlType::Q2_K),
"blk.0.ffn_gate_exps.2.weight" => (&self.nvfp4, GgmlType::NVFP4),
_ => return None,
};
Some(TensorView {
bytes: Cow::Borrowed(bytes),
ggml_type,
ne: vec![256, 2],
})
}
}
#[test]
fn direct_split_equals_chained() {
for (out_f, in_f) in [(1usize, 64usize), (3, 128), (5, 320), (8, 1024)] {
let mut w = vec![0u8; out_f * in_f / 2];
let mut s = vec![0u8; out_f * in_f / 16];
for (i, b) in w.iter_mut().enumerate() {
*b = ((i * 41 + 7) & 0xFF) as u8;
}
for (i, b) in s.iter_mut().enumerate() {
*b = (0x20 + ((i * 11 + 5) % 0x50)) as u8;
}
let gguf = repack_modelopt_to_gguf(&w, &s, out_f, in_f);
let chained = repack_nvfp4_split(&gguf, out_f);
let direct = repack_modelopt_to_split(&w, &s, out_f, in_f);
assert_eq!(
direct, chained,
"fused != chained at out_f={out_f} in_f={in_f}"
);
assert_eq!(
unpack_nvfp4_split(&direct, out_f),
gguf,
"split roundtrip broken at out_f={out_f} in_f={in_f}"
);
}
}
#[test]
fn mixed_expert_loader_keeps_each_encoding_and_extent() {
let source = MixedExpertSource {
bf16: vec![0x5a; 256 * 2 * 2],
q4k: vec![0xa5; 2 * 144],
};
let exps = HostExps::load_mixed_from_source(&source, 0, "gate", 2).unwrap();
assert!(!exps.is_uniform_layout());
assert_eq!(exps.max_expert_bytes(), 1024);
assert_eq!(exps.expert_layout(0).qtype, QT_BF16);
assert_eq!(exps.expert_layout(0).row_bytes, 512);
assert_eq!(exps.expert_layout(0).len, 1024);
assert_eq!(exps.expert_layout(1).qtype, QT_Q4_K);
assert_eq!(exps.expert_layout(1).row_bytes, 144);
assert_eq!(exps.expert_layout(1).len, 288);
assert_eq!(exps.expert_bytes(0), source.bf16);
assert_eq!(exps.expert_bytes(1), source.q4k);
match exps.expert_source(1) {
ExpertSource::Memory { bytes, .. } => assert_eq!(bytes, source.q4k),
ExpertSource::Disk { .. } => panic!("paged expert unexpectedly became disk-backed"),
}
}
#[test]
fn mixed_expert_loader_omits_masked_expert_bytes() {
let source = PrunedExpertSource {
q2k: vec![0x22; 2 * 84],
nvfp4: vec![0x44; 2 * 4 * 36],
active: vec![true, false, true],
};
let exps = HostExps::load_mixed_from_source(&source, 0, "gate", 3).unwrap();
assert_eq!(exps.expert_layout(0).qtype, QT_Q2_K);
assert_eq!(exps.expert_layout(0).row_bytes, 84);
assert_eq!(exps.expert_layout(1).len, 0);
assert_eq!(exps.expert_bytes(1), &[]);
assert_eq!(exps.expert_layout(2).qtype, QT_NVFP4);
assert_eq!(exps.expert_layout(2).row_bytes, 4 * 36);
}
#[test]
fn mixed_expert_loader_keeps_mmap_backing_zero_copy() {
let path = std::env::temp_dir().join(format!("memra-mixed-mmap-{}", std::process::id()));
let base_offset = 3usize;
let expert_len = 2 * 84;
let mut bytes = vec![0xE1; base_offset];
bytes.extend(vec![0x31; expert_len]);
bytes.extend(vec![0x72; expert_len]);
std::fs::write(&path, &bytes).unwrap();
let file = std::sync::Arc::new(std::fs::File::open(&path).unwrap());
let map = std::sync::Arc::new(unsafe { memmap2::Mmap::map(file.as_ref()).unwrap() });
let source = MmapExpertSource {
file: file.clone(),
map,
base_offset,
expert_len,
};
let exps = HostExps::load_mixed_from_source(&source, 0, "gate", 2).unwrap();
assert!(matches!(
exps.tiers.as_ref().unwrap()[0],
HostBuf::Mmap { .. }
));
assert!(matches!(
exps.tiers.as_ref().unwrap()[1],
HostBuf::Mmap { .. }
));
assert_eq!(
exps.expert_bytes(0),
&bytes[base_offset..base_offset + expert_len]
);
assert_eq!(exps.expert_bytes(1), &bytes[base_offset + expert_len..]);
match exps.expert_source(1) {
ExpertSource::Disk {
file: got_file,
offset,
len,
fallback,
keepalive,
} => {
assert!(std::sync::Arc::ptr_eq(got_file, &file));
assert_eq!(offset, (base_offset + expert_len) as u64);
assert_eq!(len, expert_len);
assert_eq!(fallback, &bytes[base_offset + expert_len..]);
match keepalive {
ExpertKeepalive::Mmap(owner) => {
assert!(std::sync::Arc::ptr_eq(&owner, &source.map));
}
_ => panic!("mmap expert did not retain its mmap owner"),
}
}
ExpertSource::Memory { .. } => panic!("mixed mmap tier lost its disk extent"),
}
#[cfg(unix)]
assert!(exps.prefetch_expert_pages(1));
std::fs::remove_file(path).ok();
}
#[test]
fn tiered_expert_source_does_not_double_apply_layout_offset() {
let path =
std::env::temp_dir().join(format!("memra-tiered-source-offset-{}", std::process::id()));
let base_offset = 7usize;
let expert_len = 2 * 84;
let mut bytes = vec![0xE3; base_offset];
bytes.extend(vec![0x41; expert_len]);
bytes.extend(vec![0x82; expert_len]);
std::fs::write(&path, &bytes).unwrap();
let file = std::sync::Arc::new(std::fs::File::open(&path).unwrap());
let map = std::sync::Arc::new(unsafe { memmap2::Mmap::map(file.as_ref()).unwrap() });
let exps = HostExps {
bytes: HostBuf::Paged(Vec::new()),
tiers: Some(vec![
HostBuf::Mmap {
map: map.clone(),
file: file.clone(),
off: base_offset,
len: expert_len,
},
HostBuf::Mmap {
map,
file: file.clone(),
off: base_offset + expert_len,
len: expert_len,
},
]),
qtype: QT_Q2_K,
in_f: 256,
out_f: 2,
n_expert: 2,
row_bytes: 84,
expert_stride: expert_len,
layouts: None,
macros: None,
};
assert_eq!(exps.expert_layout(1).offset, expert_len);
match exps.expert_source(1) {
ExpertSource::Disk {
offset,
len,
fallback,
..
} => {
assert_eq!(offset, (base_offset + expert_len) as u64);
assert_eq!(len, expert_len);
assert_eq!(fallback, &bytes[base_offset + expert_len..]);
}
ExpertSource::Memory { .. } => panic!("tiered mmap expert lost its disk extent"),
}
std::fs::remove_file(path).ok();
}
#[test]
fn legacy_mmap_source_requires_retained_file_extent() {
let path =
std::env::temp_dir().join(format!("memra-legacy-mmap-source-{}", std::process::id()));
let expert_len = 2 * 84;
std::fs::write(&path, vec![0x64; 2 * expert_len]).unwrap();
let file = std::fs::File::open(&path).unwrap();
let map = std::sync::Arc::new(unsafe { memmap2::Mmap::map(&file).unwrap() });
let source = LegacyMmapExpertSource { map, expert_len };
let err = match HostExps::load_uniform_mmap_from_source(&source, 0, "gate", 2) {
Ok(_) => panic!("legacy mmap-only source silently fell back instead of failing"),
Err(err) => err,
};
let message = err.to_string();
assert!(
message.contains("legacy find_expert_mmap without find_expert_disk"),
"{message}"
);
assert!(message.contains("retained Arc<File>"), "{message}");
std::fs::remove_file(path).ok();
}
#[test]
fn uniform_expert_loader_coalesces_contiguous_mmap() {
let path = std::env::temp_dir().join(format!("memra-uniform-mmap-{}", std::process::id()));
let base_offset = 5usize;
let expert_len = 2 * 84;
let mut bytes = vec![0xE2; base_offset];
bytes.extend(vec![0x19; expert_len]);
bytes.extend(vec![0x91; expert_len]);
std::fs::write(&path, &bytes).unwrap();
let file = std::sync::Arc::new(std::fs::File::open(&path).unwrap());
let map = std::sync::Arc::new(unsafe { memmap2::Mmap::map(file.as_ref()).unwrap() });
let source = MmapExpertSource {
file: file.clone(),
map,
base_offset,
expert_len,
};
let exps = HostExps::load_uniform_mmap_from_source(&source, 0, "gate", 2)
.unwrap()
.expect("contiguous mmap should coalesce");
assert!(exps.is_uniform_layout());
assert!(matches!(&exps.bytes, HostBuf::Mmap { .. }));
assert_eq!(exps.expert_stride, expert_len);
assert_eq!(
exps.expert_bytes(0),
&bytes[base_offset..base_offset + expert_len]
);
assert_eq!(exps.expert_bytes(1), &bytes[base_offset + expert_len..]);
match exps.expert_source(1) {
ExpertSource::Disk {
file: got_file,
offset,
len,
fallback,
..
} => {
assert!(std::sync::Arc::ptr_eq(got_file, &file));
assert_eq!(offset, (base_offset + expert_len) as u64);
assert_eq!(len, expert_len);
assert_eq!(fallback, &bytes[base_offset + expert_len..]);
}
ExpertSource::Memory { .. } => panic!("uniform mmap slab lost its disk extent"),
}
#[cfg(unix)]
assert!(exps.prefetch_expert_pages(1));
std::fs::remove_file(path).ok();
}
}