Skip to content

fix(export): bind keyword inputs and add OWLv2 recipes#1146

Draft
ssss141414 wants to merge 1 commit into
mainfrom
ssss141414/add-google-owlv2-base-patch16-finetuned-recipe
Draft

fix(export): bind keyword inputs and add OWLv2 recipes#1146
ssss141414 wants to merge 1 commit into
mainfrom
ssss141414/add-google-owlv2-base-patch16-finetuned-recipe

Conversation

@ssss141414

@ssss141414 ssss141414 commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This adds CPU fp32/fp16 support for google/owlv2-base-patch16-finetuned, an open-vocabulary zero-shot object detector, together with a class-wide exporter repair for keyword-generated multi-input models. The shipped Effort/Outcome is L2, and both required CPU tuples reached L2 PASS with semantic-input performance and all-four-output parity against the pinned PyTorch checkpoint. winml eval remains CLI-BLOCKED for both tuples because no zero-shot-object-detection evaluator exists; no task metric is fabricated.

Model metadata

What the model does

OWLv2 is an open-vocabulary, text-conditioned object detector. It accepts an image and one or more text queries and returns per-patch query logits, normalized bounding boxes, and text/image embeddings for locating objects not limited to a fixed training label set.

  • Evidence: Hugging Face model card for google/owlv2-base-patch16-finetuned pinned at d69b086b07123308a4e198343ab2824e1af7774a; pinned config.json with architectures=["Owlv2ForObjectDetection"] and model_type="owlv2"; Transformers Owlv2ForObjectDetection.forward source.

  • Confidence: verified.

Primary user stories

  • A user supplies an image and natural-language candidate object labels to obtain scored bounding boxes for zero-shot text-conditioned object localization. Evidence: pinned model-card usage example and intended-use section. Confidence: verified.

  • A researcher supplies images and previously unseen category descriptions to study open-vocabulary detector robustness, generalization, bias, and constraints. Evidence: pinned model-card intended-use section. Confidence: verified.

Supported tasks

| Task | Support surfaces | Evidence | Confidence |

|---|---|---|---|

| zero-shot-object-detection | checkpoint; Transformers; Optimum ONNX; WinML | Pinned Hub pipeline_tag; Transformers Owlv2ForObjectDetection; Optimum TasksManager vendor registration for owlv2; winml inspect resolution to OwlV2OnnxConfig | verified |

| feature-extraction | Transformers; Optimum ONNX | Transformers Owlv2Model/Owlv2TextModel/Owlv2VisionModel; Optimum TasksManager vendor registration | mapped |

Model architecture


Owlv2ForObjectDetection

├── OWLv2 multimodal backbone

│   ├── Causal text encoder: token + position embeddings → 12 layers (512 hidden, 8 heads, 2048 FFN) → 512 projection

│   └── ViT-B/16 image encoder: 960×960 image → 60×60 patches + class token → 12 layers (768 hidden, 12 heads, 3072 FFN)

├── Patch-text fusion: class-token-conditioned patch map + normalized text embeddings

├── Class head: patch/query similarity logits + learned shift/scale

├── Objectness head: MLP → 1 score per patch

└── Box head: MLP + grid bias → normalized cxcywh per patch

  • Source/confidence: pinned checkpoint configuration and resolved nested text/vision configs, Transformers Owlv2ForObjectDetection source, and the exported ONNX hierarchy (verified).

Validation and support evidence

Baseline

Fresh baseline validation used current main commit 38767add6f91c7b10b6394fae3af6f437e02effd with WinML 0.2.0. Optimum advertised feature-extraction and zero-shot-object-detection both before and after WinML registration, with no WinML-added task: VENDOR-ONLY.

  • Auto-config resolved zero-shot-object-detection, AutoModelForZeroShotObjectDetection, and OwlV2OnnxConfig, but emitted /export/input_tensors as [pixel_values,input_ids,attention_mask].

  • Recipe-free build returned process exit 0 in 122.981 s, but failed the L0 floor: the graph bound pixel_values to INT32 [1,16] and input_ids to FLOAT [1,3,960,960], opposite Owlv2ForObjectDetection.forward(input_ids, pixel_values, attention_mask). An exit-zero export was therefore not valid task coverage.

  • Semantic named-input perf failed with exit 1: Invalid rank for input: pixel_values Got: 4 Expected: 2. Random graph-shaped perf returned p50 3034.894 ms, throughput 0.33 samples/s, and RSS total delta 1426.47 MB, but is invalid task evidence because it follows the swapped graph bindings.

  • Eval was CLI-BLOCKED before data/model execution: zero-shot-object-detection was absent from TASK_SCHEMAS and _EVALUATOR_REGISTRY. The pinned COCO mirror is object-detection data, but a valid evaluator must derive candidate text queries from category names, run grounded post-processing, and score COCO mAP; the fixed-label object-detection evaluator is not semantically interchangeable. The generalized evaluator gap is filed as winml-cli #1147.

Baseline Goal floor: L0.

Goal

  • Effort: L2 — repair the class-of-models keyword-input name binding, add a regression test, and add the two required recipes.

  • Goal ceiling: L2.

  • Outcome commitment: L2 for CPU/cpu fp32 and fp16.

  • Success definition: for both tuples, perform fresh config/build with exact named ONNX structure, run processor-generated semantic image+text perf, and compare all four raw outputs against pinned PyTorch revision d69b086b07123308a4e198343ab2824e1af7774a.

  • No ceiling change or re-issued charter occurred.

Outcome

  • Shipped tier: L2.

  • Highest Goal verdict: L2 PASS.

  • Coverage: full; both required CPU/cpu precision tuples passed; deferred tuples: none.

  • Supplementary eval: CLI-BLOCKED for both tuples; no task metric fabricated.

  • Shipped paths: the shared exporter repair and regression test, plus fp32/fp16 recipes under examples/recipes/google_owlv2-base-patch16-finetuned/cpu/cpu/.

  • Model findings: owlv2-004 records faithful fp32/fp16 CPU export/perf/parity and the fp16 box-delta caveat; owlv2-005 records the zero-shot evaluator gap, why fixed-label evaluation is invalid, and the filed issue winml-cli #1147.

  • Methodology finding: _meta-084 distinguishes recipe ordering defects from generalized keyword-export binding defects and requires recipe-free semantic acceptance while preserving explicit positional export protocols.

  • Lane A provenance: these findings and the corresponding producer/tester/reviewer contract refinements are in source-branch commit 7cdfad2a05fc20d2e7ed96db93e666df20689485. This exact post-merge source-branch commit updates owlv2-005.feature_gaps_filed to winml-cli #1147. It remains on the source branch because ModelKitArtifacts PR #159 is already merged; no Lane A files are included in this model PR.

Per-EP/device/precision results — including perf and eval data

Goal ladder

| Tier | Verdict | Evidence |

|---|---|---|

| L0 | PASS | Both exact CPU/cpu precision tuples were freshly configured, built, and structurally validated. fp32/fp16 build times were 100.8660367 s / 116.974988 s; both expose input_ids INT32 [1,16], pixel_values FLOAT [1,3,960,960], and attention_mask INT32 [1,16], plus logits, pred_boxes, text_embeds, and image_embeds. |

| L1 | PASS | Both tuples completed 10 warmups and 100 measured processor-generated semantic-input iterations with memory capture. |

| L2 | PASS | Both tuples compared logits, pred_boxes, text_embeds, and image_embeds against pinned PyTorch on identical semantic inputs. |

Performance

| Tier | EP / Device | Precision | Verdict | Mean | p50 | p90 / p95 / p99 | Std | Warmup mean | Throughput | RAM Δ (load + inference) | VRAM local/shared Δ |

|---|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|

| L1 | CPUExecutionProvider / cpu | fp32 | PASS | 2864.275 ms | 2868.799 ms | 2990.744 / 3090.821 / 4458.42 ms | 227.563 ms | 3129.52 ms | 0.35 samples/s | 1423.95 MB (504.39 + 919.56) | 0.0 / 0.0 MB |

| L1 | CPUExecutionProvider / cpu | fp16 | PASS | 3958.256 ms | 3943.525 ms | 4091.145 / 4127.269 / 4566.801 ms | 94.429 ms | 4021.603 ms | 0.25 samples/s | 3634.66 MB (618.49 + 3016.17) | 0.0 / 0.0 MB |

L2 all-output parity

Parity is against PyTorch checkpoint revision d69b086b07123308a4e198343ab2824e1af7774a on the same processor-generated inputs, before post_process_grounded_object_detection.

| Precision | Output | Shape | Cosine similarity | Max abs diff | Mean abs diff | RMSE | Additional task-facing measure |

|---|---|---|---:|---:|---:|---:|---|

| fp32 | logits | [1,3600,1] | 0.9999999999973036 | 0.0002536773681640625 | 0.00003874407874213324 | 0.00005066664507799361 | sigmoid probability max Δ 1.0459867096952605e-09 |

| fp32 | pred_boxes | [1,3600,4] | 0.9999999999978494 | 0.000020384788513183594 | 6.614572420302365e-07 | 1.2354488877881363e-06 | mean raw normalized cxcywh IoU 0.9999946354690188; center L2 4.988567341990188e-07; size L2 1.6024903863345032e-06 |

| fp32 | text_embeds | [1,1,512] | 0.9999999999998044 | 1.1920928955078125e-07 | 2.1396012961361066e-08 | 2.7659271996813866e-08 | row cosine min/mean 0.9999999999998042 |

| fp32 | image_embeds | [1,60,60,768] | 0.9999999999992097 | 0.00016033649444580078 | 7.003135723185441e-07 | 1.258130226559189e-06 | row cosine min 0.9999999999611946; mean 0.9999999999992424 |

| fp16 | logits | [1,3600,1] | 0.9999985234500899 | 0.4004535675048828 | 0.03721526781717936 | 0.047675061767347246 | sigmoid probability max Δ 4.985980597621861e-07 |

| fp16 | pred_boxes | [1,3600,4] | 0.9999983128330443 | 0.016967952251434326 | 0.0005751266507690565 | 0.001102209982320831 | mean raw normalized cxcywh IoU 0.9954116316743082; center L2 0.00043634357334799317; size L2 0.0013853381709355733 |

| fp16 | text_embeds | [1,1,512] | 0.9999997517780107 | 0.0001614093780517578 | 0.00002433118910527554 | 0.000031142131733688554 | row cosine min/mean 0.9999997517780105 |

| fp16 | image_embeds | [1,60,60,768] | 0.99999922301875 | 0.18775832653045654 | 0.0006581207882101428 | 0.0012534093656211827 | row cosine min 0.9999292538054624; mean 0.9999992292296191 |

The fp16 pred_boxes max-absolute delta 0.016967952251434326 fails the strict auxiliary 0.005 absolute check. L2 remains PASS because all outputs are present and the task-facing box criterion passes: mean raw normalized-box IoU is 0.9954116316743082 against the 0.99 threshold. This does not claim dataset mAP, query derivation, threshold stability, target-size rescaling, or final detection-list equivalence.

Eval

| EP / Device | Precision | Verdict | Dataset | Revision | Subset | Exit | Metric |

|---|---|---|---|---|---|---:|---|

| CPUExecutionProvider / cpu | fp32 | CLI-BLOCKED | detection-datasets/coco | cf0b22332314a937e9dc8a1957b21725430bb41d | none | 1 | none |

| CPUExecutionProvider / cpu | fp16 | CLI-BLOCKED | detection-datasets/coco | cf0b22332314a937e9dc8a1957b21725430bb41d | none | 1 | none |

Both tuples returned the same error before dataset/model execution:

Error: Evaluation failed: Task 'zero-shot-object-detection' is not supported. Supported tasks: compare-tensor, depth-estimation, feature-extraction, fill-mask, image-classification, image-feature-extraction, image-segmentation, image-to-text, keypoint-detection, mask-generation, next-sentence-prediction, object-detection, question-answering, sentence-similarity, sequence-classification, text-classification, token-classification, zero-shot-classification, zero-shot-image-classification.

Block reason: no zero-shot-object-detection schema or evaluator exists; fixed-label object detection is semantically non-interchangeable. Filed gap: winml-cli #1147.

Delta

Recipe versus fresh auto-config

| Recipe | JSON pointer | Auto-config baseline | Shipped | Reason |

|---|---|---|---|---|

| fp32 | /export/input_tensors | [pixel_values,input_ids,attention_mask] | [input_ids,pixel_values,attention_mask] | Match the resolved Owlv2ForObjectDetection.forward order and remain independently safe for positional ONNX naming. |

| fp16 | /export/input_tensors | [pixel_values,input_ids,attention_mask] | [input_ids,pixel_values,attention_mask] | Same ordering repair. |

| fp16 | /quant | null | generated mode=fp16 configuration with fp16_keep_io_types=true | Produce the required exact fp16 CPU candidate while retaining fp32 I/O. |

All checkpoint dimensions and loader fields remain checkpoint-derived. The production recipe README is untouched.

General exporter change

HTPExporter._resolve_keyword_input_names and HTPExporter._convert_model_to_onnx now derive ONNX input_names for keyword-generated multi-input exports from the inspected forward signature filtered to the configured/generated input set. If inspection is unavailable or incomplete, configured order is preserved without guessing. Models with explicit get_export_args() retain their configured positional protocol; a dedicated regression test covers that behavior.

This is consistent with the charter's class-of-models fix. Recipe-free acceptance passed in 106.191 s with exact semantic bindings (input_ids INT32 [1,16], pixel_values FLOAT [1,3,960,960], attention_mask INT32 [1,16]), so acceptance is not dependent on the model-specific recipe ordering.

Analyze summary — component level and op level

ANALYZE-PARTIAL-SUCCESS: public static rule analysis produced all 11 classification rows for each artifact, but the process exited 1 after host OpenVINO plugin registration failed with Error 126 (onnxruntime_providers_shared.dll missing). These classifications are static rule analysis, not accelerator runtime execution or fresh accelerator support.

Rules provenance: public WinML CLI release v0.2.0, rules-v0.2.0.zip, containing 1,746 parquet rule files for TensorRT RTX GPU, OpenVINO CPU/GPU/NPU, and QNN GPU/NPU.

Component-level summary

| Artifact | Architecture coverage | Mapping | Actionable EP findings |

|---|---|---|---|

| fp32 | 12x causal text Transformer; 12x ViT-B/16 image Transformer; patch/text fusion; class, objectness, and box heads | 1007 mapped, 0 partial, 0 unmapped; confidence mapped | TensorRT RTX and OpenVINO CPU/GPU/NPU unknown: Cast, Einsum, Sqrt. QNN GPU/NPU partial: Add, Div, Erf, Mul; unknown: Cast, Einsum, Sqrt; none unsupported. |

| fp16 | same regions | 1012 mapped, 0 partial, 0 unmapped; confidence mapped | TensorRT RTX and OpenVINO CPU/GPU/NPU unknown: Cast, Einsum, Sqrt. QNN GPU/NPU partial: Add, Div, Erf, Expand, Mul; unknown: Cast, Einsum, Sqrt; none unsupported. |

Op-level summary

| Artifact | Graph | Dominant operators | EP roll-up |

|---|---|---|---|

| fp32 | 1007 operators / 27 types | Reshape 235; Add 231; MatMul 199; Transpose 121; Mul 81; LayerNormalization 52; Sigmoid 25; Softmax 24 | TensorRT RTX/OpenVINO/QNN findings as above; no fully-supported EP group established by the rules. |

| fp16 | 1012 operators / 27 types | Reshape 235; Add 231; MatMul 199; Transpose 121; Mul 81; LayerNormalization 52; Sigmoid 25; Softmax 24 | TensorRT RTX/OpenVINO/QNN findings as above; no fully-supported EP group established by the rules. |

Rule-less results for CPUExecutionProvider/CPU, CUDAExecutionProvider/GPU, DmlExecutionProvider/GPU, MIGraphXExecutionProvider/GPU, and VitisAIExecutionProvider/NPU classify all operator types as unknown.

Reproduce commands

The checkpoint and dataset are pinned below. The exact Hub revision is first materialized into $SNAPSHOT with huggingface_hub.snapshot_download; every WinML checkpoint load, processor load, and PyTorch reference then consumes that local snapshot. $INPUTS is a named semantic NPZ generated from a constant 960×960 RGB image and the text query a photo of a cat; this preserves the validation surface used for perf and parity.

$MODEL_ID = 'google/owlv2-base-patch16-finetuned'
$REV = 'd69b086b07123308a4e198343ab2824e1af7774a'
$OUT = 'artifacts/google_owlv2-base-patch16-finetuned-repro'
$SNAPSHOT = Join-Path $OUT 'checkpoint_snapshot'
$INPUTS = Join-Path $OUT 'semantic_inputs.npz'
New-Item -ItemType Directory -Force $OUT | Out-Null

winml --version
git rev-parse HEAD
python -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='$MODEL_ID', revision='$REV', local_dir=r'$SNAPSHOT')"
python -c "from pathlib import Path; import numpy as np; from PIL import Image; from transformers import AutoProcessor; out=Path(r'$INPUTS'); p=AutoProcessor.from_pretrained(r'$SNAPSHOT', use_fast=False); x=p(text=[['a photo of a cat']], images=Image.new('RGB',(960,960),(127,127,127)), return_tensors='np'); np.savez(out, input_ids=x['input_ids'].astype(np.int32), pixel_values=x['pixel_values'].astype(np.float32), attention_mask=x['attention_mask'].astype(np.int32))"

# Recipe-free baseline/acceptance: proves the shared exporter fix is not recipe-dependent.
winml build -m $SNAPSHOT -o $OUT/recipe-free --ep cpu --device cpu --no-analyze --no-optimize --no-quant --no-compile --rebuild --no-color

winml build -c examples/recipes/google_owlv2-base-patch16-finetuned/cpu/cpu/zero-shot-object-detection_fp32_config.json -m $SNAPSHOT -o $OUT/fp32 --ep cpu --device cpu -p fp32 --no-analyze --no-compile --rebuild --no-color
winml build -c examples/recipes/google_owlv2-base-patch16-finetuned/cpu/cpu/zero-shot-object-detection_fp16_config.json -m $SNAPSHOT -o $OUT/fp16 --ep cpu --device cpu -p fp16 --no-analyze --no-compile --rebuild --no-color
winml perf -m $OUT/fp32/model.onnx --ep cpu --device cpu --precision fp32 --input-data $INPUTS --iterations 3 --warmup 1 --memory --output $OUT/perf_fp32.json --overwrite --format json --no-color
winml perf -m $OUT/fp16/model.onnx --ep cpu --device cpu --precision fp16 --input-data $INPUTS --iterations 3 --warmup 1 --memory --output $OUT/perf_fp16.json --overwrite --format json --no-color

$env:SNAPSHOT = $SNAPSHOT
$env:INPUTS = $INPUTS
$env:FP32_ONNX = Join-Path $OUT 'fp32/model.onnx'
$env:FP16_ONNX = Join-Path $OUT 'fp16/model.onnx'
@'
import os
import numpy as np
import onnxruntime as ort
import torch
from transformers import AutoModelForZeroShotObjectDetection

inputs_np = dict(np.load(os.environ['INPUTS']))
model = AutoModelForZeroShotObjectDetection.from_pretrained(os.environ['SNAPSHOT']).eval()
inputs_pt = {name: torch.from_numpy(value) for name, value in inputs_np.items()}
with torch.no_grad():
    reference = model(**inputs_pt)
reference_by_name = {
    'logits': reference.logits.detach().cpu().numpy(),
    'pred_boxes': reference.pred_boxes.detach().cpu().numpy(),
    'text_embeds': reference.text_embeds.detach().cpu().numpy(),
    'image_embeds': reference.image_embeds.detach().cpu().numpy(),
}
for precision, model_path in [('fp32', os.environ['FP32_ONNX']), ('fp16', os.environ['FP16_ONNX'])]:
    session = ort.InferenceSession(model_path, providers=['CPUExecutionProvider'])
    actual = dict(zip([output.name for output in session.get_outputs()], session.run(None, inputs_np)))
    for name, expected in reference_by_name.items():
        observed = actual[name].astype(np.float64).ravel()
        expected = expected.astype(np.float64).ravel()
        cosine = np.dot(observed, expected) / (np.linalg.norm(observed) * np.linalg.norm(expected))
        print(precision, name, 'cosine=', float(cosine), 'max_abs=', float(np.max(np.abs(observed - expected))))
'@ | python -
Remove-Item Env:SNAPSHOT,Env:INPUTS,Env:FP32_ONNX,Env:FP16_ONNX

$RULES_ZIP = Join-Path $OUT 'rules-v0.2.0.zip'
$RULES = Join-Path $OUT 'rules-v0.2.0'
Invoke-WebRequest 'https://github.com/microsoft/winml-cli/releases/download/v0.2.0/rules-v0.2.0.zip' -OutFile $RULES_ZIP -UseBasicParsing
Expand-Archive -Path $RULES_ZIP -DestinationPath $RULES -Force
$env:WINMLCLI_RULES_DIR = (Resolve-Path $RULES).Path
winml analyze --model $OUT/fp32/model.onnx --ep all --device all --htp-metadata $OUT/fp32/export_htp_metadata.json --output $OUT/analyze_fp32.json --overwrite --format json --no-color
winml analyze --model $OUT/fp16/model.onnx --ep all --device all --htp-metadata $OUT/fp16/export_htp_metadata.json --output $OUT/analyze_fp16.json --overwrite --format json --no-color
Remove-Item Env:WINMLCLI_RULES_DIR
winml eval -m $OUT/fp32/model.onnx --model-id $SNAPSHOT --task zero-shot-object-detection --dataset detection-datasets/coco --dataset-revision cf0b22332314a937e9dc8a1957b21725430bb41d --split val --samples 1 --no-shuffle --streaming --ep cpu --device cpu --output $OUT/eval_fp32.json --overwrite --format json --no-color
winml eval -m $OUT/fp16/model.onnx --model-id $SNAPSHOT --task zero-shot-object-detection --dataset detection-datasets/coco --dataset-revision cf0b22332314a937e9dc8a1957b21725430bb41d --split val --samples 1 --no-shuffle --streaming --ep cpu --device cpu --output $OUT/eval_fp16.json --overwrite --format json --no-color

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

Copy link
Copy Markdown
Contributor Author

Independent reviewer verdict: REQUEST_CHANGES

Reviewed exact PR head 3c94de2ef79fc9310150bfc498da157c95622578 against current origin/main 38767add6f91c7b10b6394fae3af6f437e02effd from a fresh detached worktree.

Blocking findings and routing

  1. Explainer — the public pinned reproduction block cannot execute. The PR body constructs $MODEL="$MODEL_ID@$REV" and passes it to both winml build commands. I ran the fp32 command literally with google/owlv2-base-patch16-finetuned@d69b086b07123308a4e198343ab2824e1af7774a; winml build exited 2 before export: is not a valid HuggingFace model identifier (expected 'name' or 'org/name'). winml build --help exposes no revision option. Replace this with an executable pinned-revision strategy supported by the CLI, update downstream --model-id use as needed, and run the entire public block literally before re-review. This fails the required reproducibility gate even though unrevisioned independent builds succeed.

  2. Learner, then explainer — the evaluator feature gap was described but not filed. Lane A finding owlv2-005.feature_gaps_filed[] contains bare prose, neither an issue URL nor a FILE: entry. Because this Outcome-L1+ PR changes shared exporter code, the reviewer contract requires feature-gap entries to resolve to filed issues; a FILE:-only state would still remain REQUEST_CHANGES. File the zero-shot-object-detection evaluator gap, update the pushed Lane A finding with the issue URL, and update the PR's public provenance/evidence to cite it.

Independently verified, not blocking

  • Scope: exactly src/winml/modelkit/export/htp/exporter.py, tests/unit/export/test_pytorch_export.py, and the fp32/fp16 recipe JSON files under examples/recipes/google_owlv2-base-patch16-finetuned/cpu/cpu/; the production recipe README and Lane A files are absent from the model PR.
  • Code/design: the shared exporter derives keyword input names from the filtered model.forward signature and leaves explicit get_export_args() positional protocols intact; no model-ID special case was introduced.
  • Tests/lint: changed-file Ruff/format passed; focused exporter tests passed (27); full tests/unit/export passed (454 passed, 6 skipped, 1 xfailed). Repository-wide Ruff's only diagnostic reproduces on clean main in an untouched SAM script.
  • Builds: recipe-free, fp32, and fp16 builds all exited 0 and printed Build complete. The semantic no-recipe path binds input_ids, pixel_values, and attention_mask correctly.
  • Structure/precision: all three artifacts are opset 17 with the exact three named inputs and four outputs. fp32 has 419 FLOAT initializers and a 613,625,088-byte sidecar; fp16 has 419 FLOAT16 initializers and a 306,812,032-byte adjacent sidecar with fp32 I/O.
  • Perf: independent named-semantic-input runs completed 10 warmups + 100 measured iterations with memory. fp32 reproduced p50 2747.455 ms, 0.35 samples/s, and 1422.45 MB RSS delta (published p50 delta -4.23%); fp16 reproduced p50 4018.968 ms, 0.25 samples/s, and 3635.53 MB RSS delta (published p50 delta +1.91%). Both are within the ±20% reviewer tolerance and report the claimed model precision.
  • Parity: independent pinned-PyTorch comparison reproduced every published value. fp32 passed all checks. fp16 reproduced cosine/IoU checks and the disclosed auxiliary box max-absolute miss (0.016967952251434326 > 0.005, mean normalized-box IoU 0.9954116316743082 > 0.99); the PR describes this limitation rather than hiding it.
  • Eval: both exact PR eval commands independently exited 1 with the documented unsupported zero-shot-object-detection error before data/model execution. CLI-BLOCKED is honest; fixed-label object detection was not substituted.
  • Analysis/provenance: compact component/op evidence and architecture mapping are present. The Lane A text correctly caveats that commit b189423342cdc5c6085d8f7810fccad6488bf6ad was pushed to the source branch after ModelKitArtifacts PR P1-INFRA-003: CI/CD Pipeline — ADO + GitHub Actions + Self-hosted Runners #159 had already merged; it must not be represented as contained in that merge.
  • GitHub gates: 0 issue comments, 0 inline comments, 0 reviews, 0 GraphQL review threads (0 open; no next page). PR remains open Draft with model-scale-by-skill; all 9 checks are completed successfully.

The PR should remain Draft. Re-review from a fresh checkout after both owner-routed fixes land.

@ssss141414

Copy link
Copy Markdown
Contributor Author

REQUEST_CHANGES mapping response

Resolved both blocking findings at unchanged model PR head 3c94de2ef79fc9310150bfc498da157c95622578 (no production-code or recipe commit added).

  1. Public pinned reproduction — resolved in the PR body. The unsupported $MODEL_ID@$REV construction is removed. The block now materializes exact Hub revision d69b086b07123308a4e198343ab2824e1af7774a into $SNAPSHOT with huggingface_hub.snapshot_download, then routes every WinML checkpoint load, processor load, and PyTorch reference through $SNAPSHOT. It also includes explicit winml --version, git rev-parse HEAD, a recipe-free baseline/acceptance build, fp32/fp16 recipe builds, semantic perf/parity, public pinned rules, analyze, and the expected blocked eval probes. Literal validation from a clean $OUT confirmed snapshot materialization, recipe-free/fp32/fp16 builds, semantic perf, all-eight parity values, the 1,746-file public rules layout and absolute rules path, and both expected unsupported-task eval blockers.

  2. Evaluator feature gap — resolved by issue #1147. The issue describes the generalized missing zero-shot-object-detection schema/evaluator, provides portable pinned-snapshot reproduction with no local paths, and explains why fixed-label object detection is not a valid substitute. In Learner ownership, owlv2-005.feature_gaps_filed now cites that URL at exact post-merge ModelKitArtifacts source-branch commit 7cdfad2a05fc20d2e7ed96db93e666df20689485; PR P1-INFRA-003: CI/CD Pipeline — ADO + GitHub Actions + Self-hosted Runners #159 is already merged, so the PR body records this exact new source-branch provenance without adding Lane A files here.

Preserved: Draft state, model-scale-by-skill, unchanged model PR head, and successful CI.

@ssss141414

Copy link
Copy Markdown
Contributor Author

Independent reviewer verdict: APPROVE

Reviewed exact PR head 3c94de2ef79fc9310150bfc498da157c95622578 after remediation response #1146 (comment). The PR must remain Draft.

Prior blockers independently closed

  1. Pinned reproduction commands — CLOSED. The unsupported $MODEL_ID@$REV form is absent. The public block now materializes Hub revision d69b086b07123308a4e198343ab2824e1af7774a with snapshot_download, uses $SNAPSHOT in all three winml build commands and both winml eval --model-id commands, and routes AutoProcessor plus the PyTorch reference through that same snapshot. From a clean output directory I independently materialized the exact revision (621,600,870 bytes, including the 620,006,741-byte checkpoint), generated the named semantic inputs, and ran the recipe-free snapshot build: exit 0, Build complete, model present, and no invalid-Hugging-Face-identifier error. Both fp32/fp16 eval probes accepted the snapshot path and reached only the documented unsupported-task blocker.

  2. Generalized evaluator issue and Lane A provenance — CLOSED. Add zero-shot object detection schema and evaluator to winml eval #1147 is a real open generalized feature gap: it specifies candidate-query derivation, grounded post-processing, query-local-to-dataset category mapping, COCO mAP, and why fixed-label object detection is not interchangeable. Pushed commit https://github.com/gim-home/ModelKitArtifacts/commit/7cdfad2a05fc20d2e7ed96db93e666df20689485 changes only model_knowledge/owlv2.json and replaces the bare gap with issue Add zero-shot object detection schema and evaluator to winml eval #1147. ModelKitArtifacts PR P1-INFRA-003: CI/CD Pipeline — ADO + GitHub Actions + Self-hosted Runners #159 merged earlier at e98a125db71d6d1421f288dff37fde0c5ce8262e; its 22 recorded commits do not contain 7cdfad2a. The model PR accurately describes 7cdfad2a as an exact post-merge source-branch commit rather than claiming it was in PR P1-INFRA-003: CI/CD Pipeline — ADO + GitHub Actions + Self-hosted Runners #159.

Independent revalidation

  • Checkout/scope: exact requested head; merge base and current origin/main are 38767add6f91c7b10b6394fae3af6f437e02effd (rev-list count 0). Diff remains exactly two CPU recipe JSONs, exporter.py, and its focused unit test. Production recipe README is unchanged.
  • Code and focused checks: generalized signature-derived keyword input ordering remains intact while explicit positional get_export_args() protocols remain authoritative. Changed-file Ruff passed, Ruff format passed, and focused exporter tests passed: 27 passed.
  • Public contract: architecture is canonically unchanged; Delta/Analyze are canonically unchanged; perf/parity/eval values and blocker are unchanged, with the only semantic addition in that section being the filed issue Add zero-shot object detection schema and evaluator to winml eval #1147 link. The PR body contains no absolute/local scratch path leakage.
  • Prior full evidence remains applicable: model head is unchanged; independent fp32/fp16 build, structure/precision, 100-iteration perf, all-output parity, eval, and analyze review findings therefore remain valid. The fresh pinned-snapshot build additionally validates the remediated command surface.
  • External review surfaces: 2 issue comments enumerated, 0 inline comments, 0 submitted reviews, 0 GraphQL review threads, 0 open threads.
  • GitHub gates: OPEN, MERGEABLE, Draft, model-scale-by-skill present, exact head preserved, and all 9/9 CI checks successful.

No remaining reviewer-owned or role-routed blocker was found. APPROVE, while preserving Draft state and the label.

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