Skip to content

feat(eval): support Common Voice gender classification - #1329

Draft
ssss141414 wants to merge 4 commits into
mainfrom
ssss141414/add-common-voice-gender-dependent
Draft

feat(eval): support Common Voice gender classification#1329
ssss141414 wants to merge 4 commits into
mainfrom
ssss141414/add-common-voice-gender-dependent

Conversation

@ssss141414

@ssss141414 ssss141414 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Summary

This dependent contribution refines the existing WinML CPU FP32 and FP16 recipes for prithivMLmods/Common-Voice-Gender-Detection, a Wav2Vec2 audio classifier that emits female or male voice labels, with export.compatibility.transformers_attention=eager. Effort L2 ships those recipe refinements plus a class-wide scalar-string label-mapping extension; Outcome L2 is complete, and the highest tested Goal is L3 PASS. The branch is stacked on Draft #1326 at exact head 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8; that PR owns the generic audio-classification evaluator and raw-streaming implementation included in this PR's diff against main.

Model metadata

What the model does

This Wav2Vec2 sequence-classification checkpoint accepts 16 kHz speech waveforms and emits two logits interpreted as female or male voice labels (verified). Evidence: pinned checkpoint prithivMLmods/Common-Voice-Gender-Detection@ebbf41293c8dbea45c5bb0de6e3ef77bf89cc2ee, its audio-classification model card, and the pinned Wav2Vec2ForSequenceClassification implementation.

Primary user stories

  • A user supplies a speech recording to obtain the checkpoint's female-or-male voice classification for audio analysis (verified from the checkpoint model card and id2label metadata).

Supported tasks

  • audio-classification across the checkpoint, Transformers, Optimum ONNX, and WinML surfaces (verified from the checkpoint pipeline tag, Wav2Vec2ForSequenceClassification, the Optimum Wav2Vec2 ONNX task registry, and WinML inspect/config behavior).

Model architecture

Wav2Vec2ForSequenceClassification
|-- Input waveform [batch, samples] at 16 kHz
|-- Wav2Vec2Model
|   |-- Convolutional feature encoder x 7
|   |-- Feature projection (conv width -> 768)
|   |-- Encoder prelude: positional convolution + LayerNorm
|   `-- Transformer encoder layer x 12
|       |-- Self-attention (12 heads, 768 hidden)
|       `-- Feed-forward + residual + normalization
|-- Projector (768 -> 256)
|-- Mean pooling over time
`-- Classifier (256 -> 2 logits)
  • Source/confidence: pinned checkpoint config and pinned Wav2Vec2 source structure, with final ONNX regions mapped from node/tensor scopes and topology (mapped).

Validation and support evidence

1. Baseline

The frozen baseline is microsoft/winml-cli main commit 0876e5ae1c98a169a6137e092e0d7b30bf9cee33, WinML 0.3.0. Recipe-free FP32 CPU build passed in 46.1 s, producing an approximately 360.9 MB model with 619/619 tagged ONNX nodes and input_values float32[1,16000] -> logits float32[1,2]. CPU perf over three measured iterations was 59.565 ms mean, 57.39 ms p50, 16.79 samples/s, and +63.55 MB RSS total delta. Eval failed before dataset loading because current-main WinML did not register audio-classification. Generated config already selected export.compatibility.transformers_attention=eager. Optimum exposed audio-classification and feature-extraction both before and after WinML registration, so the probe verdict was VENDOR-ONLY with no WinML-added task.

2. Goal

  • Effort: L2.
  • Goal ceiling: L3, with a floor of L1.
  • Outcome: L2.
  • Success definition: march L0-L3 plus mandatory perf, functional smoke, Analyze, compatibility, and CI parity for CPU FP32 and FP16.
  • Ceiling history: charter-r2 reissued only the planner-owned final-artifact semantic mapping after technical PASS; it did not change or downgrade the L3 ceiling.

3. Outcome

The shipped tier is L2 and the highest Goal verdict is L3 PASS, with full technical coverage. Required tuples CPUExecutionProvider/cpu/fp32 and CPUExecutionProvider/cpu/fp16 both passed; no tuples are deferred. The contribution refines the two existing CPU recipes with export.compatibility.transformers_attention=eager and adds a generic, schema-driven scalar Value('string') mapping path. The model branch deliberately depends on Draft #1326 at 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8; #1326 retains ownership of evaluator registration, the base audio-classification implementation, raw Audio(decode=False) plus SoundFile decoding, fixed-window aggregation, and existing ClassLabel/sequence behavior. This PR adds only exact scalar-string mapping validation/resolution, atomic selected-target prevalidation, its focused tests, schema help, and the two model-specific recipe refinements.

Lane A knowledge was refined separately in gim-home/ModelKitArtifacts#254 at commit 5f1368f5ee3296aab5799f55c31acf152e4f9c07, with published wav2vec2.json SHA-256 2f2a0f861df22a728aaf4cd6e02979c0756f0702d82720130567519ab469b031. No methodology friction observed.

4. Per-EP/device/precision results and Functional smoke Eval

The evaluator-only repair from e4d19ba1d4af532ba4cf0b047ff2fb395ac9d868 to final candidate 8010667eb20d0eb08e916157a6cc5080c91d385d did not change build, export, model, recipe, perf, parity, or Analyze paths. L0-L2 and Analyze results below are reused from the exact parent only after all four ONNX payloads were rehashed unchanged; the zero-forward discriminator, evaluator compatibility, L3 functional smoke, commands partition, license, Ruff, and mypy are fresh on 8010667eb20d0eb08e916157a6cc5080c91d385d.

Tier EP / Device Precision Verdict Mean p50 Throughput RAM total delta
L0 CPUExecutionProvider / cpu fp32 PASS; build 54.5 s - - - -
L0 CPUExecutionProvider / cpu fp16 PASS; build 66.8 s - - - -
L1 CPUExecutionProvider / cpu fp32 PASS 51.024 ms 51.123 ms 19.6 samples/s +63.52 MB
L1 CPUExecutionProvider / cpu fp16 PASS 61.586 ms 62.633 ms 16.24 samples/s +41.48 MB

L2 parity passed against pinned PyTorch Wav2Vec2ForSequenceClassification@ebbf41293c8dbea45c5bb0de6e3ef77bf89cc2ee using deterministic float32 input [1,16000]. FP32 cosine was 0.9999999999999206, max absolute error 8.821487426757812e-06, mean absolute error 8.225440979003906e-06, finite output, and matching argmax. FP16 cosine was 0.9999999999953266, max absolute error 0.0008280277252197266, mean absolute error 0.0007888078689575195, finite output, and matching argmax.

Functional smoke Eval: L3 PASS fresh on final candidate 8010667eb20d0eb08e916157a6cc5080c91d385d, FP32 CPU, using AsmaaQ/gender_audio_1080@47f6563cf1b819cbf1cbc8569a8dfe8fc426bab3, config default, split test, streaming, no shuffle. Exact mapping was female -> 0, male -> 1, matching the checkpoint. Selection took the first eligible row for each exact mapped label in source order. Accounting was requested/selected/processed/rejected = 2/2/2/0, with no rejection reasons; both classes were represented. The female row was mono 16 kHz PCM16, 55,872 frames (3.492 s), four 16,000-sample windows; the male row was mono 16 kHz PCM16, 81,216 frames (5.076 s), six windows. Fan-out caps were 2 rows, 2 classes, 10 total windows, 1 beam, and 0 other expansion. Accuracy was 1.0; macro-F1 was 1.0; represented classes were 2/2 and class coverage was 1.0.

This is bounded real-data end-to-end operability evidence only. Two rows are not representative accuracy and are not a benchmark-quality claim. Only FP32 CPU Eval was measured; no FP16 or other-EP accuracy is implied. The former blocker was rejection of scalar datasets.Value('string') targets before inference; the new capability accepts them only through a complete, exact, explicit mapping to checkpoint class IDs and pre-resolves every target in the bounded selected subset before the first model forward.

5. Delta

Existing recipes refined:

  • examples/recipes/prithivMLmods_Common-Voice-Gender-Detection/cpu/cpu/audio-classification_fp32_config.json: /export/compatibility/transformers_attention changed from absent to eager, matching the generated baseline value.
  • examples/recipes/prithivMLmods_Common-Voice-Gender-Detection/cpu/cpu/audio-classification_fp16_config.json: /export/compatibility/transformers_attention changed from absent to eager, matching baseline; /quant remains the existing FP16 quantization object, while baseline has no /quant.

Parsed FP32 recipe content equals the generated baseline exactly. Parsed FP16 content equals baseline after substituting only the existing FP16 /quant object. Recipe-free Eval acceptance passed through the final built FP32 model. examples/recipes/README.md remains untouched.

Code delta relative to dependency #1326:

  • src/winml/modelkit/eval/audio_classification_evaluator.py: _validate_target_schema, _target_for_row, _validate_scalar_string_mapping, and compute add exact scalar-string mapping support and materialize all selected targets before inference.
  • src/winml/modelkit/utils/eval_utils.py: _AUDIO_CLASSIFICATION_SCHEMA documents explicitly mapped scalar strings.
  • tests/unit/eval/test_audio_classification_evaluator.py: focused class-wide regressions cover the new and preserved paths, including a valid-then-unmapped selected set that must fail with zero model forwards.

Bug fix explanation:

  1. Symptom and trigger: a valid audio-classification dataset with scalar datasets.Value('string') targets, such as female and male, was rejected during target-schema validation before inference even when the caller supplied an explicit mapping. The initial fix still resolved targets inside the inference loop, so a later unmapped value could fail only after an earlier row had already run inference.
  2. Root cause: the inherited evaluator accepted scalar ClassLabel and sequence-valued label forms but had no scalar-string validation/resolution branch. The initial scalar-string path then interleaved _target_for_row() and predict_logits() per row instead of validating the complete bounded selection atomically.
  3. Changed symbols and mechanism: _validate_target_schema recognizes scalar string features only when _validate_scalar_string_mapping proves a non-empty, one-to-one, complete mapping to contiguous checkpoint IDs; _target_for_row resolves each observed value by exact key lookup; compute materializes every selected target before the first predict_logits() call. _AUDIO_CLASSIFICATION_SCHEMA exposes that contract.
  4. General rule: behavior is derived from dataset feature type, explicit caller mapping, checkpoint class inventory, and the bounded selected target set. Production code contains no model ID, dataset ID, female/male special case, inferred ordinal, fuzzy match, or case folding.
  5. Compatibility and blast radius: scalar ClassLabel, sequence ClassLabel/string multi-label behavior, metrics, raw streaming decode=False, SoundFile decoding, and fixed-window aggregation are preserved. Intentional change is limited to target validation order and explicitly mapped scalar strings. Missing, empty, non-integer, duplicate-destination, out-of-range, incomplete, and unmapped observed values fail closed before inference; audio decode, preprocessing, and runtime failures remain per-row rejections with existing accounting.
  6. Regression evidence: fresh on 8010667eb20d0eb08e916157a6cc5080c91d385d, the reviewer's valid-then-unknown discriminator passed with forward_count=0 and no partial output (1 passed in 37.77 s), and the full evaluator file passed 18 tests in 10.76 s. The commands partition passed 3,648 tests with 9 skipped and 1 warning; license, Ruff over src/ tests/, full-package mypy over 439 source files, editor diagnostics, and git diff --check passed. The earlier parent-head models partition remains prior unaffected evidence rather than a fresh repaired-head claim.

6. Analyze summary - component level and op level

Analyze completed as ANALYZE-PARTIAL-SUCCESS with exit code 1 because six targets have no populated static rules. Static rule classification is not accelerator runtime execution. These results are reused from exact parent e4d19ba1d4af532ba4cf0b047ff2fb395ac9d868 after the evaluator-only repair was classified and all four model payloads were rehashed unchanged.

Component-level summary

Artifact Architecture coverage Mapping Explicit gaps
fp32 feature encoder; feature projection; encoder prelude; 12x encoder layers; projector; pooling; classifier 392/397 mapped; planner-frozen with explicit gaps 5 cross-component optimizer transition nodes
fp16 same seven regions 392/399 mapped; planner-frozen with explicit gaps same 5 transitions plus 2 graph-boundary Casts

The five shared gaps are the final feature-extractor Gelu, feature-projection output Reshape, first encoder-layer Gemm input Reshape, projector Gemm input Reshape, and projector output Reshape. They remain unattributed because adjacency alone is not accepted as semantic ownership evidence. FP16 additionally has input/output precision-adapter Casts. Every source component is mapped; resolving transition ownership would require exporter provenance or an instrumented unoptimized export with stable correspondence, and requires no product repair.

Op-level summary

Artifact Graph Dominant ops Rule-backed EP roll-up
fp32 397 ops / 14 types Reshape 126; Gemm 75; Transpose 51; Add 38; LayerNormalization 26; MatMul 24 Fully supported: NvTensorRTRTX/GPU, QNN/NPU, QNN/GPU, OpenVINO/NPU, OpenVINO/GPU, OpenVINO/CPU
fp16 399 ops / 15 types same dominant counts, plus 2 Casts Fully supported: NvTensorRTRTX/GPU, QNN/NPU, QNN/GPU, OpenVINO/NPU, OpenVINO/GPU, OpenVINO/CPU

Rule-less targets CUDA/GPU, MIGraphX/GPU, TensorRT/GPU, DML/GPU, CPU/CPU, and VitisAI/NPU have no populated classifications. These are rules-availability gaps, not runtime failures or measured support claims.

7. Reproduce commands

Prerequisites: Windows PowerShell, Git, uv, internet access to the public Hugging Face checkpoint/dataset, and sufficient disk/RAM for approximately 361 MB FP32 and 180 MB FP16 external-weight payloads. The commands clone the exact dependent branch, verify its SHA and dependency ancestry, install the locked environment, acquire the public static-rule repository, and reproduce build, perf, Analyze, bounded Eval, and quality checks.

$CandidateRef = 'ssss141414/add-common-voice-gender-dependent'
$ExpectedCandidate = '8010667eb20d0eb08e916157a6cc5080c91d385d'
$ExpectedDependency = '1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8'

git clone https://github.com/microsoft/winml-cli.git winml-cli-common-voice-gender
Set-Location winml-cli-common-voice-gender
git fetch origin $CandidateRef
$ResolvedCandidate = (git rev-parse 'FETCH_HEAD^{commit}').Trim()
if ($ResolvedCandidate -ne $ExpectedCandidate) { throw "remote ref resolved to $ResolvedCandidate, expected $ExpectedCandidate" }
git merge-base --is-ancestor $ExpectedDependency $ResolvedCandidate
if ($LASTEXITCODE -ne 0) { throw 'candidate does not descend from the exact dependency SHA' }
git checkout --detach $ResolvedCandidate
if ((git rev-parse HEAD).Trim() -ne $ExpectedCandidate) { throw 'wrong candidate SHA after checkout' }
if (git status --porcelain) { throw 'checkout is not clean' }

uv sync --locked --all-extras --all-groups
$OUT = Join-Path $PWD 'temp/common-voice-gender-repro'
$FP32 = Join-Path $OUT 'fp32'
$FP16 = Join-Path $OUT 'fp16'
New-Item -ItemType Directory -Force -Path $OUT | Out-Null

uv run --no-sync winml build -c examples/recipes/prithivMLmods_Common-Voice-Gender-Detection/cpu/cpu/audio-classification_fp32_config.json -m prithivMLmods/Common-Voice-Gender-Detection -o $FP32 --rebuild
uv run --no-sync winml build -c examples/recipes/prithivMLmods_Common-Voice-Gender-Detection/cpu/cpu/audio-classification_fp16_config.json -m prithivMLmods/Common-Voice-Gender-Detection -o $FP16 --rebuild --precision fp16
uv run --no-sync winml perf -m (Join-Path $FP32 'model.onnx') --device cpu --ep cpu --iterations 10 --warmup 3 --memory --format json -o (Join-Path $OUT 'perf-fp32.json')
uv run --no-sync winml perf -m (Join-Path $FP16 'model.onnx') --device cpu --ep cpu --iterations 10 --warmup 3 --memory --format json -o (Join-Path $OUT 'perf-fp16.json')

git clone https://github.com/gim-home/ModelKitArtifacts.git (Join-Path $OUT 'ModelKitArtifacts')
$env:WINMLCLI_RULES_DIR = (Resolve-Path (Join-Path $OUT 'ModelKitArtifacts/rules')).Path
uv run --no-sync winml analyze --model (Join-Path $FP32 'model.onnx') --ep all --device all --output (Join-Path $OUT 'analyze-fp32.json')
uv run --no-sync winml analyze --model (Join-Path $FP16 'model.onnx') --ep all --device all --output (Join-Path $OUT 'analyze-fp16.json')
Remove-Item Env:WINMLCLI_RULES_DIR

$Mapping = Join-Path $OUT 'gender-label-mapping.json'
'{"female":0,"male":1}' | Set-Content -Path $Mapping -Encoding ascii
uv run --no-sync winml eval -m (Join-Path $FP32 'model.onnx') --model-id prithivMLmods/Common-Voice-Gender-Detection --task audio-classification --ep cpu --device cpu --dataset AsmaaQ/gender_audio_1080 --dataset-revision 47f6563cf1b819cbf1cbc8569a8dfe8fc426bab3 --split test --streaming --samples 2 --no-shuffle --column input_column=path --column label_column=gender --label-mapping $Mapping -o (Join-Path $OUT 'functional-smoke.json')

uv run --no-sync pytest tests/unit/commands tests/unit/config tests/unit/build tests/unit/compiler tests/unit/session tests/unit/eval --tb=short --no-cov -m "not e2e and not npu and not gpu"
uv run --no-sync pre-commit run insert-license --all-files
uv run --no-sync ruff check src/ tests/
uv run --no-sync mypy -p winml.modelkit

The Eval command is a two-row functional smoke only, not representative accuracy. Analyze is static rule classification, not accelerator runtime evidence.

Dependency and provenance

  • Dependency: Draft microsoft/winml-cli#1326, exact head 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8, owns the generic audio evaluator implementation described above. This dependent PR does not duplicate or rewrite that ownership.
  • Candidate: ssss141414/add-common-voice-gender-dependent, exact head 8010667eb20d0eb08e916157a6cc5080c91d385d; the dependency head is its verified ancestor.
  • Lane A: Draft gim-home/ModelKitArtifacts#254, exact commit 5f1368f5ee3296aab5799f55c31acf152e4f9c07, published knowledge-file SHA-256 2f2a0f861df22a728aaf4cd6e02979c0756f0702d82720130567519ab469b031.

@ssss141414 ssss141414 added the model-scale-by-skill Model support PR created or maintained by the adding-model-support skill label Aug 21, 2026
@ssss141414

Copy link
Copy Markdown
Contributor Author

REQUEST_CHANGES

Independent review of exact head e4d19ba1d4af532ba4cf0b047ff2fb395ac9d868 (tree ad49295e32ef2ba7e8935badb372e2d06e000fe6) in a fresh detached checkout. The exact dependency head 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8 and frozen main 0876e5ae1c98a169a6137e092e0d7b30bf9cee33 are both verified ancestors.

Findings

  1. Producer/tester blocker: the selected scalar-string target set is not rejected before inference. In src/winml/modelkit/eval/audio_classification_evaluator.py:275-278, _target_for_row() and predict_logits() are interleaved per row. A selected batch ordered as mapped female followed by unmapped unknown performs one model forward before the second target raises at line 348. Independent probe:

    uv run --no-sync pytest -q C:\temp\audio-model-batch\1206-common-voice-gender\reviewer\20260821-independent-r1\test_scalar_string_prevalidation.py
    FAILED: assert model.forward_count == 0; observed 1
    1 failed in 31.40s
    

    This contradicts charter-r2's invariant that unknown/unmapped scalar strings fail closed before inference and exposes a gap in the existing one-row regression. Pre-resolve and validate all selected scalar-string targets before any adapter.predict_logits() call, add a valid-then-unmapped multi-row regression asserting zero forwards, and refresh the affected evaluator/L3/CI evidence on the new head.

  2. Explainer body correction: the recipes are modified, not added. The body says the contribution "adds two CPU recipes" and labels them "Recipes added," but both recipe paths already exist at frozen main 0876e5ae.... The complete recipe delta only adds /export/compatibility/transformers_attention = eager to each existing file. Update the Summary/Outcome/Delta wording to say the existing FP32/FP16 recipes are refined or updated; preserve the otherwise-correct separation of recipe(ast): use eager attention for AudioSet model #1326 ownership from feat(eval): support Common Voice gender classification #1329's delta.

Verified Evidence

  • Stack attribution: main...HEAD is 9 files / 1121 insertions / 4 deletions; 1bd919b...HEAD is 5 files / 205 insertions / 4 deletions. recipe(ast): use eager attention for AudioSet model #1326 owns evaluator registration, raw streaming decode, fixed-window aggregation, and existing ClassLabel/sequence behavior; feat(eval): support Common Voice gender classification #1329 owns scalar-string mapping, schema help, focused tests, and the two recipe refinements.
  • No model/checkpoint/dataset identifier occurs in production source. female/male appears only in focused tests and evidence.
  • Mapping validation is otherwise exact, complete, one-to-one, integer-only, and checkpoint-ID bounded. Existing scalar ClassLabel and sequence ClassLabel/string multi-label paths remain intact and covered.
  • Independent rehash: 51/51 unique sealed original/successor evidence files match byte counts and SHA-256, including all four ONNX payloads.
  • Direct ONNX inspection: FP32 is 397 nodes with 217 FLOAT initializers and 378,286,468-byte external data; FP16 is 399 nodes with 217 FLOAT16 initializers and 189,142,722-byte external data. Both expose input_values float32[1,16000] -> logits float32[1,2] at opset 17.
  • Component authority/gaps are coherent: seven source-derived regions, FP32 392/397 mapped with five explicit transition gaps, FP16 392/399 with the same five gaps plus two boundary Casts; adjacency alone is not claimed as authority.
  • L3 evidence is pinned and bounded: AsmaaQ/gender_audio_1080@47f6563..., default/test, exact female->0, male->1, first eligible row per class, 2/2/2/0 requested/selected/processed/rejected, 10 total fixed windows, accuracy 1.0 and macro-F1 1.0, explicitly functional-smoke only.
  • Public commands acquire locked dependencies and rules, resolve the candidate ref to the exact SHA, verify dependency ancestry, detach cleanly, and run build/perf/analyze/eval/quality commands. Fresh winml config reproduced the expected eager-attention config successfully.
  • Lane A refactor: move remaining network-dependent tests to integration #254 is Draft at exact head 0c896ff8e9eff8e26f41c3ee40058e960f149e85, labeled model-scale-by-skill, with its check successful and mixed provenance stated correctly.

Independent Tests

  • Focused evaluator: 18 passed in 13.43s.
  • Reviewer fail-before-inference probe: 1 failed; observed forward_count == 1 instead of 0.
  • Ruff: all checks passed for src/ tests/.
  • Mypy: no issues in 439 source files.
  • Commands partition: 3648 passed, 9 skipped.
  • Models partition: 1538 passed, 6 skipped, 2 xfailed.
  • git diff --check: pass; production recipe README unchanged.

GitHub Gate

The exact-head CI and thread gates are green, but they do not cover finding 1. Any fixing push makes the current check/evidence gate stale and requires fresh exact-head verification.

@ssss141414

Copy link
Copy Markdown
Contributor Author

Addressed both findings from #issuecomment-5370529429 on repaired head 8010667eb20d0eb08e916157a6cc5080c91d385d (tree 546e664360cc7cb20f72504a586d80a417f47b3b).

  1. Atomic target prevalidation: compute now materializes and resolves every target in the bounded selected subset before the first predict_logits() call, while preserving per-row rejection handling for audio decode, preprocessing, and runtime failures. The valid-then-unknown regression now asserts DatasetValidationError, forward_count=0, and no partial output. Fresh repaired-head evidence: the independent reviewer discriminator passed (1 passed in 37.77 s), the full evaluator file passed (18 passed in 10.76 s), the pinned two-row L3 smoke passed with 2/2/2/0 requested/selected/processed/rejected, 10 windows, accuracy 1.0, and macro-F1 1.0; the commands partition passed 3,648 tests with 9 skipped and 1 warning, and license, Ruff, and full-package mypy passed.

  2. Recipe provenance wording: the canonical PR body now says the two existing CPU recipes were refined/updated with export.compatibility.transformers_attention=eager; it no longer calls them added recipes. The body also states that L0-L2 and Analyze are reused from parent e4d19ba1... only after all four unchanged model payloads were rehashed, while the discriminator, evaluator compatibility, L3, commands, license, Ruff, and mypy are fresh on 8010667....

The published branch and PR head both resolve exactly to 8010667eb20d0eb08e916157a6cc5080c91d385d; dependency #1326 remains at 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8 and is a verified ancestor. Lane A #254 is bound at 5f1368f5ee3296aab5799f55c31acf152e4f9c07. The repaired body canonical SHA-256 is 913f99d42044e74938c23cd837fee0552fd7bf7061a0885d8a687901a319cf81. Draft state and model-scale-by-skill are preserved.

@ssss141414

Copy link
Copy Markdown
Contributor Author

APPROVE

Independent successor review of exact head 8010667eb20d0eb08e916157a6cc5080c91d385d (tree 546e664360cc7cb20f72504a586d80a417f47b3b) from a fresh detached checkout. Frozen origin/main is still 0876e5ae1c98a169a6137e092e0d7b30bf9cee33; dependency #1326 exact head 1bd919b583aa8ccd974e35fa6a1a132ac7e1c9f8 is an ancestor.

Findings

No actionable blocker remains.

Prior blocker closure

  • compute() now materializes every selected target before entering the inference loop. The original independent valid-female then unknown discriminator passed from this checkout (1 passed in 13.48s) and asserted forward_count=0; target validation raises before any partial metric result can be produced.
  • The full audio evaluator compatibility file passed 18 tests in 14.62s, including valid scalar-string mapping, scalar ClassLabel, sequence ClassLabel/string multi-label, raw streaming decode, and processed/rejected accounting paths.
  • The live PR body canonically matches the repaired explainer artifact (913f99d42044e74938c23cd837fee0552fd7bf7061a0885d8a687901a319cf81) and accurately describes both model recipes as refined existing recipes. The exact recipe delta over recipe(ast): use eager attention for AudioSet model #1326 adds only export.compatibility.transformers_attention=eager to FP32 and FP16.

Stacked delta and evidence

  • origin/main...HEAD: 9 files, 1,124 insertions, 4 deletions. 1bd919b...HEAD: 5 files, 216 insertions, 12 deletions. The dependent delta is limited to scalar-string evaluator/schema support, focused tests, and the two recipe refinements; examples/recipes/README.md is unchanged and production source contains no model, dataset, female, or male hardcoding.
  • Rehash passed for 12/12 successor sealed files, 2/2 changed source files, and all four reused FP32/FP16 ONNX payloads. Fresh L3 evidence remains pinned to AsmaaQ/gender_audio_1080@47f6563..., default/test, with requested/selected/processed/rejected 2/2/2/0, 10 windows, accuracy 1.0, and macro-F1 1.0; this is correctly labeled functional smoke only.
  • Public commands pin candidate 8010667... and dependency 1bd919b..., fail closed on remote-ref mismatch, verify dependency ancestry, detach the exact candidate, and require a clean checkout. The published branch resolves exactly to the candidate.
  • Lane A refactor: move remaining network-dependent tests to integration #254 is Draft at exact head 5f1368f5ee3296aab5799f55c31acf152e4f9c07, labeled model-scale-by-skill, with its check successful and body matching the sealed learner artifact. Dependency recipe(ast): use eager attention for AudioSet model #1326 remains Draft at its exact head with 9/9 checks successful.

Independent gates

  • Reviewer discriminator: 1 passed.
  • Audio evaluator compatibility: 18 passed.
  • Affected commands CI partition: 3,648 passed, 9 skipped, 1 warning in 250.51s, using the fresh checkout source.
  • ruff check src/ tests/: pass.
  • mypy -p winml.modelkit: pass, 439 source files.
  • pre-commit run insert-license --all-files: pass.
  • Editor diagnostics and git diff --check: pass; checkout remained clean.

GitHub gate

  • PR feat(eval): support Common Voice gender classification #1329 is OPEN and Draft at the exact reviewed head with label model-scale-by-skill.
  • Exact-head rollup: 9/9 terminal checks successful: Analyze (Python), lint, test (analyze), test (models), test (optim), test (commands), test (remaining), CodeQL, and license/cla.
  • Conversation comments before this verdict: 2. Review comments: 0. Reviews: 0. Review threads enumerated: 0; unresolved: 0.

This is the skill-level APPROVE opinion delivered as a normal PR conversation comment. The PR remains Draft; this comment does not authorize readying or merging it.

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

Labels

model-scale-by-skill Model support PR created or maintained by the adding-model-support skill

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant