Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
8a9d5a2
Add metadata-driven model fit validation
i386 May 31, 2026
70d354f
Tighten model-fit validation accuracy gates
i386 May 31, 2026
1a84a17
Document empirical heuristic rule
i386 May 31, 2026
37dc4de
Remove unsupported Q8 fit scaling
i386 May 31, 2026
1185309
Add GGUF matmul profile for model fit
i386 May 31, 2026
6d05f67
Generalize GGUF matmul fit profile
i386 May 31, 2026
41f32b3
Validate model fit against Skippy decode ABI
i386 May 31, 2026
0bee4fa
Refine model-fit validation scenarios
i386 Jun 1, 2026
1361b7d
Ground Q8 and MoE fit estimates in source behavior
i386 Jun 1, 2026
4ef322c
Add measured prefill matmul fit input
i386 Jun 1, 2026
f311861
Add MoE prefill probe and first-token breakdown
i386 Jun 1, 2026
b7b8fdb
Add cross-backend prefill matmul facts
i386 Jun 1, 2026
70154e7
Document ROCm probe verification TODO
i386 Jun 1, 2026
d6d833d
Add post-prefill decode overhead probe
i386 Jun 1, 2026
f86c290
Account for expanded FFN decode graph stages
i386 Jun 1, 2026
6eeb591
Add ubatch-shaped prefill benchmark fact
i386 Jun 1, 2026
1e23a01
Expose first-token validation residuals
i386 Jun 1, 2026
27283d8
Add sampler facts to model-fit validation
i386 Jun 1, 2026
e4912c2
Add model-fit validation heartbeats
i386 Jun 1, 2026
b730cc9
Abort model-fit validation on runtime startup failure
i386 Jun 1, 2026
2a780d3
Clarify model-fit validation backend handling
i386 Jun 1, 2026
89382eb
Avoid CPU fallback for accelerated generation fits
i386 Jun 2, 2026
5aab732
Skip ABI probe for non-local model-fit results
i386 Jun 2, 2026
96b09a7
Document split candidate validation semantics
i386 Jun 2, 2026
9b09a1b
Make model-fit local-only and add decode probe schema
i386 Jun 2, 2026
7a0d12d
Suppress throughput estimates for rejected local fits
i386 Jun 2, 2026
d4c090e
Prefer fit status in validation skip reasons
i386 Jun 2, 2026
0206f25
Add decode kernel probe diagnostics
i386 Jun 2, 2026
2b15111
Add GGML decode kernel probes
i386 Jun 2, 2026
34dfb3c
Break skippy stage protocol for direct returns
i386 Jun 4, 2026
7bf574b
Document tip-to-tip stage placement
i386 Jun 4, 2026
6ea1d9e
Expose prefix cache savings telemetry
i386 Jun 4, 2026
cfe5480
Validate model-fit against skippy decode probes
i386 Jun 4, 2026
e04a7ad
Gate model-fit smoke on steady decode
i386 Jun 4, 2026
97344f1
Handle unsupported GGML probe tensor shapes
i386 Jun 5, 2026
85aaacb
Harden model-fit validation probes
i386 Jun 5, 2026
7b2f728
Explain model-fit decode boundary misses
i386 Jun 6, 2026
121607b
Document model-fit validation objectives
i386 Jul 25, 2026
183f817
Merge origin/main into model-fit placement validation
i386 Aug 17, 2026
a58da50
fix: resolve merged skippy manifest metadata
i386 Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions .github/workflows/model-fit-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: Model Fit Validation

on:
workflow_dispatch:
inputs:
manifest:
description: "Validation corpus to run: smoke or deep"
required: false
default: smoke
runner_labels:
description: 'JSON array of self-hosted runner labels'
required: false
default: '["self-hosted","macos","metal"]'
pull_request:
paths:
- "crates/model-fit/**"
- "crates/mesh-llm-gpu-bench/**"
- "crates/skippy-bench/**"
- "crates/skippy-server/**"
- ".github/workflows/model-fit-validation.yml"

concurrency:
group: model-fit-validation-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: false

env:
CARGO_INCREMENTAL: "0"

jobs:
metadata:
name: metadata checks
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy,rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
- name: Test model-fit
run: cargo test -p model-fit --lib
- name: Clippy model-fit
run: cargo clippy -p model-fit --all-targets -- -D warnings

gpu-smoke:
name: GPU fit smoke
runs-on: ${{ fromJSON(inputs.runner_labels || vars.MODEL_FIT_GPU_RUNS_ON || '["self-hosted","macos","metal"]') }}
timeout-minutes: 240
env:
MODEL_FIT_MANIFEST: ${{ inputs.manifest || 'smoke' }}
steps:
- uses: actions/checkout@v5

- uses: dtolnay/rust-toolchain@stable

- name: Build release binaries
run: |
just release-build
cargo build --release --locked \
-p model-fit --bins \
-p skippy-bench \
-p skippy-server \
-p metrics-server

- name: Capture measured GPU benchmark
run: |
target/release/mesh-llm gpus benchmark --json > "$RUNNER_TEMP/model-fit-gpu-benchmark.json"

- name: Select validation manifest
id: manifest
run: |
case "$MODEL_FIT_MANIFEST" in
smoke)
manifest_path="crates/model-fit/validation/smoke-models.txt"
min_models=5
max_noisy=2
;;
deep)
manifest_path="crates/model-fit/validation/deep-models.txt"
min_models=12
max_noisy=4
;;
*)
echo "unknown MODEL_FIT_MANIFEST=$MODEL_FIT_MANIFEST" >&2
exit 1
;;
esac
echo "path=$manifest_path" >> "$GITHUB_OUTPUT"
echo "min_models=$min_models" >> "$GITHUB_OUTPUT"
echo "max_noisy=$max_noisy" >> "$GITHUB_OUTPUT"

- name: Validate model-fit against Skippy single-stage benchmarks
run: |
target/release/model-fit-validate \
--no-progress \
--gpu-benchmark-json "$RUNNER_TEMP/model-fit-gpu-benchmark.json" \
--models-file "${{ steps.manifest.outputs.path }}" \
--output-json "$RUNNER_TEMP/model-fit-validation.json"

- name: Check validation thresholds
run: |
target/release/model-fit-check-validation \
--scenario steady_decode \
--min-models "${{ steps.manifest.outputs.min_models }}" \
--max-median-absolute-error 0.10 \
--max-individual-error 0.10 \
--max-noisy "${{ steps.manifest.outputs.max_noisy }}" \
--require-graph-inventory-match \
--allow-classified-individual-misses \
--markdown-out "$RUNNER_TEMP/model-fit-validation.md" \
"$RUNNER_TEMP/model-fit-validation.json"
cat "$RUNNER_TEMP/model-fit-validation.md" >> "$GITHUB_STEP_SUMMARY"

- name: Render all scenario evidence
if: always()
run: |
target/release/model-fit-check-validation \
--scenario all \
--report-only \
--markdown-out "$RUNNER_TEMP/model-fit-validation-all.md" \
"$RUNNER_TEMP/model-fit-validation.json"
cat "$RUNNER_TEMP/model-fit-validation-all.md" >> "$GITHUB_STEP_SUMMARY"

- uses: actions/upload-artifact@v4
if: always()
with:
name: model-fit-validation-${{ env.MODEL_FIT_MANIFEST }}
path: |
${{ runner.temp }}/model-fit-gpu-benchmark.json
${{ runner.temp }}/model-fit-validation.json
${{ runner.temp }}/model-fit-validation.md
${{ runner.temp }}/model-fit-validation-all.md
Loading
Loading