MoE Model Verification
Worker-Verifier model identity experiments using log probabilities and expert routing.
CitationThese experiments, figures and data files are published by the TrueOpen.ai team. When citing or redistributing them, in whole or in part, state that the source is the TrueOpen.ai team and link to www.trueopen.ai. The same requirement is repeated in the download bundle's README, in CITATION.txt, and in the header of every CSV file.
Worker-Verifier Method
Worker Evidence
The worker performs normal decode generation and records the following evidence:
input_ids
output_ids
worker_selected_logprob[d]
worker_selected_rank[d]
worker_topk_logprobs[d]
Here, d is the output token depth. The worker generation stage can use greedy decoding or sampling. In the main experiments, we use:
temperature = 0.0
top_p = 1.0
top_k = 0
max_new_tokens = 128
Verifier Replay
The verifier does not regenerate text. Instead, it fixes the path submitted by the worker:
full_prompt_ids = input_ids + output_ids
It then uses vLLM prompt logprobs to perform full-prefill replay. For output token output_ids[d], the verifier alignment position is:
prompt_pos = len(input_ids) + d
Therefore, the comparison is between the model distributions produced by the worker and verifier on the exact same token path, rather than a text similarity comparison between two freely generated outputs.
Logprob Metrics
This paper mainly uses the following metrics:
| Metric | Meaning |
|---|---|
abs_logprob_diff |
abs(worker_selected_logprob - verifier_selected_logprob) |
p95/p99/p999 |
Percentiles of abs_logprob_diff |
rank_delta_rate |
Fraction of selected tokens whose rank changes |
topk_jaccard |
Jaccard overlap between worker/verifier top-k token sets |
union_js |
Jensen-Shannon divergence over the top-k union |
missing_selected_count |
Number of worker selected tokens not returned by the verifier logprobs |
It is important to emphasize that these experiments compare selected/top-k logprobs exposed by vLLM, not full-vocabulary raw logits.
MoE Logprob Experiments
Qwen3.6-35B-A3B Setup
The MoE experiments use Qwen/Qwen3.6-35B-A3B and include two main datasets:
- A 300-sample experiment for detailed analysis of BF16 baseline spikes, FP8 right shift, and window-level decision metrics.
- A 5000-sample
moe_1experiment to confirm BF16/FP8 worker-verifier directionality at larger scale.
300-Sample MoE Results
| run | verifier quant | mean | p50 | p95 | p99 | p999 | max | rank_delta_rate | jaccard p05 | union_js p99 |
|---|---|---|---|---|---|---|---|---|---|---|
| BF16 original | BF16 | 0.0591 | 0.000606 | 0.1432 | 0.4331 | 11.1895 | 24.1029 | 0.0251 | 0.7297 | 0.0582 |
| BF16 replicate 0001 | BF16 | 0.0540 | 0.000525 | 0.1196 | 0.3665 | 10.1542 | 25.4778 | 0.0224 | 0.7297 | 0.0530 |
| BF16 replicate 0002 | BF16 | 0.0572 | 0.000568 | 0.1362 | 0.4208 | 10.5622 | 25.5559 | 0.0237 | 0.7297 | 0.0557 |
| BF16 replicate 0003 | BF16 | 0.0622 | 0.000619 | 0.1423 | 0.4181 | 11.8944 | 24.1498 | 0.0246 | 0.7297 | 0.0636 |
| FP8 verifier | FP8 | 0.0848 | 0.001088 | 0.2278 | 0.6729 | 12.6798 | 27.5559 | 0.0364 | 0.6842 | 0.1165 |
From mean, p95, p99, rank_delta_rate, and union_js_p99, the FP8 verifier does show a statistical right shift relative to the BF16 verifier. However, the MoE same-model BF16 baseline already has an extreme heavy tail:
BF16 p50 approx. 5e-4
BF16 p99 approx. 0.36 - 0.43
BF16 p999 approx. 10 - 12
BF16 max approx. 24 - 26
In other words, most tokens have very small differences, but a small number of tokens can produce extremely large logprob differences. This makes it difficult for a MoE logprob verifier to form a clean hard decision boundary using single-token thresholds or simple percentiles.
MoE Spike Pattern
The four BF16 baselines show:
| threshold | BF16 token rate | pattern |
|---|---|---|
abs_diff > 1 |
0.53% - 0.62% | 92.8% - 94.3% are isolated single-point runs |
pooled BF16 p99=0.4082 |
0.89% - 1.07% | about 90% of spike runs are single-point |
pooled BF16 p999=11.123 |
0.086% - 0.115% | 96.9% - 100% of spike runs are single-point |
These spikes are not purely random noise. Using (sample_id, depth) as the location, among spike locations with abs_diff > 1:
| condition | ratio |
|---|---|
| Appears in at least 2 BF16 runs | 65.1% |
| Appears in at least 3 BF16 runs | 43.6% |
| Appears in all 4 BF16 runs | 21.5% |
This suggests that spikes are tied to specific tokens or contexts, likely related to MoE routing boundaries, decode/prefill computation path differences, or kernel scheduling. Regardless of the root cause, they destroy the clean decision boundary required by a logprob verifier.
Window-Level Statistics Help, But Do Not Fully Solve the Problem
Using window medians can reduce the BF16 tail:
| run | token p99 | window=5 median p99 | window=16 median p99 |
|---|---|---|---|
| BF16 original | 0.4331 | 0.1101 | 0.0513 |
| BF16 0001 | 0.3665 | 0.0972 | 0.0437 |
| BF16 0002 | 0.4208 | 0.1131 | 0.0540 |
| BF16 0003 | 0.4181 | 0.1124 | 0.0537 |
| FP8 | 0.6729 | 0.1685 | 0.0802 |
When using the pooled BF16 window p99 as the threshold:
| window | BF16 bad-rate range | FP8 bad rate |
|---|---|---|
| 3 | 0.79% - 1.08% | 2.99% |
| 5 | 0.78% - 1.13% | 3.41% |
| 16 | 0.65% - 1.17% | 4.66% |
| 32 | 0.50% - 1.22% | 5.07% |
This shows that window-level statistics can reveal the systematic FP8 shift. However, this remains a statistical separation rather than a clean and stable model identity boundary like the one observed for dense models. MoE logprobs provide useful evidence, but should not be used as the sole final identity verifier.
5000-Sample MoE Results
The large-scale moe_1 experiment contains 5000 prompts with the following input buckets:
32, 128, 512, 2048, 8192
Each bucket has 1000 prompts. Both worker and verifier run on 6000ws, with vLLM version 0.27.1 and logprobs/top-k set to 64.
| worker evidence | verifier | runs | rows | mean | p50 | p95 | p99 | p999 | max | rank_rate | union_js_p99 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| BF16 worker | BF16 verifier | 3 | 531030 | 0.0816 | 0.000656 | 0.1700 | 0.6349 | 14.6015 | 32.1399 | 0.0305 | 0.1252 |
| BF16 worker | FP8 verifier | 1 | 531030 | 0.0873 | 0.000952 | 0.2298 | 0.7324 | 13.5771 | 29.3174 | 0.0371 | 0.1273 |
| FP8 worker | BF16 verifier | 3 | 536996 | 0.0974 | 0.000725 | 0.2362 | 0.8344 | 15.4485 | 28.2228 | 0.0386 | 0.1565 |
These results reinforce the earlier conclusion: MoE logprobs can reveal an overall distributional difference between BF16 and FP8, but the same-model BF16 baseline already has large p99/p999/max values. As a result, FP8 and BF16 do not separate as cleanly as they do for dense models.
Routed Experts Experiments
MoE also has experiments comparing different GPUs, but the core evidence comes from routed_experts rather than the 5000-sample logprob overall results above. The route reports cover BF16/FP8 same-model and cross-model comparisons across 6000ws and H100, and are used to verify whether expert routing fingerprints remain distinguishable across GPUs.
Method
In addition to the output token distribution, a MoE model selects routed experts for each token at each MoE layer. When vLLM is enabled with:
--enable-return-routed-experts
it can return the expert routing result for each token/layer. The experiment compares:
decode-time routed_experts
vs
prefill-time routed_experts
and computes:
| Metric | Meaning |
|---|---|
entry_mismatch_rate |
Order-sensitive mismatch for token/layer/top-k slots |
token_layer_set_match_rate |
Whether the top-k expert set matches for each token/layer |
token_match_rate |
Whether all layer/top-k routes of a token match |
mean_topk_jaccard |
Average Jaccard similarity of routed expert top-k sets |
Routed Experts Results
| case | same_model | cross_model | samples | layers | tokens | entry_mismatch_rate | token_layer_set_match_rate | mean_topk_jaccard |
|---|---|---|---|---|---|---|---|---|
| 6000_bf16_vs_bf16 | 1000 | 0 | 1000 | all | 123616 | 0.1919 | 0.7690 | 0.9430 |
| 6000_bf16_vs_h100_bf16 | 1000 | 0 | 1000 | all | 123616 | 0.1910 | 0.7700 | 0.9433 |
| h100_bf16_vs_bf16 | 1000 | 0 | 1000 | all | 123921 | 0.1889 | 0.7722 | 0.9438 |
| 6000_fp8_vs_fp8 | 1000 | 0 | 1000 | all | 123695 | 0.2725 | 0.6701 | 0.9164 |
| 6000_fp8_vs_h100_fp8 | 1000 | 0 | 1000 | all | 123695 | 0.2730 | 0.6692 | 0.9163 |
| h100_fp8_vs_fp8 | 1000 | 0 | 1000 | all | 124354 | 0.2658 | 0.6784 | 0.9188 |
| 6000_bf16_vs_fp8 | 0 | 1000 | 1000 | all | 123616 | 0.2922 | 0.6452 | 0.9097 |
| 6000_bf16_vs_h100_fp8 | 0 | 1000 | 1000 | all | 123616 | 0.2915 | 0.6462 | 0.9100 |
| h100_bf16_vs_fp8 | 0 | 1000 | 1000 | all | 123921 | 0.2941 | 0.6426 | 0.9088 |
| 6000_fp8_vs_bf16 | 0 | 1000 | 1000 | all | 123695 | 0.2926 | 0.6446 | 0.9092 |
| 6000_fp8_vs_h100_bf16 | 0 | 1000 | 1000 | all | 123695 | 0.2928 | 0.6443 | 0.9091 |
| h100_fp8_vs_bf16 | 0 | 1000 | 1000 | all | 124354 | 0.2932 | 0.6434 | 0.9088 |
The all-layer route results show that MoE routed_experts already covers same-model and cross-model comparisons across 6000ws/H100:
- BF16 same-model: entry mismatch is about
0.189-0.192 - FP8 same-model: entry mismatch is about
0.266-0.273 - BF16/FP8 cross-model: entry mismatch is about
0.292-0.294
Therefore, routed experts can distinguish BF16 same-model from BF16/FP8 cross-model cases. FP8 same-model and cross-model are closer under all-layer metrics, but can be further separated using early-layer metrics.
Early-Layer Route Fingerprint
When observing only the first few layers, same-model and cross-model cases separate more clearly:
| case | layers | entry_mismatch_rate | token_layer_set_match_rate | token_match_rate | mean_topk_jaccard |
|---|---|---|---|---|---|
| 6000_bf16_vs_fp8_layers_0 | 0 | 0.1134 | 0.8871 | 0.5912 | 0.9744 |
| 6000_bf16_vs_fp8_layers_0_1 | 0,1 | 0.1318 | 0.8621 | 0.3086 | 0.9685 |
| 6000_bf16_vs_fp8_layers_0_4 | 0-4 | 0.1694 | 0.8111 | 0.0292 | 0.9563 |
| 6000_fp8_vs_fp8_layers_0 | 0 | 0.0492 | 0.9504 | 0.8009 | 0.9890 |
| 6000_fp8_vs_fp8_layers_0_1 | 0,1 | 0.0764 | 0.9190 | 0.5085 | 0.9820 |
| 6000_fp8_vs_fp8_layers_0_4 | 0-4 | 0.1262 | 0.8592 | 0.0756 | 0.9680 |
At layer 0, FP8 same-model has an entry mismatch of 0.0492, while BF16/FP8 cross-model has 0.1134; token-layer set match also drops from 0.9504 to 0.8871. This shows that the early-layer routed_experts route can serve as a stronger structural fingerprint.
More importantly, layer 0 is not merely a reduced-layer approximation that happens to work; in the current data, it is better suited for MoE identity verification than all-layer aggregation. In all-layer metrics, FP8 same-model entry mismatch is about 0.266-0.273, while BF16/FP8 cross-model is about 0.292-0.294, a gap of only about 0.02. At layer 0, however, FP8 same-model is 0.0492 and BF16/FP8 cross-model is 0.1134, increasing the absolute gap to 0.0642, with a cross/same ratio of about 2.30x. The BF16 verifier layer-0 cross-GPU check shows the same trend: BF16 positives have single-sample means around 0.024-0.029, while FP8 negatives are around 0.115-0.117, producing a much clearer separation.
The cross-GPU random-5 threshold test further supports this conclusion. Using only layer 0 and aggregating entry mismatch over 5 randomly sampled prompts each time, the BF16 verifier with threshold 0.060 achieves a combined TPR of 1.000000 and a negative false pass rate of 0.000000. The FP8 verifier with threshold 0.080 achieves a TPR of 0.999453, while the negative false pass rate remains 0.000000. This shows that the layer-0 route fingerprint is not an artifact of a single report, but remains stable under 6000ws/H100 cross-GPU comparisons.
Why Layer 0 Outperforms All Layers
At first glance, using all MoE layers might appear to contain more information. However, the experiments show that all-layer aggregation mixes identity signal with path noise. There are three main reasons.
First, the routing input to later MoE layers has already been affected by earlier layer outputs. Even for the same model, decode-time versus prefill-time execution, small hardware/kernel numerical differences, batch composition, and similar factors can move some tokens across a router decision boundary in later layers. These later-layer mismatches raise the same-model baseline and increase the all-layer entry mismatch.
Second, averaging over all layers dilutes the most discriminative early-layer differences. Layer 0 acts directly on the embedding and original context representation, before multiple rounds of expert selection have propagated errors. It is therefore closer to an initial routing signature: same-model layer-0 routes are more stable, while BF16/FP8 or different-model router boundary differences are already visible.
Third, cross-layer token-level exact match is an overly strict metric. As the number of layers grows, a boundary flip in any single layer can reduce token_match_rate, quickly pushing all-layer token_match into a low-value region and reducing discriminative power. In contrast, layer-0 entry mismatch and token-layer set match preserve a larger dynamic range, making thresholds easier to set.
Therefore, for MoE routed_experts verifiers, we recommend using layer 0 as the primary criterion or a strong feature. All-layer route diff is better suited as an auxiliary diagnostic for understanding the source of routing drift, rather than as a replacement for the layer-0 identity fingerprint.
Why Routed Experts Are Better Suited for MoE
MoE output logprobs are affected by expert routing, batch composition, and decode/prefill path differences. Even when the model weights are identical, if some tokens lie near a routing boundary, the selected logprob can produce extreme spikes. Logprob is the final projection of the output distribution and cannot directly explain whether these spikes come from model differences, path differences, or routing-sensitive points.
routed_experts directly exposes a structural intermediate state of the MoE model:
input/context -> router -> selected experts
If two models, two quantization settings, or two execution paths differ in expert selection, this difference appears before the final logprob. Thus, routed_experts is a more natural verifier for MoE identity: it verifies the key internal decision of the MoE architecture, rather than only the resulting output probabilities.
Limitations
- The logprob experiments use selected/top-k logprobs exposed by vLLM, not full-vocabulary raw logits.
- The output length limit is mainly 128 tokens; long-output settings require separate calibration.
- The main Dense 32B experiment uses
6000ws worker evidenceand does not cover every worker/verifier direction. - MoE logprobs already fail to form a clean and robust decision boundary in the same-GPU setting, so cross-GPU logprob verification is not a key missing experiment required for the paper's conclusion. MoE cross-GPU stability should mainly be verified through routed_experts, especially the layer-0 route fingerprint.
- routed_experts experiments already cover 6000ws/H100 cross-GPU comparisons. For production deployment, the vLLM version, prefix cache, batching policy, and routed_experts return format should still be fixed or calibrated.
- This paper studies statistical identity verification, not a cryptographic proof.
