microsoft / microsoft/winml-cli

e2e eval harness silently ignores `*_fp32_config.json` recipes (fp32 not in KNOWN_PRECISIONS) — affects #1084, #1093

Open Beginner friendly
#1,097 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug P1 triaged
Dominant language
Python
Stars
40
Forks
11
Avg merge
1d 8h
Merged PRs (30d)
50

Description

Summary

The e2e eval harness discovers authored recipes by a precision token parsed from the filename. In scripts/e2e_eval/utils/recipes.py:

KNOWN_PRECISIONS: tuple[str, ...] = ("fp16", "w8a16", "w8a8")

discover_recipe_variants()split_task_precision() only strips those suffixes; any other trailing token (e.g. fp32) yields precision=None, and the file is dropped in discover_recipe_variants (if cfg_task != task or precision is None: continue).

Consequence: a recipe named *_fp32_config.json is never recognized as a precision variant. If a model dir contains only fp32-named recipes, discover_recipe_variants returns empty and the harness silently falls back to winml config auto-generation — the authored recipe is never built or evaluated.

Why this is a naming trap

The catalog convention is that the unquantized bucket is named *_fp16_config.json with quant: null:

  • 75 / 75 *_fp16_config.json recipes under examples/recipes/ have quant: null; 0 carry quant.mode=fp16.
  • fp16 is realized per-EP at eval time via --precision fp16 (which resolves to quant.mode=fp16), not baked into the recipe. _run_recipe_build in run_eval.py builds authored recipes recipe-driven (winml build -c <recipe>), with no --precision/--device flag.
  • On CPU the unquantized recipe deliberately stays fp32 — see tests/e2e/test_config_e2e.py: "device=cpu + precision=auto must NOT trigger FP16 conversion."

So a quant: null recipe named _fp16_ is correct and intended. The same content renamed _fp32_ falls outside the harness's recognized precisions and is dropped.

Impact (two open PRs)
PR Model (in models_all.json) Recipes shipped Harness result
#1084 audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim audio-classification_fp32_config.json (only) no variant discovered → authored recipe ignored, evals via auto-config
#1093 impira/layoutlm-document-qa question-answering_fp32_config.json, question-answering_w8a16_config.json fp32 skipped → only w8a16 discovered, no unquantized/fp16-bucket eval

Contrast (correct): usyd-community/vitpose-plus-base ships keypoint-detection_fp16_config.json + keypoint-detection_w8a8_config.json — both discovered.

Suggested fix

Rename the *_fp32_config.json recipes in #1084 and #1093 back to *_fp16_config.json. Their quant: null content already matches the fp16-bucket convention, so the rename makes them discoverable and consistent with the other 75 recipes — no content change needed.

Alternatively, if fp32-named recipes are meant to be first-class, add fp32 to KNOWN_PRECISIONS and the harness precision-resolution. The rename is the lower-risk, convention-aligned option.

References
  • scripts/e2e_eval/utils/recipes.pyKNOWN_PRECISIONS, split_task_precision, discover_recipe_variants
  • scripts/e2e_eval/run_eval.py_run_recipe_build (recipe-driven build, no --precision)
  • tests/e2e/test_config_e2e.py — CPU stays fp32 by design

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in scripts/e2e_eval/utils/recipes.py by reading KNOWN_PRECISIONS, split_task_precision(), and discover_recipe_variants(), then inspect the affected files under examples/recipes/. Run the relevant e2e tests in tests/e2e/test_config_e2e.py and verify that the affected authored recipes are discovered without changing their quant content.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing-qa, tooling
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.