recipe(vitpose): add SynthPose Base CPU recipes#1135
Conversation
Independent reviewer verdict: REQUEST_CHANGESScope reviewed: model 4 only ( Blocking findings
Independently verified at
|
bed303b to
04f84f8
Compare
|
Resolved reviewer comment 5014826762 for model 4 only. The PR body now reflects the revised L2/L2/L2 charter and exact four-file generalized fix at |
Independent reviewer verdict: REQUEST_CHANGESScope: PR #1135, model 4 only ( Blocking finding
Prior blockers independently re-verified as resolved at
|
|
Resolved reviewer comment |
Independent reviewer verdict: APPROVEScope: PR #1135, model 4 only ( Final re-entry gate
Conversation gate
Prior evidence and engineering review
Shipment state
APPROVE. |
Summary
Adds CPU
fp32and genuinefp16support forstanfordmimi/synthpose-vitpose-base-hf, a top-down 52-keypoint human-pose model. Revised scope is Effort L2 / Goal L2 / Outcome L2: two recipes correct the processor-derived graph-input range, and a model-agnostic perf fix forwards persisted ranges into dummy-input generation. Both CPU tuples reached L2 PASS against pinned PyTorch eager; task evaluation remainsCLI-BLOCKEDbecause the available default is COCO-17, not this checkpoint's 52-keypoint layout.Model metadata
What the model does
SynthPose ViTPose Base consumes an RGB person crop derived from an externally supplied person bounding box and emits 52 heatmaps: 17 COCO keypoints plus 35 motion-capture/anatomical markers for denser kinematic analysis. Confidence: verified from the pinned model card and checkpoint, configuration, and exported I/O contract.
Primary user stories
Both are verified from the pinned model card.
Supported tasks
keypoint-detection??? verified across the checkpoint pipeline tag, TransformersVitPoseForPoseEstimation/VitPoseImageProcessor, Optimum'sVitPoseOnnxConfig, and WinML's existing VitPose mapping.Model architecture
VitPoseForPoseEstimationsource (verified).Validation and support evidence
Baseline
The frozen recipe-free baseline is clean
origin/maincommite7509b1e908c74beff0a5655b8f8d7de69c5afae, WinML0.2.0. Exact provenance outputs were:Recipe-free build exited
0, passed ONNX checking, and producedpixel_values float32[1,3,256,192] -> heatmaps float32[1,52,64,48], 423 nodes, opset 17. The frozen baseline perf run used 10 warmups and 100 measured iterations: mean90.12 ms, p5088.63 ms, throughput11.1 samples/s, model-load RSS delta354.13 MB, total RSS delta379.67 MB. A fresh detached recheck at the same immutable SHA again exited0(Build complete in 40.3s) and measured mean/p5096.643/96.707 ms,10.35 samples/s, and379.84 MBtotal RSS delta.Auto-config exited
0and resolvedVitPoseForPoseEstimation,keypoint-detection, inputpixel_values [1,3,256,192] float32, outputheatmaps, CPU/CPUExecutionProvider; it emittedvalue_range: [0,1]. Thefp16config also exited0and emitted the generated fp16 conversion declaration.[0,1)was the unrefined dummy range: pinnedVitPoseImageProcessormetadata derives valid float32 values from-2.1179039478302through2.640000104904175, and the semantic crop observed-2.1179039478302through2.5702831745147705.Optimum probe:
keypoint-detectionis vendor-supported before and after WinML (VENDOR+OVERRIDE; WinML adds no task). Baseline/L3 eval isCLI-BLOCKED: the absent default dataset is COCO-17, while this checkpoint emits 52 heatmaps and has no supplied pinned 52-keypoint dataset or defensible 52-value OKS sigma vector.Goal
The reviewer-discovered range contradiction caused an explicit charter re-issue from L0/L2/L0 to Effort L2 / Goal L2 / Outcome L2. Success requires both CPU
fp32andfp16tuples to pass L0 structure and persisted-range checks, L1 default plus processor-semantic perf, and L2 PyTorch heatmap plus 52-keypoint parity. Coverage is full for the committed CPU precision plan; there are no deferred tuples.Outcome
Shipped tier: L2. Highest reached: L2 PASS. Coverage: full. Producer shipment commit:
ee6f4072b3d280f7e1e607bf48fb6838f11a06aa. The exact four-file generalized fix is:examples/recipes/stanfordmimi_synthpose-vitpose-base-hf/cpu/cpu/keypoint-detection_fp32_config.jsonexamples/recipes/stanfordmimi_synthpose-vitpose-base-hf/cpu/cpu/keypoint-detection_fp16_config.jsonsrc/winml/modelkit/commands/perf.pytests/unit/commands/test_perf_cli.pyNo models 5???8, README, skill, scratch, or unrelated files are changed. Model knowledge is durable in Lane A commits
ef623cc54ee8f75217e0abaaa85947b4aba1c1eeand refreshed19db1325e38a0c60cb4739b866a753ef93e4e007, both onorigin/shzhen/model-breakdown-skilland limited to VitPose knowledge.No methodology friction observed. The generalized defect is already covered by
_meta-017; no new methodology finding or skill edit was needed.Per-EP/device/precision results ??? including perf and eval data
Perf
All rows use 10 warmups and 100 measured iterations; VRAM deltas are
0 MBon CPU.Generic
fp32generated range: min-2.117901563644409, max2.639974355697632; genericfp16: min-2.1178860664367676, max2.6399428844451904. Both remain inside[-2.1179039478302, 2.640000343322754)and contain negative and positive values.Numeric parity
Reference:
transformers.VitPoseForPoseEstimationPyTorch eager at revisione1f00dc65c23aedd629089ba44b46154e84a7778, using the identical processor crop and person box[70,115,280,250].Eval
Delta
Both recipes change
/export/input_tensors/0/value_rangefrom auto-config[0,1]to processor-derived high-exclusive[-2.1179039478302,2.640000343322754]. The fp16 recipe additionally changes/quantfromnullto the generated fp16 declaration; fp32 otherwise retains the generated config.generate_random_inputs()now forwards every persistedio_config.input_value_rangesentry without model-ID/model-type branches. Float bounds remain[low, high); integer high-exclusive bounds are adapted to the legacy inclusive NumPy generator without admittinghigh; unspecified floats retain[0,1). Regressions cover a negative[-9,-8)float sentinel, singleton/exclusive integer bounds, unspecified-float fallback, and a realWinMLSessionloading a co-located build config. The focused no-recipe gate passed80tests; the final relevant gate passed363, skipped6, and xfailed1; changed-file Ruff, pre-commit, and diff checks passed. At final headee6f4072b3d280f7e1e607bf48fb6838f11a06aa, the test-local ONNX imports are consolidated tofrom onnx import TensorProto, helper, saveandonnx.save(...)is replaced bysave(...)with no semantic change; the remediation-focused80tests, file Ruff, file pre-commit, diff check, and GitHub CodeQL/check rollup passed. The production recipe README remains untouched.Analyze summary ??? component level and op level
ANALYZE-PARTIAL-SUCCESS: public rules v0.2.0 produced complete 11/11 result payloads for each artifact, while command exit1reflects partial/unknown classifications. This is static rule analysis, not runtime execution; every row reported runtime supportfalse.Component-level summary
Op-level summary
CPU, CUDA, MIGraphX, DML, and VitisAI are all-unknown under this rules bundle. There are no component-mapping gaps.
Reproduce commands
Portable public commands for the exact baseline/config gates and shipped artifacts: