Skip to content

feat: add tract_moe_ffn operator for Mixture-of-Experts FFN - #2084

Open
JulienBalianSonos wants to merge 42 commits into
mainfrom
feat/moe-ffn-operator
Open

feat: add tract_moe_ffn operator for Mixture-of-Experts FFN#2084
JulienBalianSonos wants to merge 42 commits into
mainfrom
feat/moe-ffn-operator

Conversation

@JulienBalianSonos

@JulienBalianSonos JulienBalianSonos commented Mar 30, 2026

Copy link
Copy Markdown
Collaborator

Implements the tract_moe_ffn operator in the tract_transformers extension, enabling inference of routed Mixture-of-Experts FFN blocks exported via torch_to_nnef.

The operator encapsulates the full MoE FFN block:

  • Router: x @ wg.T followed by top-k expert selection.
  • Gating modes:
    • softmax over the selected top-k experts
    • softmax over all experts, then gather top-k without renormalization
    • raw / already-normalized top-k weights
  • Token grouping: batch selected tokens per expert for efficient GEMM.
  • Expert FFN: activation(x @ w1) * (x @ w3) followed by @ w2 for SwiGLU-style experts.
  • Weighted scatter-add of expert outputs.

Real conditional compute: unused experts are fully skipped. The op handles both 2D [T,D] and 3D [B,S,D] input shapes.

Model Coverage

The implemented semantics cover the routed FFN variants used by:

  • Granite / Mixtral-style MoE: top-k routing, softmax-over-top-k gating, SwiGLU experts.
  • OLMoE-style MoE: router softmax over all experts, gather top-k, no top-k renormalization.
  • OpenAI GPT-OSS-style MoE: optional router/expert biases and clamped SwiGLU.
  • Qwen3 / Qwen3.5-style MoE: top-k routing with configurable top-k probability normalization.

Current validation:

  • Bit-exact against PyTorch on TitanML/tiny-mixtral (8 experts, top-2, 246M params).
  • End-to-end NNEF regression on a sanitized Qwen3 tiny MoE graph.
  • Full-model local validation on a Granite MoE GPTQ/Q40 export with Q40 experts and embeddings, keeping routing in full precision.

Granite MoE Benchmark

Local release measurements on Apple Silicon. The benchmark artifact is not included in this PR.

Model / path Backend Prompt / decode KV path Throughput
Granite MoE GPTQ/Q40 experts + embeddings Metal 5 / 64 unfolded 77.68 tok/s
Granite MoE GPTQ/Q40 experts + embeddings Metal 5 / 64 stateful 78.66 tok/s
Granite MoE GPTQ/Q40 experts + embeddings Metal 51 / 128 unfolded 73.86 tok/s
Granite MoE GPTQ/Q40 experts + embeddings Metal 51 / 128 stateful 74.47 tok/s
Granite MoE GPTQ/Q40 experts + embeddings Metal 51 / 512 unfolded 65.04 tok/s
Granite MoE GPTQ/Q40 experts + embeddings Metal 51 / 512 stateful 65.35 tok/s
Granite MoE GPTQ/Q40 experts + embeddings CPU 51 / 128 unfolded 40.63 tok/s

Additional steady-state Metal harness results on the same model family:

Variant PP512 TG128
Q40 MoE no-SDPA reference 1280.3 tok/s 123.5 tok/s
mixed SDPA, f16 input / f32 accumulation 1254.6 tok/s 122.0 tok/s
old SDPA f32-boundary casts 1128.2 tok/s 119.4 tok/s

Implements the tract_moe_ffn operator in the tract_transformers
extension, enabling inference of MoE-based models (Mixtral, GPT-OSS,
Qwen MoE) exported via torch_to_nnef.

The operator encapsulates the full MoE FFN block:
- Router: x @ wg.T -> top-k expert selection with softmax gating
- Token grouping: batch tokens per expert for efficient GEMM
- Expert FFN: SwiGLU (silu(x@w1) * (x@w3)) @ w2 with BLAS-backed matmul
- Weighted scatter-add of expert outputs

Real conditional compute: unused experts are fully skipped.
Handles both 2D [T,D] and 3D [B,S,D] input shapes.

Verified bit-exact against PyTorch on TitanML/tiny-mixtral (8 experts,
top-2, 246M params).
…clamped-swiglu act_alpha/act_limit; codegen keeps biased/clamped path on reference eval)
…n (no router_logits, no rank-align unsqueeze)
…ax_all|sigmoid|raw); fix stale op unit tests (single-output + gate); regen harness asset
… native dtype, cast output back); compute router in f32 to stabilize top-k selection vs PyTorch; f16-faithful weighted scatter
…rch CPU f32 matmul accumulation; native-f16 accumulation derailed greedy decoding
@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s)

Reference: main nightly, latest 2026-07-09 (0d old) · PR dfd2901db · ran on apple-m1-max, i9-11900kb_rtx-4060, jetson-orin-nx · 791 metrics compared

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 -4.8% openelm_270M_q40ef16_541
decode · cpu
apple-m1-max 79.54 tok/s → 75.75 tok/s

lower is better except prefill/decode (tok/s) · adaptive thresholds (max(floor, k×noise) vs the series' own history) · single-shot vs nightly reference · full report → run

The routed Q40 path handles the fully block-quantized case; models that
fall back to per-expert subplans still went through them one at a time,
both when building and when evaluating.

Build: each plan slices its own expert out of the shared weight tensors
and optimizes an independent sub-model, which includes prepacking that
expert's weights. Serially that is layers x experts optimizations on the
model-load critical path, 768 of them for a 24-layer 32-expert model
(measured 62s). Spread them over rayon's global pool, as FlashSdpa
already does for its heads.

Eval: a prompt pass with top-k routing lights up nearly every expert in
every layer, and each expert's matmuls are too narrow to fill the machine
alone. Run the active experts concurrently and keep the weighted scatter
serial and in fixed expert order so the reduction stays deterministic.

`OpState` is deliberately not `Send`, so experts can no longer share
long-lived pre-spawned states. Expert sub-models are stateless matmuls,
so spawn per eval and drop the per-expert states from the op state
entirely; only the router keeps one.

Measured on a 20B gpt-oss-style export on the subplan path: prepare
62s -> 13s, decode 4.9 -> 7.3 tok/s, output byte-identical.
build_expert_plan upcast every non-block-quant expert weight to f32. For
a mixed-precision export that weight is the bulk of the model: gpt-oss
keeps the down projection in f16, about 12.7GB of a 22GB export, so the
upcast doubled it and cost both prepare time and decode bandwidth.

Keep f16 weights as they were exported; the matmul still accumulates in
f32. Measured on a 20B gpt-oss export, subplan path:
prepare 20.9s -> 12.1s, prefill 7.0s -> 2.8s, decode 5.6 -> 9.0 tok/s,
output unchanged.
@github-actions

Copy link
Copy Markdown

🔴 Bench vs main — 40 speed regression(s) · 12 load/memory

Reference: main nightly, latest 2026-07-28 (0d old) · PR 0343bb678 · ran on apple-m1-max, i9-11900kb_rtx-4060, jetson-orin-nx · 727 metrics compared

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +379.7% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · cpu
apple-m1-max 1.06 ms → 5.09 ms
🔴 +370.3% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · cpu
i9-11900kb_rtx-4060 0.806 ms → 3.79 ms
🔴 +215.5% en_tdnn_pyt_15M
evaltime · pulse_120ms
i9-11900kb_rtx-4060 2.95 ms → 9.29 ms
🔴 +189.9% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · cpu
i9-11900kb_rtx-4060 241 ms → 698 ms
🔴 +142.3% en_tdnn_pyt_15M
evaltime · pulse_120ms
apple-m1-max 1.69 ms → 4.1 ms
🔴 +102.2% en_tdnn_15M
evaltime · 2600ms
i9-11900kb_rtx-4060 46.9 ms → 94.9 ms
🔴 +73.5% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · cpu
apple-m1-max 124 ms → 216 ms
🔴 +59.6% en_tdnn_15M
evaltime · pulse_120ms
apple-m1-max 2.36 ms → 3.76 ms
🔴 +59.3% dummy_conmer_12M
evaltime · pulse_120ms
apple-m1-max 1.97 ms → 3.13 ms
🔴 +51.0% en_tdnn_8M
evaltime · pulse_120ms
apple-m1-max 1.2 ms → 1.82 ms
🔴 +50.1% en_tdnn_8M
evaltime · 2600ms
i9-11900kb_rtx-4060 22.9 ms → 34.3 ms
🔴 +47.8% trunet
evaltime · pulse1_f16
apple-m1-max 0.291 ms → 0.429 ms
🔴 +46.9% hey_snips_v4_model17
evaltime · 2sec
apple-m1-max 0.981 ms → 1.44 ms
🔴 +38.1% mobilenet_v1_1
evaltime · pass
i9-11900kb_rtx-4060 35.7 ms → 49.2 ms
🔴 +31.6% en_tdnn_8M
evaltime · pulse_120ms
i9-11900kb_rtx-4060 1.94 ms → 2.55 ms
🔴 +28.3% en_tdnn_15M
evaltime · pulse_240ms
i9-11900kb_rtx-4060 6.01 ms → 7.71 ms
🔴 +28.1% en_tdnn_15M_nnef
evaltime · pulse_240ms
i9-11900kb_rtx-4060 5.9 ms → 7.55 ms
🔴 +27.7% en_tdnn_8M
evaltime · pulse_180ms
apple-m1-max 1.7 ms → 2.17 ms
🔴 +25.3% inceptionv3
evaltime · pass
i9-11900kb_rtx-4060 154 ms → 192 ms
🔴 +20.2% mobilenet_v2_1
evaltime · pass
i9-11900kb_rtx-4060 54.6 ms → 65.6 ms
🔴 +19.8% arm_ml_kws_cnn_m
evaltime · pass
apple-m1-max 0.123 ms → 0.148 ms
🔴 +19.5% en_tdnn_15M
evaltime · pulse_240ms
apple-m1-max 4.04 ms → 4.82 ms
🔴 +18.2% trunet
evaltime · pulse1_f32
apple-m1-max 0.164 ms → 0.194 ms
🔴 +16.5% speaker_id
evaltime · pulse8
i9-11900kb_rtx-4060 0.0624 ms → 0.0727 ms
🔴 +15.4% hey_snips_v1
evaltime · 400ms
i9-11900kb_rtx-4060 0.184 ms → 0.213 ms
🔴 +15.0% en_tdnn_15M_nnef
evaltime · pulse_240ms
apple-m1-max 4.08 ms → 4.7 ms
🔴 +11.6% speaker_id
evaltime · pulse8
apple-m1-max 0.0596 ms → 0.0666 ms
🔴 +10.2% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · cuda
i9-11900kb_rtx-4060 0.0858 ms → 0.0946 ms
🔴 +9.9% mdl_en_2019_Q3_librispeech_onnx
evaltime · pulse_240ms
apple-m1-max 0.733 ms → 0.805 ms
🔴 -9.9% llama_3_2_1B_instruct_q40ef16_541
prefill · cpu
apple-m1-max 84.63 tok/s → 76.25 tok/s
🔴 +9.6% voicecom_fake_quant
evaltime · 2sec
apple-m1-max 1.5 ms → 1.64 ms
🔴 +9.6% hey_snips_v4_model17
evaltime · pulse8
i9-11900kb_rtx-4060 0.131 ms → 0.144 ms
🔴 +8.5% parakeet_tdt_600m_v3_f32f32_decoder_pass
evaltime · cuda
i9-11900kb_rtx-4060 0.24 ms → 0.26 ms
🔴 +6.3% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.375 ms → 0.399 ms
🔴 +6.2% voicecom_float
evaltime · 2sec
apple-m1-max 1.3 ms → 1.38 ms
🔴 +5.9% en_tdnn_8M
evaltime · pulse_240ms
apple-m1-max 2.21 ms → 2.33 ms
🔴 -5.8% openelm_270M_q40ef16_516
prefill · cpu
apple-m1-max 300.8 tok/s → 283.3 tok/s
🔴 -5.8% openelm_270M_q40ef16_541
prefill · cpu
apple-m1-max 296.8 tok/s → 279.7 tok/s
🔴 -4.1% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 219.8 tok/s → 210.7 tok/s
🔴 -3.9% llama_3_2_1B_q40ef32_516
prefill · cpu
apple-m1-max 46.44 tok/s → 44.65 tok/s

Load & memory (worst first)

Δ metric device main → PR
🔴 +14.9% hey_snips_v4_model17
heap @ ready · 2sec
apple-m1-max 1.93 MB → 2.21 MB
🔴 +14.6% hey_snips_v4_model17
heap @ ready · pulse8
apple-m1-max 1.84 MB → 2.11 MB
🔴 +14.5% hey_snips_v4_model17_nnef
heap @ ready · pulse8
apple-m1-max 1.84 MB → 2.11 MB
🔴 +12.2% hey_snips_v4_model17
heap @ ready · 2sec
i9-11900kb_rtx-4060 2.13 MB → 2.39 MB
🔴 +12.1% hey_snips_v4_model17
heap @ ready · pulse8
i9-11900kb_rtx-4060 2.15 MB → 2.41 MB
🔴 +12.1% hey_snips_v4_model17_nnef
heap @ ready · pulse8
i9-11900kb_rtx-4060 2.15 MB → 2.42 MB
🔴 +6.2% openelm_270M_q40ef16_516
load · cuda
i9-11900kb_rtx-4060 741 ms → 787 ms
🔴 +5.9% openelm_270M_q40ef16_541
load · cuda
i9-11900kb_rtx-4060 623 ms → 660 ms
🔴 +5.8% speaker_id
heap @ ready · pulse8
apple-m1-max 1.06 MB → 1.13 MB
🔴 +3.9% trunet
heap @ ready · pulse1_f16
apple-m1-max 2.41 MB → 2.5 MB
🔴 +3.4% trunet
heap @ ready · pulse1_f16
i9-11900kb_rtx-4060 2.43 MB → 2.51 MB
🔴 +2.3% trunet
heap @ ready · pulse1_f32
i9-11900kb_rtx-4060 4.21 MB → 4.3 MB
🟢 19 improvement(s)
Δ metric device main → PR
🟢 -6.1% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 54.3 ms → 51 ms
🟢 -5.7% hey_snips_v1
evaltime · 400ms
apple-m1-max 0.13 ms → 0.123 ms
🟢 -5.0% mdl_en_2019_Q3_librispeech_onnx
evaltime · 2600ms
apple-m1-max 5.52 ms → 5.24 ms
🟢 +3.3% openelm_270M_q40ef16_516
decode · metal
apple-m1-max 224.7 tok/s → 232 tok/s
🟢 -11.1% hey_snips_v4_model17_nnef
load+optimize · pulse8
apple-m1-max 54 ms → 48 ms
🟢 -7.8% en_tdnn_pyt_15M
RSS @ load · pulse_120ms
i9-11900kb_rtx-4060 84.5 MB → 78 MB
🟢 -7.7% en_tdnn_15M_nnef
load+optimize · pulse_240ms
apple-m1-max 52 ms → 48 ms
🟢 -6.5% en_tdnn_pyt_15M
RSS @ ready · pulse_120ms
apple-m1-max 118 MB → 110 MB
🟢 -6.3% hey_snips_v1
RSS @ ready · 400ms
apple-m1-max 22.1 MB → 20.7 MB
🟢 -6.0% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
heap @ ready · cpu
i9-11900kb_rtx-4060 675 kB → 634 kB
🟢 -5.8% arm_ml_kws_cnn_m
RSS @ ready · pass
apple-m1-max 21.6 MB → 20.4 MB
🟢 -5.8% parakeet_tdt_600m_v3_f32f32_encoder_1s
heap @ ready · cpu
i9-11900kb_rtx-4060 2.5 GB → 2.35 GB
🟢 -4.1% parakeet_tdt_600m_v3_f32f32_encoder_1s
heap @ ready · cpu
apple-m1-max 2.45 GB → 2.35 GB
🟢 -3.5% hey_snips_v1
heap @ ready · 400ms
i9-11900kb_rtx-4060 1.19 MB → 1.15 MB
🟢 -2.7% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
heap @ ready · cpu
apple-m1-max 662 kB → 644 kB
🟢 -2.5% mdl_en_2019_Q3_librispeech_onnx
heap @ ready · 2600ms
i9-11900kb_rtx-4060 10.4 MB → 10.2 MB
🟢 -2.3% mobilenet_v1_1
heap @ ready · pass
i9-11900kb_rtx-4060 18.5 MB → 18 MB
🟢 -2.2% arm_ml_kws_cnn_m
heap @ ready · pass
i9-11900kb_rtx-4060 966 kB → 945 kB
🟢 -2.0% en_tdnn_8M
heap @ ready · pulse_120ms
i9-11900kb_rtx-4060 34.1 MB → 33.5 MB

lower is better except prefill/decode (tok/s) · adaptive thresholds (max(floor, k×noise) vs the series' own history) · single-shot vs nightly reference · full report → run

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s) · ⚠️ 3 secondary

Reference: 2026-08-04 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +3.8% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.55 ms/tok
219.8 tok/s → 4.72 ms/tok
211.7 tok/s
⚠️ 3 secondary regression(s)
Δ metric device main → PR
⚠️ +44.6% arm_ml_kws_cnn_m
load · pass
cortex-a9 83 ms → 120 ms
⚠️ +33.1% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 127 ms → 169 ms
⚠️ +21.4% speaker_id
RSS @ ready · pulse8
cortex-a7 17.7 MB → 21.5 MB

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s) · ⚠️ 6 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +9.5% arm_ml_kws_cnn_m
evaltime · pass
cortex-a9 9.25 ms → 10.1 ms
⚠️ 6 secondary regression(s)
Δ metric device main → PR
⚠️ +21.4% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 102 ms
⚠️ +16.2% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 151 ms
⚠️ +12.8% arm_ml_kws_cnn_m
load · pass
cortex-a53 47 ms → 53 ms
⚠️ +11.2% arm_ml_kws_cnn_m
load · pass
cortex-a7 80 ms → 89 ms
⚠️ +10.0% hey_snips_v1
load · 400ms
cortex-a7 70 ms → 77 ms
⚠️ +9.6% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a53 73 ms → 80 ms

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s) · ⚠️ 4 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +5.4% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.53 ms/tok
220.8 tok/s → 4.78 ms/tok
209.4 tok/s
⚠️ 4 secondary regression(s)
Δ metric device main → PR
⚠️ +17.9% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 99 ms
⚠️ +13.1% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 147 ms
⚠️ +11.2% arm_ml_kws_cnn_m
load · pass
cortex-a7 80 ms → 89 ms
⚠️ +11.0% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 53.4 MB

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 2 speed regression(s) · ⚠️ 7 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +9.6% arm_ml_kws_cnn_m
evaltime · pass
cortex-a9 9.25 ms → 10.1 ms
🔴 +4.3% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.53 ms/tok
220.8 tok/s → 4.72 ms/tok
211.6 tok/s
⚠️ 7 secondary regression(s)
Δ metric device main → PR
⚠️ +34.5% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 113 ms
⚠️ +30.8% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 170 ms
⚠️ +11.2% hey_snips_v4_model17
load+optimize · 2sec
cortex-a7 5.12 s → 5.7 s
⚠️ +10.2% hey_snips_v4_model17
load · 2sec
cortex-a7 4.39 s → 4.84 s
⚠️ +9.7% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 52.7 MB
⚠️ +7.6% mobilenet_v1_1
load · pass
cortex-a9 2.09 s → 2.25 s
⚠️ +7.1% mobilenet_v1_1
load+optimize · pass
cortex-a9 2.37 s → 2.54 s

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 2 speed regression(s) · ⚠️ 5 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +7.7% arm_ml_kws_cnn_m
evaltime · pass
cortex-a9 9.25 ms → 9.96 ms
🔴 +4.9% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.53 ms/tok
220.8 tok/s → 4.75 ms/tok
210.4 tok/s
⚠️ 5 secondary regression(s)
Δ metric device main → PR
⚠️ +44.0% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 121 ms
⚠️ +37.7% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 179 ms
⚠️ +10.8% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 53.2 MB
⚠️ +6.5% en_tdnn_15M
RSS @ ready · pulse_120ms
cortex-a55 112 MB → 120 MB
⚠️ +6.4% arm_ml_kws_cnn_m
load · pass
cortex-a53 47 ms → 50 ms

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 3 speed regression(s) · ⚠️ 12 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +14.9% hey_snips_v1
evaltime · 400ms
cortex-a9 9.29 ms → 10.7 ms
🔴 +5.7% inceptionv1q
evaltime · pass
apple-m1-max 39.5 ms → 41.7 ms
🔴 +5.7% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.53 ms/tok
220.8 tok/s → 4.79 ms/tok
209 tok/s
⚠️ 12 secondary regression(s)
Δ metric device main → PR
⚠️ +39.3% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 117 ms
⚠️ +29.2% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 168 ms
⚠️ +19.5% hey_snips_v1
load · 400ms
cortex-a9 77 ms → 92 ms
⚠️ +17.0% hey_snips_v1
load+optimize · 400ms
cortex-a9 147 ms → 172 ms
⚠️ +13.0% hey_snips_v4_model17_nnef
load · pulse8
cortex-a7 876 ms → 990 ms
⚠️ +9.1% mobilenet_v1_1
load · pass
cortex-a9 2.09 s → 2.28 s
⚠️ +8.7% hey_snips_v4_model17_nnef
load+optimize · pulse8
cortex-a7 1.55 s → 1.69 s
⚠️ +8.5% mobilenet_v1_1
load+optimize · pass
cortex-a9 2.37 s → 2.58 s
⚠️ +6.0% inceptionv3
load+optimize · pass
apple-m1-max 350 ms → 371 ms
⚠️ +5.5% hey_snips_v31
load+optimize · 400ms
cortex-a9 344 ms → 363 ms
⚠️ +5.5% inceptionv3
load · pass
apple-m1-max 237 ms → 250 ms
⚠️ +5.1% en_tdnn_15M
RSS @ ready · 2600ms
cortex-a55 112 MB → 118 MB

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 2 speed regression(s) · ⚠️ 5 secondary

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +7.8% en_tdnn_8M_nnef
evaltime · pulse_240ms
cortex-a55 29.8 ms → 32.1 ms
🔴 +5.8% openelm_270M_q40ef16_541
decode · metal
apple-m1-max 4.53 ms/tok
220.8 tok/s → 4.79 ms/tok
208.6 tok/s
⚠️ 5 secondary regression(s)
Δ metric device main → PR
⚠️ +17.9% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 99 ms
⚠️ +12.3% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 146 ms
⚠️ +11.2% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 53.4 MB
⚠️ +9.1% hey_snips_v4_model17
load+optimize · pulse8
cortex-a7 7.52 s → 8.21 s
⚠️ +7.6% hey_snips_v4_model17
load · pulse8
cortex-a7 6.78 s → 7.3 s

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

⚠️ Bench vs main — no speed regressions · 7 secondary regression(s)

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

no inference-speed regressions

Improvements

Δ metric device main → PR
🟢 -16.5% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.33 ms
🟢 -8.6% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.361 ms
🟢 -6.5% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 48.1 ms
🟢 -4.2% llama_3_2_1B_instruct_q40ef16_541
decode · metal
apple-m1-max 5.74 ms/tok
174.1 tok/s → 5.5 ms/tok
181.7 tok/s
⚠️ 7 secondary regression(s)
Δ metric device main → PR
⚠️ +50.0% hey_snips_v1
load · 400ms
cortex-a7 70 ms → 105 ms
⚠️ +31.6% hey_snips_v1
load+optimize · 400ms
cortex-a7 117 ms → 154 ms
⚠️ +16.7% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 98 ms
⚠️ +12.1% hey_snips_v31
load+optimize · 400ms
cortex-a7 390 ms → 437 ms
⚠️ +11.7% hey_snips_v31
load · 400ms
cortex-a7 342 ms → 382 ms
⚠️ +11.5% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 145 ms
⚠️ +5.2% hey_snips_v31
load+optimize · 400ms
cortex-a9 344 ms → 362 ms

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

⚠️ Bench vs main — no speed regressions · 6 secondary regression(s)

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

no inference-speed regressions

Improvements

Δ metric device main → PR
🟢 -16.5% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.33 ms
🟢 -8.3% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.363 ms
🟢 -6.9% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 47.9 ms
⚠️ 6 secondary regression(s)
Δ metric device main → PR
⚠️ +16.7% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 98 ms
⚠️ +15.2% hey_snips_v31
load · 400ms
cortex-a7 342 ms → 394 ms
⚠️ +14.9% hey_snips_v31
load+optimize · 400ms
cortex-a7 390 ms → 448 ms
⚠️ +10.8% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 144 ms
⚠️ +10.6% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 53.2 MB
⚠️ +6.4% arm_ml_kws_cnn_m
load · pass
cortex-a53 47 ms → 50 ms

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

⚠️ Bench vs main — no speed regressions · 8 secondary regression(s)

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

no inference-speed regressions

Improvements

Δ metric device main → PR
🟢 -16.4% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.33 ms
🟢 -7.3% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.366 ms
🟢 -6.5% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 48.2 ms
⚠️ 8 secondary regression(s)
Δ metric device main → PR
⚠️ +15.5% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 97 ms
⚠️ +11.1% hey_snips_v4_model17_nnef
load+optimize · pulse8
cortex-a7 1.55 s → 1.73 s
⚠️ +10.0% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 143 ms
⚠️ +7.5% mobilenet_v1_1
load · pass
cortex-a9 2.09 s → 2.25 s
⚠️ +6.9% mobilenet_v1_1
load+optimize · pass
cortex-a9 2.37 s → 2.54 s
⚠️ +6.4% arm_ml_kws_cnn_m
load · pass
cortex-a53 47 ms → 50 ms
⚠️ +5.3% en_tdnn_15M
RSS @ ready · 2600ms
cortex-a55 112 MB → 118 MB
⚠️ +5.2% hey_snips_v31
load+optimize · 400ms
cortex-a9 344 ms → 362 ms

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

⚠️ Bench vs main — no speed regressions · 10 secondary regression(s)

Reference: 2026-08-05 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

no inference-speed regressions

Improvements

Δ metric device main → PR
🟢 -16.3% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.33 ms
🟢 -7.8% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.364 ms
🟢 -6.7% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 48.1 ms
⚠️ 10 secondary regression(s)
Δ metric device main → PR
⚠️ +16.7% arm_ml_kws_cnn_m
load · pass
cortex-a9 84 ms → 98 ms
⚠️ +12.9% hey_snips_v1
load · 400ms
cortex-a7 70 ms → 79 ms
⚠️ +12.0% hey_snips_v31
load · 400ms
cortex-a7 342 ms → 383 ms
⚠️ +11.8% hey_snips_v31
load+optimize · 400ms
cortex-a7 390 ms → 436 ms
⚠️ +11.6% inceptionv1q
load+optimize · pass
cortex-a55 3.89 s → 4.33 s
⚠️ +11.5% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 130 ms → 145 ms
⚠️ +11.1% mobilenet_v1_1
RSS @ ready · pass
cortex-a53 48.1 MB → 53.4 MB
⚠️ +11.1% hey_snips_v1
load+optimize · 400ms
cortex-a7 117 ms → 130 ms
⚠️ +8.5% arm_ml_kws_cnn_m
load · pass
cortex-a53 47 ms → 51 ms
⚠️ +5.2% hey_snips_v31
load+optimize · 400ms
cortex-a9 344 ms → 362 ms

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s) · ⚠️ 2 secondary

