All notable changes to this project are documented in this file.
The format is loosely based on Keep a Changelog.
This cycle expands model preparation and evaluation across the CLI: precision-driven quantization, composite-model and dynamic-axis workflows, real-input perf/eval, optimization previews, and opt-in Dynamo export. It also introduces one-command Qwen3 onnxruntime-genai bundles, GenAI benchmarking, broader model recipes, and more reliable EP discovery, compilation, and monitoring. See the behavior changes below.
- Output-producing commands now refuse to replace existing files or non-empty directories unless
--overwriteis passed;winml buildretains its existing incremental--rebuildbehavior (#970). winml quantizerenames--model-nameto--model-id, including the corresponding quantization-config field (#984).- Compile configuration no longer silently defaults a missing execution provider to QNN; incomplete configurations now fail validation instead (#1026).
winml inspect/winml perfhide third-party and native warning noise by default; use-v,-vv, orWINMLCLI_SHOW_ALL_WARNINGS=1to restore diagnostics (#1232, #1246).
- Quantization —
--precisionselects FP16 conversion, RTN INT4, static QDQ, or calibration-free dynamic INT8;winml quantizecan compose multiple precision passes such as INT4 followed by FP16 (#872, #985, #1047). winml build—--export-type optimizedproduces a complete Qwen3 onnxruntime-genai NPU/QNN bundle, including prefill/decode, embeddings, LM head, tokenizer, and manifest files (#836, #996, #1008, #1081, #1104).winml perf --runtime winml-genai— benchmarks prebuilt or automatically cached GenAI bundles with TTFT, token throughput, prompt-template controls, EP overrides, and isolated pre-compilation (#1015, #1042, #1046, #1054, #1109).- Composite models —
exportandbuildautomatically fan out pipeline components;export/build/perfsupport--submodel, and explicit composite tasks such as summarization and translation are accepted (#1031, #1037, #1058, #1071, #1089). - Export controls — dynamic axes and symbolic input dimensions are supported while static TorchScript export remains the default;
build,config,perf, andevalexpose matching shape/input/export overrides (#1074, #1083, #1106, #1141, #1156, #1188). winml perf— real.npzinputs, time-budgeted--durationruns, cached per-module builds, actual dynamic dimensions, and QNN profiler ONNX metrics (#1004, #1055, #1066, #1102, #1168).- QNN op tracing — per-model tracing can be enabled automatically; basic traces exclude warmup samples and null fields, while detail tracing accepts compile EP options and auto-compiles raw ONNX inputs when required (#1006, #1032, #1249, #1252).
winml eval --mode compare— compares two ONNX models directly or uses real.npzsamples against a Hugging Face reference; Qwen3 adds perplexity evaluation (#1139, #1209, #1221).winml optimize/winml analyze—--check-optimpreviews applicable rewrites and verifies their produced operators against the target EP; new rewrites cover static Split-to-Slice and Conv affine/BatchNormalization folding (#1142, #1167, #1171, #1238, #1257).- EP discovery and monitoring — registration is isolated and failures are structured, startup remains lazy, op-tracing dispatch is unified, and provider-download progress is restored (#1019, #1239).
- CLI quality of life — EP/device and pipeline-stage flags are consistent across commands;
--no-colordisables ANSI output for one invocation (#923, #978, #992). - Hub-hosted ONNX — commands accept
<org>/<repo>/<path>.onnxreferences from Hugging Face Hub, enabling SAM 3 encoder/decoder workflows (#582). - Keypoint detection — ViTPose supports
config,build, andperf, plus COCO OKS-AP evaluation (#905, #949). - Vision and document recipes — refreshed coverage adds DINOv2, SwinV2, OWL-ViT/OWLv2, BEiT, SegFormer, YOLOS, ViTPose/SynthPose, LayoutLM/LayoutLMv3, and document/question-answering models (#925, #1064, #1088, #1093, #1100, #1101, #1123, #1125, #1145, #1155, #1173, #1174, #1178, #1187, #1201, #1202, #1205, #1208).
- Language recipes — expanded BART, BERT, DeBERTa, DistilBERT, KoELECTRA, MiniLM, MPNet, Marian/OPUS, GTE reranker, feature-extraction, and entity-linking coverage (#1068, #1080, #1112, #1115, #1116, #1117, #1118, #1120, #1121, #1124, #1134, #1143, #1144, #1153, #1169, #1170, #1179, #1200, #1214).
- Audio recipes — expanded Wav2Vec2, HuBERT, AST, MMS, language/gender/music classification, forced alignment, and multilingual ASR coverage (#1094, #1095, #1114, #1131, #1148, #1154, #1176, #1186, #1206, #1207, #1211, #1225).
winml perf— throughput uses the batch size actually executed; analyzer EP resolution and op-trace paths now match the runtime target (#930, #941, #1000).winml build— honors explicit--ep, supports non-compiling cross-target builds, keeps ONNX caches distinct by resolved path and configuration, preserves configured model classes, reports disk-full failures clearly, and keeps CPU/GPU automatic precision at FP32 (#856, #947, #987, #997, #998).- GenAI and composite export — fixed component export/build failures, compile fallback paths, accelerator selection, isolated EPContext preparation, and final Qwen3 bundle assembly (#1037, #1051, #1103, #1138, #1248).
- Task and model resolution — reconciled the task registry, corrected model-specific task listings and Hub
pipeline_tagfallback, accepted composite tasks, and resolved CTC-based ASR model classes correctly (#724, #986, #1070, #1071, #1113, #1154). - Depth and keypoint evaluation — fixed inference-time evaluator failures (#1023).
- Analyzer and optimizer rules — corrected coverage counting, aligned pattern checks with node support, consolidated recommendation metadata, and fixed dtype constraints and unknown-pattern handling (#922, #1020, #1063, #1130, #1162).
- EP / device resolution — WindowsML catalog providers register correctly; device listings retain hardware details without duplicate aliases; analyzer auto-selection prefers the strongest exact target; CPU bridge providers resolve safely; invalid EP/device pairs fail early (#1076, #1220, #1227, #1228, #1231, #1237).
- Native EP execution — hardened spawned-provider progress, prevented compiler-output deadlocks, released native sessions before process exit, and replaced pipe-backed warning capture with a bounded file spool to avoid EP compiler hangs (#1017, #1223, #1230, #1266, release cherry-pick #1267).
- Export and quantization — standalone quantization suppresses duplicate ORT preprocessing warnings; decoder KV-cache dimensions survive tracing; large external-data models can convert to FP16; and EPs that quantize internally no longer receive redundant WinML quantization (#956, #1176, #1235, #1242).
- QNN evaluation and tracing — repaired evaluation failures, detail-trace DLL/summary handling, and compile-time provider options (#1247, #1249).
winml eval— default text datasets and sentiment recipes use fully qualified Hugging Face dataset IDs (#1262, release cherry-pick #1263).- CLI help —
winml --helpshows the correctsyssummary and concise, untruncatedbuild/quantizedescriptions (#1254). - Telemetry — local
Pathmodel references no longer cause successful commands to fail during telemetry scrubbing (#1273).
- Release pipelines — E2E aligns ModelKitArtifacts with the matching release branch, stable GitHub releases receive CHANGELOG notes and “Latest” status, and the official-build toolchain is pinned for reproducibility (#940, #967, #1268).
- Evaluation CI — recipe-driven build/eval supports per-EP matrices, pre-exported ONNX, reliable resume behavior, actual applied-precision reporting, unquantized-track EPs, and broader MIGraphX/TensorRT RTX coverage (#845, #902, #1009, #1039, #1086, #1160, #1163, #1226, #1243, #1286).
- Telemetry — action events record scrubbed model identifiers, while error events retain scrubbed root-cause details for diagnosis (#1108, #1111).
- Development environment — expanded type checking, added a tracked
uvlockfile, selected CPU-only PyTorch wheels, and consolidated development dependencies (#932, #957, #1105, #1251, #1255). - Documentation publishing — added and published the version-stamped model accuracy report from the current documentation site (#974, #975, #979, #1203).
winml_cli-0.3.0-py3-none-any.whlrules-v0.3.0.zip
This cycle unifies task detection across the CLI (modality- and architecture-aware) and expands the eval and perf surfaces — new depth-estimation and tensor-similarity evaluators, a full SA eval pipeline with an HTML report, winml perf --memory / --ep-options, and --format json on eval / analyze / perf. winml compile gains a multi-model shared EP context, winml build gains --precision, and timm image-classification is supported. See the behavior changes below.
winml perfno longer compiles by default — added--compile/--no-compile, defaulting to no-compile (#879).- Boolean CLI options are now
--flag/--no-flagpairs (#844). - Telemetry is enabled in the shipped wheel; consent reworded as "unlinked pseudonymized" (#810).
- Task detection — modality- and architecture-aware
detect_task, unified across commands viaresolve_task/TaskResolution(#807, #841, #878). winml perf—--memoryreports RAM/VRAM per phase (#861);--ep-optionspasses runtime EP options (#865, #889); output now shows the model path and precision (#875).winml compile— multi-model shared EP context with a selectable backend (#871).winml build— added--precision(#914).winml inspect— renders composite (pipeline-led) model structure (#903).winml analyze—--ep/--deviceauto resolves to a single best target (#919); faster re-runs plus a--debugrule locator (#906).winml eval— new SA eval pipeline with per-stage perf and an HTML report (#599); depth-estimation (#326, #437) and tensor-similarity (#805) evaluators; scripts track ONNX size and sanitize output (#755).- Cross-command —
--format jsononeval/analyze/perf(#855);--allow-unsupported-nodesonperf/build/eval/run(#821). - Quality of life — timm image-classification via library routing (#790);
~expanded in paths (#815); progress bar during EP warmup (#788); refreshed--list-devicecoloring (#812).
winml perf— declaredpsutilas a runtime dependency, fixing a crash on clean install (#937); composite (dual-encoder) models supported (#866); HF and ONNX paths unified throughPerfBenchmark(#659);--monitorlive chart in--modulemode (#654, #920);richLive thread crashes (#832).winml analyze— coverage-counting bugs (#922); analyzer API EP list matches the CLI (#803); Pad / Gemm rule conflicts (#906).- Task / config validation — fill-mask heads detected as
text2text-generation(#851); vision feature-extraction model-task inconsistency (#786); model task validated in config (#723); full encoder-decoder composite built for no-task seq2seq (#850, #862); device/EP combination validated without a system check (#780). winml export—.datafiles written to the output dir, not the cwd (#853); timmimage_sizefrompretrained_cfg(#806).winml inspect/winml catalog—--taskvalidated at parse time (#546, #771);catalog -tshort flag aligned (#541, #772); VitisAI EP ordered last, catalog table width fixed (#763).- Feature extraction —
last_hidden_statenow populated in the output (#863). winml optimize— untie batched constantMatMulfor OpenVINO GPU (#817).winml eval— fixed failures on AMD hosts (#783); cleanup runs onSKIP_*/ exception paths (#890).- CLI output — quieted
optimumlogger noise (#904); unified verbosity, logger routed to stderr (#566, #793).
winml_cli-0.2.0-py3-none-any.whlrules-v0.2.0.zip
First public preview release. With the Windows ML 2.0 baseline now in place, this release shifts focus to polishing the CLI surface: faster winml inspect / winml eval, more accurate device & EP resolution, a real PyPI release pipeline, and a meaningful pass over sysinfo and quantization behavior.
- Promoted to
Development Status :: 4 - Betainpyproject.toml. - First release published to PyPI via the new ESRP-signed release pipeline (#473).
winml inspect: banner + spinner during HF metadata fetch (#718, hidden in JSON mode #745);--list-tasks<500 ms (#717); processorAuto*lookups gated (#719, #746).winml eval: lazy module loading drops cold-start latency (#711); inputs validated up-front with friendlier errors and a structured--schemaoutput (#694).winml export:model-idandtaskvalidated before the export runs (#714).winml analyze: cleaner EP/device selection, clearer "op-check skipped" UI, merged optimization config (#702).winml perf: estimated model precision (QDQ / block-wise quant / dominant float dtype) is now reported byWinMLSession(#706); expanded perf e2e coverage across EPs and devices (#698).winml monitor: queries all NPU/GPU engines and reports the max utilization (#716).- CLI-wide: did-you-mean suggestions on mistyped subcommands (#699); consistent option-vs-config-file value priority across commands (#720);
op_tracinghidden from the public surface (#738). - Adopted the official
windowsmlusage example — removed the redundantWinMLsingleton, fixing a benign "library already registered" traceback onwinml perf --device npu(#729).
- Quantization (P0) —
--precisionnow rejects invalid values instead of silently falling back touint8/uint8; default image calibration dataset streams rather than downloading ~5 GB; DETR-family object detection supportspixel_maskpadding (#680). winml eval— pinnedpyarrow <24to avoid an EP DLL load-order crash (#750).winml perf— QDQ precision detection fix (#753); NPU monitoring adds3Dengine, device line shows requested vs. actual (#747).- EP / device resolution —
resolve_device/resolve_epsnow useget_registered_ep_devices(#712); dropped misleadingov/vitis/trtrtxaliases (#690);winml sysraises when an EP isn't available on the host (#686); per-providerensure_readyfailures demoted to debug (#703); analyze regression caught during compile e2e (#740). - Native ORT / WinML — suppressed ORT native stderr, fixed a HANDLE leak (#709); nulled the EP catalog handle after enumeration to prevent a QNN NPU crash on exit (#701); fixed the
onnxruntimeDLL search path (#689). winml sys— diagnostic sections gated behind-v, json-mode logs routed to stderr (#737); CPU/Mem scoped to the current process and PDH percent counters no longer artificially capped (#715); host arch reported viaIsWow64Process2on Windows ARM64 (#705).- OpenVINO —
is_npudetection updated (#722).
- Added a
winml-cliCopilot skill (#733).
winml_cli-0.1.0-py3-none-any.whlrules-v0.1.0.zip
- Windows ML → 2.0 (#441)
- Python → 3.11 (
requires-python = ">=3.11,<3.12")
- Incompatible
--ep/--devicepairs are now rejected instead of silently overridden (#641, #661). winml config/build --device npuexits non-zero when no compatible NPU EP is available (#660).winml analyze --ep cpuresolves to CPU instead of falling back to NPU (#641).trust_remote_codenow prints a bold-red stderr warning whenever it is honoured (#641).
winml buildwritesanalyze_result.jsonto the output folder (#673) and validates the config up-front (#675).- Exported ONNX is auto-normalized via
optimize_onnx()(#681). winml inspectdistinguishes local-path-not-found from network errors (#679).
--run-unknown-opcompile=false regression (#662).winml build --device npufailing withquant.task is required(#673).- HF build path dropped explicit
--epon compile-less paths (#678). run_eval.pynot forwarding--devicetowinml build(#674).- Seq2seq decoder calibration crash on image-to-text models (#671).
- Strong-typed EP parameters across analyze/compiler/optracing (#632).
EP_SUPPORTED_DEVICESas single source of truth (#641).- Expanded E2E / CLI surface tests for
analyze,compile,inspect,catalog, and perf (#645, #652, #661, #665, #669, #672, #676).
winml_cli-0.0.4-py3-none-any.whlrules-v0.0.4.zip
The format and packaging of the analyzer runtime rule artifacts changed in v0.0.3. Anyone who scripted against the v0.0.2 release assets, or who points the analyzer at an external rules directory, needs to update.
1. Release asset layout: many per-EP/opset ZIPs → one versioned ZIP of Parquet files
- v0.0.2 published dozens of individual rule archives, one per EP × device × opset (e.g.
QNNExecutionProvider_NPU_ai.onnx_opset17.zip,OpenVINOExecutionProvider_GPU_ai.onnx_opset20.zip, …). - v0.0.3 publishes a single
rules-v0.0.3.zipcontaining Parquet rule files. The filename is version-qualified (rules-v<version>.zip). - Inside the archive, rule data is now stored as
*.parquetrather than the previous ZIP-wrapped JSON. Old ZIP-expansion tooling has been removed.
2. Environment variable rename: MODELKIT_RULES_DIR → WINMLCLI_RULES_DIR
The override for additional runtime-rule lookup directories was renamed as part of the broader ModelKit → WinML CLI product rename. There is no compatibility shim — the old name is silently ignored.
If you build from source or otherwise need to fetch rules manually:
gh release download v0.0.3 --repo microsoft/winml-cli --pattern 'rules-v0.0.3.zip' --dir .Expand-Archive -Path .\rules-v0.0.3.zip -DestinationPath src\winml\modelkit\analyze\rules\runtime_check_rules -Forcegh release download skips pre-releases unless you pass --tag, so the explicit v0.0.3 is required.
If you set MODELKIT_RULES_DIR anywhere (shell profile, CI pipeline, user env), rename it to WINMLCLI_RULES_DIR. It points to a single rules directory (not split on os.pathsep); relative paths still resolve from src/winml/modelkit/analyze/utils/.
Related PRs: #411 (Parquet migration), #600 (rules zip in release), #627 (versioned filename), #587 (env var rename as part of ModelKit → WinML CLI Wave 1).
winml_cli-0.0.3-py3-none-any.whlrules-v0.0.3.zip