use crate::common::enums::{DatabaseMode, MoeQuantMode, TransferKind, TransferPolicy};
use crate::common::error::AicError;
use crate::common::system_spec::SystemSpec;
use crate::operators::base::{PerformanceResult, SolComponents, Source};
use crate::operators::util_empirical::{self, UtilGrid};
use crate::perf_database::gemm::quant_tc_flops;
use crate::perf_database::moe::{MoeKernel, MoeSiblingSlice};
use crate::perf_database::PerfDatabase;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
pub(crate) const MOE_QUANT_UTIL_LEVEL: &[(f64, f64, f64)] = &[
(2.0, 1.0, 0.53), (1.0, 1.0, 0.45), (0.5625, 1.0, 0.07), (0.5, 1.0, 0.07), (0.5625, 1.0, 0.07), (1.0, 2.0, 0.40), (0.5, 2.0, 0.15), (1.0, 4.0, 0.30), (0.5, 4.0, 0.23), (0.5625, 4.0, 0.23), ];
const MOE_QUANT_UTIL_DEFAULT: f64 = 0.30;
fn moe_quant_util_level(quant: MoeQuantMode) -> f64 {
let mapping = quant.mapping();
MOE_QUANT_UTIL_LEVEL
.iter()
.find(|(memory, compute, _)| *memory == mapping.memory && *compute == mapping.compute)
.map(|(_, _, level)| *level)
.unwrap_or(MOE_QUANT_UTIL_DEFAULT)
}
const ALL_MOE_QUANTS: &[MoeQuantMode] = &[
MoeQuantMode::Bfloat16,
MoeQuantMode::Fp8,
MoeQuantMode::Int4Wo,
MoeQuantMode::Fp8Block,
MoeQuantMode::W4afp8,
MoeQuantMode::Nvfp4,
MoeQuantMode::Nvfp4Wo,
MoeQuantMode::W4a16Mxfp4,
MoeQuantMode::W4a8Mxfp4Mxfp8,
MoeQuantMode::W4a8Mxfp4Mxfp8Trtllm,
MoeQuantMode::W4a16Mxfp4Cutlass,
MoeQuantMode::W4a16Nvfp4,
];
fn moe_quant_from_name(name: &str) -> Option<MoeQuantMode> {
ALL_MOE_QUANTS.iter().copied().find(|q| q.name() == name)
}
fn xprofile_moe_quants(query: MoeQuantMode, table_quants: &[MoeQuantMode]) -> Vec<MoeQuantMode> {
let qp = query.mapping();
let mut refs: Vec<MoeQuantMode> = table_quants
.iter()
.copied()
.filter(|q| {
let m = q.mapping();
*q != query && !(m.memory == qp.memory && m.compute == qp.compute)
})
.collect();
let dist = |q: MoeQuantMode| {
let m = q.mapping();
(m.memory - qp.memory).abs() + (m.compute - qp.compute).abs()
};
refs.sort_by(|a, b| {
dist(*a)
.partial_cmp(&dist(*b))
.expect("finite profile distances")
});
refs
}
pub(crate) fn policy_fingerprint(policy: TransferPolicy) -> String {
format!(
"xshape={},xquant={},xprofile={},xop={}",
policy.xshape as u8, policy.xquant as u8, policy.xprofile as u8, policy.xop as u8
)
}
#[derive(Clone, Copy, PartialEq)]
enum MoeTableSel {
Standard,
LowLatency,
}
impl MoeTableSel {
fn tag(self) -> &'static str {
match self {
Self::Standard => "std",
Self::LowLatency => "ll",
}
}
}
fn moe_kernel(table: MoeTableSel) -> MoeKernel {
match table {
MoeTableSel::Standard => MoeKernel::Standard,
MoeTableSel::LowLatency => MoeKernel::LowLatency,
}
}
struct MoeReferenceCandidate {
slice: MoeSiblingSlice,
ref_quant: MoeQuantMode,
sol_quant: MoeQuantMode,
provenance: &'static str,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MoeOp {
pub name: String,
pub scale_factor: f64,
pub hidden_size: u32,
pub inter_size: u32,
pub topk: u32,
pub num_experts: u32,
pub moe_tp_size: u32,
pub moe_ep_size: u32,
#[serde(default)]
pub attention_dp_size: u32,
pub quant_mode: MoeQuantMode,
pub workload_distribution: String,
pub is_gated: bool,
#[serde(default)]
pub moe_backend: Option<String>,
#[serde(default)]
pub enable_eplb: bool,
#[serde(default)]
pub is_context: bool,
}
impl MoeOp {
pub fn weight_bytes(&self) -> f64 {
let num_gemms = if self.is_gated { 3.0 } else { 2.0 };
let raw = f64::from(self.hidden_size)
* f64::from(self.inter_size)
* f64::from(self.num_experts)
* self.quant_mode.mapping().memory
* num_gemms;
let per_ep = (raw / f64::from(self.moe_ep_size)).floor();
(per_ep / f64::from(self.moe_tp_size)).floor() * self.scale_factor
}
pub fn new(
name: impl Into<String>,
hidden_size: u32,
inter_size: u32,
topk: u32,
num_experts: u32,
moe_tp_size: u32,
moe_ep_size: u32,
quant_mode: MoeQuantMode,
workload_distribution: impl Into<String>,
) -> Self {
Self {
name: name.into(),
scale_factor: 1.0,
hidden_size,
inter_size,
topk,
num_experts,
moe_tp_size,
moe_ep_size,
attention_dp_size: 1,
quant_mode,
workload_distribution: workload_distribution.into(),
is_gated: true,
moe_backend: None,
enable_eplb: false,
is_context: false,
}
}
pub fn query(&self, db: &PerfDatabase, num_tokens: u32) -> Result<PerformanceResult, AicError> {
let num_tokens = num_tokens.saturating_mul(self.attention_dp_size.max(1));
match db.database_mode {
DatabaseMode::Sol | DatabaseMode::SolFull => {
let tc_flops = quant_tc_flops(&db.system_spec, self.quant_mode.mapping())?;
Ok(
PerformanceResult::sol(self.sol_components(db, num_tokens, tc_flops))
.clamp_non_negative()
.scaled(self.scale_factor),
)
}
DatabaseMode::Empirical => Ok(PerformanceResult::new(
self.empirical_latency(db, num_tokens)?,
Source::Empirical,
)
.clamp_non_negative()
.scaled(self.scale_factor)),
DatabaseMode::Hybrid => match self.silicon_pr(db, num_tokens) {
Ok(result) => Ok(result),
Err(err) if err.is_missing_perf_data() => Ok(PerformanceResult::new(
self.empirical_latency(db, num_tokens)?,
Source::Empirical,
)
.clamp_non_negative()
.scaled(self.scale_factor)),
Err(err) => Err(err),
},
_ => self.silicon_pr(db, num_tokens),
}
}
pub(crate) fn silicon_pr(
&self,
db: &PerfDatabase,
num_tokens: u32,
) -> Result<PerformanceResult, AicError> {
let is_sglang = db.backend == "sglang";
let num_tokens = if is_sglang && self.enable_eplb && self.is_context {
(num_tokens as f64 * 0.8) as u32
} else {
num_tokens
};
let tc_flops = quant_tc_flops(&db.system_spec, self.quant_mode.mapping())?;
let sol = |t: f64| self.sol_latency_ms(db, t.round() as u32, tc_flops);
if is_sglang && self.moe_backend.as_deref() == Some("deepep_moe") {
return Err(AicError::PerfDatabase(format!(
"sglang deepep_moe MoE compute is retired (AIC-1601): op {} requested the \
removed wideep context/generation MoE tables; large-EP expert compute is \
modeled by the MoeExpertCompute op",
self.name
)));
}
if num_tokens <= 128
&& self.quant_mode == MoeQuantMode::Nvfp4
&& self.is_gated
&& db.moe.low_latency_available()?
{
if let Some(ll) = db.moe.query_low_latency(
num_tokens,
self.hidden_size,
self.inter_size,
self.topk,
self.num_experts,
self.moe_tp_size,
self.moe_ep_size,
self.quant_mode,
&self.workload_distribution,
&sol,
)? {
return Ok(
PerformanceResult::with_energy(ll.latency, ll.energy, Source::Silicon)
.clamp_non_negative()
.scaled(self.scale_factor),
);
}
}
let value = db.moe.query(
num_tokens,
self.hidden_size,
self.inter_size,
self.topk,
self.num_experts,
self.moe_tp_size,
self.moe_ep_size,
self.quant_mode,
&self.workload_distribution,
&sol,
)?;
Ok(
PerformanceResult::with_energy(value.latency, value.energy, Source::Silicon)
.clamp_non_negative()
.scaled(self.scale_factor),
)
}
fn empirical_latency(&self, db: &PerfDatabase, num_tokens: u32) -> Result<f64, AicError> {
let spec = &db.system_spec;
let quant = self.quant_mode;
let num_gemms: u64 = if self.is_gated { 3 } else { 2 };
let tc_flops = quant_tc_flops(spec, quant.mapping())?;
let sol_time = moe_sol_latency_ms(
spec,
quant,
num_gemms,
num_tokens,
self.hidden_size,
self.inter_size,
self.topk,
self.num_experts,
self.moe_tp_size,
self.moe_ep_size,
tc_flops,
);
if db.backend == "sglang" && self.moe_backend.as_deref() == Some("deepep_moe") {
return Err(AicError::PerfDatabase(format!(
"sglang deepep_moe MoE compute is retired (AIC-1601): op {} requested the \
removed wideep context/generation MoE tables; large-EP expert compute is \
modeled by the MoeExpertCompute op",
self.name
)));
}
let table = if num_tokens <= 128
&& quant == MoeQuantMode::Nvfp4
&& self.is_gated
&& db.moe.low_latency_available()?
{
match self.slice_points(db, MoeTableSel::LowLatency) {
Ok(_) => MoeTableSel::LowLatency,
Err(err) if err.is_missing_perf_data() => MoeTableSel::Standard,
Err(err) => return Err(err),
}
} else {
MoeTableSel::Standard
};
let kernel_tag = table.tag();
let own_sol = |c: &[f64]| {
moe_sol_latency_ms(
spec,
quant,
num_gemms,
c[0].round() as u32,
self.hidden_size,
self.inter_size,
self.topk,
self.num_experts,
self.moe_tp_size,
self.moe_ep_size,
tc_flops,
)
};
let own_key = format!(
"moe:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}",
quant.name(),
kernel_tag,
self.topk,
self.num_experts,
self.hidden_size,
self.inter_size,
self.moe_tp_size,
self.moe_ep_size,
self.workload_distribution,
num_gemms,
);
let mut grid = db.util_grids.get_or_try_build(&own_key, || {
match self.slice_points(db, table) {
Ok(points) => Ok(Some(UtilGrid::new(util_empirical::build_samples(
points.into_iter().map(|(t, lat)| (vec![t as f64], lat)),
own_sol,
)))),
Err(err) if err.is_missing_perf_data() => Ok(None),
Err(err) => Err(err),
}
})?;
let mut util_scale = 1.0;
if grid.as_deref().is_none_or(UtilGrid::is_empty) {
let policy = db.transfer_policy;
let mut candidates: Vec<MoeReferenceCandidate> = Vec::new();
if policy.contains(TransferKind::XShape) {
self.collect_candidates(db, table, quant, quant, "xshape", &mut candidates)?;
}
if candidates.is_empty() && policy.contains(TransferKind::XQuant) {
let qp = quant.mapping();
for name in self.table_available_quants(db, table)? {
let Some(sibling) = moe_quant_from_name(&name) else {
continue;
};
let mapping = sibling.mapping();
if sibling == quant
|| mapping.memory != qp.memory
|| mapping.compute != qp.compute
{
continue;
}
self.collect_candidates(db, table, sibling, quant, "xquant", &mut candidates)?;
}
}
if let Some(reference) =
self.reference_grid(db, kernel_tag, num_gemms, policy, &candidates)?
{
grid = Some(reference);
}
if grid.as_deref().is_none_or(UtilGrid::is_empty)
&& policy.contains(TransferKind::XProfile)
{
let table_quants: Vec<MoeQuantMode> = self
.table_available_quants(db, table)?
.iter()
.filter_map(|name| moe_quant_from_name(name))
.collect();
for ref_quant in xprofile_moe_quants(quant, &table_quants) {
let mut candidates: Vec<MoeReferenceCandidate> = Vec::new();
self.collect_candidates(
db,
table,
ref_quant,
ref_quant,
"xprofile",
&mut candidates,
)?;
if let Some(reference) =
self.reference_grid(db, kernel_tag, num_gemms, policy, &candidates)?
{
if !reference.is_empty() {
grid = Some(reference);
util_scale =
moe_quant_util_level(quant) / moe_quant_util_level(ref_quant);
break;
}
}
}
}
}
let query = [num_tokens as f64];
let (latency, _) = util_empirical::estimate(sol_time, &query, grid.as_deref(), util_scale)?;
db.note_provenance(
grid.as_deref()
.and_then(|g| g.reference_provenance)
.and_then(util_empirical::ProvenanceTier::from_tag)
.unwrap_or(util_empirical::ProvenanceTier::Empirical),
);
Ok(latency)
}
fn slice_points(
&self,
db: &PerfDatabase,
table: MoeTableSel,
) -> Result<Vec<(u32, f64)>, AicError> {
db.moe.slice_points(
moe_kernel(table),
self.quant_mode.name(),
&self.workload_distribution,
self.topk,
self.num_experts,
self.hidden_size,
self.inter_size,
self.moe_tp_size,
self.moe_ep_size,
)
}
fn table_available_quants(
&self,
db: &PerfDatabase,
table: MoeTableSel,
) -> Result<Vec<String>, AicError> {
db.moe.available_quants(moe_kernel(table))
}
fn collect_candidates(
&self,
db: &PerfDatabase,
table: MoeTableSel,
source_quant: MoeQuantMode,
sol_quant: MoeQuantMode,
provenance: &'static str,
out: &mut Vec<MoeReferenceCandidate>,
) -> Result<(), AicError> {
let slices = db.moe.sibling_slices(
moe_kernel(table),
source_quant.name(),
&self.workload_distribution,
self.moe_tp_size,
self.moe_ep_size,
);
let slices = match slices {
Ok(slices) => slices,
Err(err) if err.is_missing_perf_data() => return Ok(()),
Err(err) => return Err(err),
};
out.extend(slices.into_iter().map(|slice| MoeReferenceCandidate {
slice,
ref_quant: source_quant,
sol_quant,
provenance,
}));
Ok(())
}
fn reference_grid(
&self,
db: &PerfDatabase,
kernel_tag: &str,
num_gemms: u64,
policy: TransferPolicy,
candidates: &[MoeReferenceCandidate],
) -> Result<Option<Arc<UtilGrid>>, AicError> {
if candidates.is_empty() {
return Ok(None);
}
let query_features = [
self.topk as f64,
self.num_experts as f64,
self.hidden_size as f64,
self.inter_size as f64,
];
let feature_rows: Vec<Vec<f64>> = candidates
.iter()
.map(|c| {
vec![
c.slice.topk as f64,
c.slice.num_experts as f64,
c.slice.hidden_size as f64,
c.slice.inter_size as f64,
]
})
.collect();
let chosen =
&candidates[util_empirical::nearest_candidate_index(&query_features, &feature_rows)
.expect("candidate list is non-empty")];
let spec = &db.system_spec;
let key = format!(
"moe_{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:policy={}:ref={}:{}x{}x{}x{}",
chosen.provenance,
self.quant_mode.name(),
kernel_tag,
self.topk,
self.num_experts,
self.hidden_size,
self.inter_size,
self.moe_tp_size,
self.moe_ep_size,
self.workload_distribution,
num_gemms,
policy_fingerprint(policy),
chosen.ref_quant.name(),
chosen.slice.topk,
chosen.slice.num_experts,
chosen.slice.hidden_size,
chosen.slice.inter_size,
);
db.util_grids.get_or_try_build(&key, || {
let ref_tc_flops = quant_tc_flops(spec, chosen.sol_quant.mapping())?;
let sol = |c: &[f64]| {
moe_sol_latency_ms(
spec,
chosen.sol_quant,
num_gemms,
c[0].round() as u32,
chosen.slice.hidden_size,
chosen.slice.inter_size,
chosen.slice.topk,
chosen.slice.num_experts,
self.moe_tp_size,
self.moe_ep_size,
ref_tc_flops,
)
};
let mut grid = UtilGrid::new(util_empirical::build_samples(
chosen
.slice
.points
.iter()
.map(|&(t, lat)| (vec![t as f64], lat)),
sol,
));
grid.reference_provenance = Some(chosen.provenance);
Ok(Some(grid))
})
}
fn sol_components(&self, db: &PerfDatabase, num_tokens: u32, tc_flops: f64) -> SolComponents {
let num_gemms: u64 = if self.is_gated { 3 } else { 2 };
moe_sol(
&db.system_spec,
self.quant_mode,
num_gemms,
num_tokens,
self.hidden_size,
self.inter_size,
self.topk,
self.num_experts,
self.moe_tp_size,
self.moe_ep_size,
tc_flops,
)
}
fn sol_latency_ms(&self, db: &PerfDatabase, num_tokens: u32, tc_flops: f64) -> f64 {
self.sol_components(db, num_tokens, tc_flops).time_ms()
}
}
#[allow(clippy::too_many_arguments)]
fn moe_sol(
spec: &SystemSpec,
quant: MoeQuantMode,
num_gemms: u64,
num_tokens: u32,
hidden_size: u32,
inter_size: u32,
topk: u32,
num_experts: u32,
moe_tp_size: u32,
moe_ep_size: u32,
tc_flops: f64,
) -> SolComponents {
let total_tokens = num_tokens as u64 * topk as u64;
let moe_expert_compute = (moe_ep_size as u64).max(1);
let moe_tp = (moe_tp_size as u64).max(1);
let h = hidden_size as u64;
let inter = inter_size as u64;
let ne = num_experts as u64;
let ops = total_tokens * h * inter * num_gemms * 2 / moe_expert_compute / moe_tp;
let mem_bytes_int = total_tokens / moe_expert_compute * h * 2 + total_tokens / moe_expert_compute * inter * num_gemms / moe_tp + h * inter * num_gemms / moe_tp
* std::cmp::min(ne / moe_expert_compute, total_tokens / moe_expert_compute);
let mem_bytes = (mem_bytes_int as f64) * quant.mapping().memory;
let sol_math = (ops as f64) / tc_flops * 1000.0;
let sol_mem = mem_bytes / spec.gpu.mem_bw * 1000.0;
SolComponents::new(sol_math, sol_mem)
}
#[allow(clippy::too_many_arguments)]
fn moe_sol_latency_ms(
spec: &SystemSpec,
quant: MoeQuantMode,
num_gemms: u64,
num_tokens: u32,
hidden_size: u32,
inter_size: u32,
topk: u32,
num_experts: u32,
moe_tp_size: u32,
moe_ep_size: u32,
tc_flops: f64,
) -> f64 {
moe_sol(
spec,
quant,
num_gemms,
num_tokens,
hidden_size,
inter_size,
topk,
num_experts,
moe_tp_size,
moe_ep_size,
tc_flops,
)
.time_ms()
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
fn b200_vllm_db() -> PerfDatabase {
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("../..")
.join("src/aiconfigurator_core/systems");
PerfDatabase::load(&root, "b200_sxm", "vllm", "0.19.0").expect("db loads")
}
fn op(attention_dp_size: u32) -> MoeOp {
MoeOp {
name: "moe".into(),
scale_factor: 1.0,
hidden_size: 7168,
inter_size: 2048,
topk: 8,
num_experts: 256,
moe_tp_size: 1,
moe_ep_size: 8,
quant_mode: MoeQuantMode::Fp8Block,
workload_distribution: "power_law_1.2".into(),
attention_dp_size,
is_gated: true,
moe_backend: None,
enable_eplb: false,
is_context: false,
}
}
fn b200_trtllm_db() -> PerfDatabase {
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("../..")
.join("src/aiconfigurator_core/systems");
PerfDatabase::load(&root, "b200_sxm", "trtllm", "1.3.0rc20").expect("db loads")
}
const CONSERVATIVE: TransferPolicy = TransferPolicy {
xshape: true,
xquant: false,
xprofile: false,
xop: false,
};
fn qwen3_op(quant: MoeQuantMode) -> MoeOp {
MoeOp {
name: "moe".into(),
scale_factor: 1.0,
hidden_size: 4096,
inter_size: 1536,
topk: 8,
num_experts: 128,
moe_tp_size: 1,
moe_ep_size: 8,
quant_mode: quant,
workload_distribution: "power_law_1.2".into(),
attention_dp_size: 1,
is_gated: true,
moe_backend: None,
enable_eplb: false,
is_context: false,
}
}
fn assert_routing(result: &PerformanceResult, source: Source, label: &str) {
assert!(
result.latency_ms.is_finite() && result.latency_ms > 0.0,
"{label}: expected positive latency, got {}",
result.latency_ms
);
assert_eq!(result.source, source, "{label}: wrong source");
}
#[test]
fn moe_empirical_own_shape_matches_python_oracles() {
let db = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Empirical,
TransferPolicy::ALL,
);
let op = qwen3_op(MoeQuantMode::Bfloat16);
let r333 = op.query(&db, 333).expect("own-shape empirical t=333");
assert_routing(&r333, Source::Empirical, "own_emp_t333");
let r96 = op.query(&db, 96).expect("own-shape empirical t=96");
assert_routing(&r96, Source::Empirical, "own_emp_t96");
assert_eq!(
db.worst_provenance(),
util_empirical::ProvenanceTier::Empirical
);
}
#[test]
fn moe_hybrid_prefers_silicon_when_covered() {
let db = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::ALL,
);
let op = qwen3_op(MoeQuantMode::Bfloat16);
let hit = op.query(&db, 128).expect("collected token point");
assert_routing(&hit, Source::Silicon, "hyb_silicon_t128");
let interp = op.query(&db, 333).expect("in-range token interp");
assert_routing(&interp, Source::Silicon, "hyb_t333");
}
#[test]
fn moe_xquant_transfer_matches_python_oracle() {
let db = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::ALL,
);
let op = qwen3_op(MoeQuantMode::W4a16Mxfp4Cutlass);
let r = op.query(&db, 96).expect("xquant transfer");
assert_routing(&r, Source::Empirical, "xquant_t96");
assert_eq!(
db.worst_provenance(),
util_empirical::ProvenanceTier::XQuant
);
}
#[test]
fn moe_xprofile_transfer_matches_python_oracle() {
let db = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::ALL,
);
let op = qwen3_op(MoeQuantMode::W4afp8);
let r = op.query(&db, 96).expect("xprofile transfer");
assert_routing(&r, Source::Empirical, "xprofile_t96");
assert_eq!(
db.worst_provenance(),
util_empirical::ProvenanceTier::XProfile
);
}
#[test]
fn moe_xshape_transfer_matches_python_oracle() {
let mut op = qwen3_op(MoeQuantMode::Bfloat16);
op.inter_size = 1600;
let db = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::ALL,
);
let r = op.query(&db, 96).expect("xshape transfer");
assert_routing(&r, Source::Empirical, "xshape_t96");
assert_eq!(
db.worst_provenance(),
util_empirical::ProvenanceTier::XShape
);
let conservative =
b200_vllm_db().with_mode(crate::common::enums::DatabaseMode::Hybrid, CONSERVATIVE);
let rc = op
.query(&conservative, 96)
.expect("xshape under conservative policy");
assert_routing(&rc, Source::Empirical, "conservative_xshape_t96");
}
#[test]
fn moe_transfer_policy_gates_tiers() {
let op = qwen3_op(MoeQuantMode::W4a16Mxfp4Cutlass);
let off = b200_vllm_db().with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::OFF,
);
let blocked = op.query(&off, 96);
assert!(
matches!(blocked, Err(AicError::EmpiricalNotImplemented(_))),
"off policy must surface the typed empirical miss, got {blocked:?}"
);
let conservative =
b200_vllm_db().with_mode(crate::common::enums::DatabaseMode::Hybrid, CONSERVATIVE);
let blocked = op.query(&conservative, 96);
assert!(
matches!(blocked, Err(AicError::EmpiricalNotImplemented(_))),
"conservative policy must not reach the xquant tier, got {blocked:?}"
);
}
#[test]
fn moe_nvfp4_wo_ladder_matches_python_oracle() {
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("../..")
.join("src/aiconfigurator_core/systems");
let db = PerfDatabase::load(&root, "h200_sxm", "vllm", "0.19.0")
.expect("h200/vllm/0.19.0 db loads")
.with_mode(
crate::common::enums::DatabaseMode::Hybrid,
TransferPolicy::ALL,
);
let op = MoeOp {
name: "moe-nvfp4wo-ladder".into(),
scale_factor: 1.0,
hidden_size: 7168,
inter_size: 2048,
topk: 8,
num_experts: 256,
moe_tp_size: 1,
moe_ep_size: 1,
quant_mode: MoeQuantMode::Nvfp4Wo,
workload_distribution: "power_law_1.2".into(),
attention_dp_size: 1,
is_gated: true,
moe_backend: None,
enable_eplb: false,
is_context: false,
};
let r = op
.query(&db, 96)
.expect("nvfp4_wo resolves via XPROFILE ladder");
assert_routing(&r, Source::Empirical, "nvfp4_wo_ladder_t96");
}
#[test]
fn moe_empirical_low_latency_table_selection_matches_python_oracles() {
let db = b200_trtllm_db().with_mode(
crate::common::enums::DatabaseMode::Empirical,
TransferPolicy::ALL,
);
let op = MoeOp {
name: "moe-ll".into(),
scale_factor: 1.0,
hidden_size: 6144,
inter_size: 16384,
topk: 2,
num_experts: 8,
moe_tp_size: 32,
moe_ep_size: 1,
quant_mode: MoeQuantMode::Nvfp4,
workload_distribution: "balanced".into(),
attention_dp_size: 1,
is_gated: true,
moe_backend: None,
enable_eplb: false,
is_context: false,
};
let ll = op.query(&db, 100).expect("ll-table empirical t=100");
assert_routing(&ll, Source::Empirical, "ll_own_t100");
let std_table = op.query(&db, 200).expect("std-table empirical t=200");
assert_routing(&std_table, Source::Empirical, "std_own_t200");
let mut off_shape = op.clone();
off_shape.inter_size = 17000;
let xshape = off_shape
.query(&db, 100)
.expect("failed ll probe -> std xshape");
assert_routing(&xshape, Source::Empirical, "nvfp4_xshape_t100");
}
#[test]
fn moe_query_scales_tokens_by_attention_dp() {
let db = b200_vllm_db();
let with_dp = op(4).query(&db, 1000).expect("dp=4 query");
let equivalent = op(1).query(&db, 4000).expect("dp=1 query");
assert!(
(with_dp.latency_ms - equivalent.latency_ms).abs() < 1e-12,
"dp=4 @ 1000 tokens ({}) must equal dp=1 @ 4000 tokens ({})",
with_dp.latency_ms,
equivalent.latency_ms
);
assert!(with_dp.latency_ms > op(1).query(&db, 1000).unwrap().latency_ms);
}
#[test]
fn moe_sol_mode_returns_roofline_with_sol_source() {
let mut db = b200_vllm_db();
db.database_mode = crate::common::enums::DatabaseMode::Sol;
let op = op(2); let result = op.query(&db, 256).expect("moe sol");
let tc_flops = quant_tc_flops(&db.system_spec, op.quant_mode.mapping()).unwrap();
let expected = op.sol_latency_ms(&db, 512, tc_flops);
assert_eq!(result.latency_ms, expected);
assert_eq!(result.source, Source::Sol);
assert_eq!(result.energy_wms, 0.0);
}
}