Reference: 2026-08-06 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +6.2% hey_snips_v1
evaltime · 400ms
cortex-a55 2.22 ms → 2.36 ms

Improvements

Δ metric device main → PR
🟢 -19.2% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.28 ms
🟢 -8.4% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.362 ms
🟢 -5.9% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 48.4 ms
⚠️ 2 secondary regression(s)
Δ metric device main → PR
⚠️ +27.7% arm_ml_kws_cnn_m
load · pass
cortex-a9 83 ms → 106 ms
⚠️ +21.7% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 129 ms → 157 ms

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

🔴 Bench vs main — 1 speed regression(s) · ⚠️ 9 secondary

Reference: 2026-08-06 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

Δ metric device main → PR
🔴 +18.1% arm_ml_kws_cnn_m
evaltime · pass
cortex-a9 9.23 ms → 10.9 ms

Improvements

Δ metric device main → PR
🟢 -16.8% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.32 ms
🟢 -7.3% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.366 ms
🟢 -5.8% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 48.5 ms
⚠️ 9 secondary regression(s)
Δ metric device main → PR
⚠️ +43.4% arm_ml_kws_cnn_m
load · pass
cortex-a9 83 ms → 119 ms
⚠️ +36.4% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 129 ms → 176 ms
⚠️ +22.4% hey_snips_v1
load · 400ms
cortex-a9 76 ms → 93 ms
⚠️ +20.8% hey_snips_v1
load+optimize · 400ms
cortex-a9 144 ms → 174 ms
⚠️ +10.4% arm_ml_kws_cnn_m
load · pass
cortex-a53 48 ms → 53 ms
⚠️ +9.5% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a53 74 ms → 81 ms
⚠️ +9.1% hey_snips_v4_model17
load · pulse8
cortex-a7 6.74 s → 7.36 s
⚠️ +8.2% hey_snips_v4_model17
load+optimize · pulse8
cortex-a7 7.48 s → 8.09 s
⚠️ +7.2% hey_snips_v4_model17
load+optimize · 2sec
cortex-a7 5.04 s → 5.4 s

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

⚠️ Bench vs main — no speed regressions · 6 secondary regression(s)

Reference: 2026-08-06 morning nightly run (0d old) · full report → run

Speed — evaltime · prefill · decode

no inference-speed regressions

Improvements

Δ metric device main → PR
🟢 -17.3% parakeet_tdt_600m_v3_f32f32_preprocessor_1s
evaltime · metal
apple-m1-max 1.59 ms → 1.31 ms
🟢 -7.9% parakeet_tdt_600m_v3_f32f32_joint_pass
evaltime · metal
apple-m1-max 0.395 ms → 0.364 ms
🟢 -6.9% parakeet_tdt_600m_v3_f32f32_encoder_1s
evaltime · metal
apple-m1-max 51.5 ms → 47.9 ms
⚠️ 6 secondary regression(s)
Δ metric device main → PR
⚠️ +27.7% arm_ml_kws_cnn_m
load · pass
cortex-a9 83 ms → 106 ms
⚠️ +20.2% arm_ml_kws_cnn_m
load+optimize · pass
cortex-a9 129 ms → 155 ms
⚠️ +13.8% hey_snips_v4_model17
load · pulse8
cortex-a7 6.74 s → 7.67 s
⚠️ +12.7% hey_snips_v4_model17
load+optimize · pulse8
cortex-a7 7.48 s → 8.43 s
⚠️ +8.2% llama_3_2_3B_instruct_q40ef16_541
load+optimize · cuda
jetson-orin-nx 4.38 s → 4.73 s
⚠️ +6.1% llama_3_2_3B_instruct_q40ef16_541
load · cuda
jetson-orin-nx 3.15 s → 3.34 s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant