Skip to content

recipe(deberta): add cross-encoder/nli-deberta-v3-base (text-classification, NLI)#1117

Merged
DingmaomaoBJTU merged 1 commit into
mainfrom
add-cross-encoder-nli-deberta-v3-base
Jul 16, 2026
Merged

recipe(deberta): add cross-encoder/nli-deberta-v3-base (text-classification, NLI)#1117
DingmaomaoBJTU merged 1 commit into
mainfrom
add-cross-encoder-nli-deberta-v3-base

Conversation

@DingmaomaoBJTU

Copy link
Copy Markdown
Collaborator

Summary

Adds a curated CPU float recipe for cross-encoder/nli-deberta-v3-base — a DeBERTa-v3 cross-encoder for natural-language inference (3-way sequence classification: contradiction / entailment / neutral; config model_type = deberta-v2). Ships fp32 + fp16 variants under cpu/cpu/ (both quant: null; no CPU quantized variant per repo convention).

This is a recipe-only (L0★) contribution: Optimum already covers deberta-v2 text-classification natively, so main builds this model with zero source changes. The delta this PR adds is the curated CPU reference recipe plus an L2 numeric-parity proof that the trained 3-way NLI head is preserved end-to-end (which a plain build does not demonstrate). Claimed tiers: Effort L0★ · Goal ceiling L2 · Outcome L0.


1. Recipe path(s)

  • examples/recipes/cross-encoder_nli-deberta-v3-base/cpu/cpu/text-classification_fp32_config.json
  • examples/recipes/cross-encoder_nli-deberta-v3-base/cpu/cpu/text-classification_fp16_config.json

Both are byte-identical (quant: null float bucket; on CPU both realize as fp32, fp16 materializes on GPU/NPU). opset 17, batch 1, inputs input_ids[1,512] + attention_mask[1,512] (int32), output logits. No token_type_idsdeberta-v2 has type_vocab_size = 0.

2. README row

None. Recipe-only, CPU-only — deliberately not added to the "Total: N (model, task) tuples that pass fp16 eval on all 10 (EP, device) buckets" table, which would be a factual overclaim for a CPU-only recipe (consistent with the reviewed outcome on #1084 / #1112).

3. Build output dir

temp/nli_deberta_v3/ (scratch, gitignored) — model.onnx + model.onnx.data (786 MB fp32).

4. Build log

✅ Build complete — recipe-driven winml build exit 0 (269.5 s). ONNX IR 8, opset 17, external data co-located, output logits[1,3].

5. Appended findings

model_knowledge/deberta.jsondeberta-001 (new family). Lane A (skill repo); not part of this model PR's diff.

6. Optimum-coverage probe

deberta-v2 text-classification is VENDOR-ONLY (added_by_winml = []). Vendor onnx tasks: [feature-extraction, fill-mask, multiple-choice, question-answering, text-classification, token-classification]. No winml-added exporter exists or is needed.

7. Claimed (Effort, Goal, Outcome)

L0★ / L2 / L0. Baseline: winml build -m cross-encoder/nli-deberta-v3-base on main (origin/main = 74342698, winml 0.2.0) already PASSES build-only. Contribution = curated CPU float recipe (fp32 + fp16) + L2 trained-head-preservation proof.

8. Goal-ladder verdict table

Tier Verdict Evidence
L0 (build) PASS recipe-driven build exit 0 (269.5 s); ONNX opset 17, inputs input_ids[1,512]+attention_mask[1,512], output logits[1,3], external data co-located
L1 (perf) PASS CPU/fp32 avg 5951 ms, throughput 0.17 samples/s, RAM Δ +618 MB (slow but deterministic; ContextPooler pools fixed position 0, so random-dummy perf is safe)
L2 (numeric vs PyTorch) PASS 4 real NLI pairs: cosine 1.000000, max-abs 1.9e-6, argmax agreement 4/4 — trained 3-way NLI head + disentangled attention export losslessly

Ceiling L2 reached; no downgrade.

9. Methodology-evolution declaration

No methodology friction this cycle. deberta is a new model family (new model_knowledge/deberta.json), but the existing pipeline handled it without a skill_meta change.

10. Perf & eval data

EP / Device Precision Verdict Mean p50 Throughput RAM Δ Task metric
CPUExecutionProvider / cpu fp32 PASS 5951 ms 0.17 samples/s +618 MB N/A (L3 not marched — L2 ceiling)

winml eval not run (Goal ceiling L2). NLI label order for this checkpoint is {0:contradiction, 1:entailment, 2:neutral}, which differs from the GLUE/MNLI dataset order — an eval would need a label remap, so no eval block is shipped (mirrors facebook/bart-large-mnli).

11. Component / op-level data

winml analyze --ep all: 568 total operators, 17 unique. Per-EP op classification: QNN NPU 17/17 supported, OpenVINO NPU 17/17 supported (includes the disentangled-attention GatherElements ops); VitisAI all-unknown (no rule data — analyze exit 1, expected, not a functional failure). Artifact: temp/nli_deberta_v3/analyze_all.json.

12. Reproducible commands

# baseline (main already builds this model, no recipe)
winml build -m cross-encoder/nli-deberta-v3-base -o temp\nli_deberta_v3_baseline

# recipe-driven build (this PR)
winml build -m cross-encoder/nli-deberta-v3-base `
  -c examples\recipes\cross-encoder_nli-deberta-v3-base\cpu\cpu\text-classification_fp32_config.json `
  -o temp\nli_deberta_v3

# L1 perf (CPU)
winml perf -m temp\nli_deberta_v3\model.onnx --iterations 20 --warmup 5 --no-analyze

# op coverage
winml analyze -m temp\nli_deberta_v3\model.onnx --ep all -o temp\nli_deberta_v3\analyze_all.json

# L2 parity vs PyTorch: temp\nli_deberta_v3_l2.py (4 real NLI pairs, pad to 512, int32 inputs, drop token_type_ids)
python temp\nli_deberta_v3_l2.py

…cation)

Curated CPU float recipe for the DeBERTa-v3 cross-encoder NLI model
(config model_type deberta-v2). Ships fp32 + fp16 under cpu/cpu/ (both
quant:null; no CPU quantized variant per repo convention). Recipe-only:
Optimum covers deberta-v2 text-classification natively, so zero source
changes. Inputs are input_ids + attention_mask only (deberta-v2 has
type_vocab_size=0, no token_type_ids).

Validated on CPU:
- L0 build: recipe-driven winml build exit 0; ONNX opset 17, output
  logits[1,3] (trained 3-way NLI head preserved); 786 MB fp32.
- L1 perf: CPU/fp32 avg 5951 ms, throughput 0.17 samples/s, RAM +618 MB.
- L2 numeric parity vs PyTorch on real NLI sentence pairs:
  cosine=1.000000, max-abs=1.9e-6, argmax agreement 4/4.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@DingmaomaoBJTU

Copy link
Copy Markdown
Collaborator Author

VERDICT: APPROVE

coverage: partial
not_yet_tested_on: [gpu, npu, full-fp16-eval-matrix]
reachable_verified: CPUExecutionProvider / cpu (fp32 artifact from quant:null CPU recipe)
deferred: GPU/NPU/full fp16 eval matrix are host/charter-deferred for this recipe-only CPU contribution.

Independent evidence gathered:

  • Diff scope: git diff --name-only origin/main...df29999a is exactly the two recipe JSON files under examples/recipes/cross-encoder_nli-deberta-v3-base/cpu/cpu/; no source/README/test changes.
  • Recipe validation: both JSON files parse as WinMLBuildConfig; SHA256 byte-identical (59e337a7a81a37b3c8c1572b84d1f6006d9f3bcf497bf4656cd533affc13d968); quant: null; opset 17; inputs are input_ids and attention_mask int32 [1,512]; no token_type_ids; output logits.
  • Artifact L0: temp\nli_deberta_v3\model.onnx loads in ONNX/ORT; IR 8, opset 17, inputs input_ids/attention_mask, output logits[1,3]; external data model.onnx.data is co-located (824,199,168 bytes).
  • L2 parity: inspected temp\nli_deberta_v3_l2.py (loads HF PyTorch model and ORT ONNX separately; no hard-coded pass/ONNX-vs-ONNX comparison) and reran it. Result: min cosine 1.000000, max_abs 1.907349e-06, argmax agreement 4/4 on real NLI pairs.
  • Perf sanity: short CPU run with --device cpu --ep cpu --iterations 5 --warmup 2 --no-analyze produced avg 1060.84 ms, throughput 0.94 samples/s, RAM total +627.8 MB (same seconds-per-inference/RAM order as the PR's longer CPU log: 5951 ms, 0.17 samples/s, +618 MB). Running the PR's no-device command on this host auto-selected QNN/NPU, so I used explicit CPU flags for the CPU claim.
  • PR body audit: all 12 hand-off sections present; README-row absence is explicitly justified; baseline honestly states main already builds this; label-order caveat is present; no eval block is shipped.
  • Optimum probe rerun with import optimum.exporters.onnx.model_configs: deberta-v2 vendor tasks include text-classification; added_by_winml=[], matching L0★/recipe-only. PR checks shown by gh pr checks are passing.

No blocking discrepancies found.

@DingmaomaoBJTU DingmaomaoBJTU marked this pull request as ready for review July 16, 2026 01:30
@DingmaomaoBJTU DingmaomaoBJTU requested a review from a team as a code owner July 16, 2026 01:30
@DingmaomaoBJTU DingmaomaoBJTU merged commit e95011d into main Jul 16, 2026
9 checks passed
@DingmaomaoBJTU DingmaomaoBJTU deleted the add-cross-encoder-nli-deberta-v3-base branch July 16, 2026 01:54
@ssss141414 ssss141414 added the model-scale-by-skill Model support PR created or maintained by the adding-model-support skill label Jul 16, 2026
DingmaomaoBJTU added a commit that referenced this pull request Jul 16, 2026
…ication, reranker) (#1118)

## Summary

Adds a curated CPU float recipe for
**`mixedbread-ai/mxbai-rerank-base-v1`** — a cross-encoder **reranker**
that scores `(query, document)` relevance (config `model_type =
deberta-v2`, `DebertaV2ForSequenceClassification`, `num_labels = 1` → a
single relevance logit). Ships **fp32 + fp16** variants under `cpu/cpu/`
(both `quant: null`; no CPU quantized variant per repo convention).

This is a **recipe-only (L0★)** contribution: Optimum already covers
`deberta-v2` `text-classification` natively, so `main` builds this model
with zero source changes. The delta is the **curated CPU reference
recipe** plus an **L2 numeric + ranking parity proof** that the trained
reranker head is preserved end-to-end. Notably the recipe is
**byte-identical** to the now-merged `cross-encoder/nli-deberta-v3-base`
recipe (#1117, on `main` at `e95011d3`) — identical git blob OID
`7b36e69520b418c7c86b2d8a39eab741cb9742c5` (git-stored SHA256
`8b587c4b…bec8`; verify with `git rev-parse HEAD:<path>`). The
`model_id` is CLI-passed and the output width is config-driven, so one
`deberta-v2` text-classification recipe serves the whole task family.
Claimed tiers: **Effort L0★ · Goal ceiling L2 · Outcome L0**.

> **Updated after review (#1118):** rebased onto current `origin/main`
(`e95011d3`, which now includes the merged #1117 NLI recipe) and
corrected the byte-identity evidence to git's canonical blob OID. (An
earlier `Get-FileHash` value `59E337…` was the Windows **CRLF**
working-tree hash; git normalizes to **LF** on commit, so the on-`main`
content hash is `8b587c4b…`.)

---

### 1. Recipe path(s)
-
`examples/recipes/mixedbread-ai_mxbai-rerank-base-v1/cpu/cpu/text-classification_fp32_config.json`
-
`examples/recipes/mixedbread-ai_mxbai-rerank-base-v1/cpu/cpu/text-classification_fp16_config.json`

Byte-identical (`quant: null` float bucket; on CPU both realize as fp32,
fp16 materializes on GPU/NPU). opset 17, batch 1, inputs
`input_ids[1,512]` + `attention_mask[1,512]` (int32), output
`logits[1,1]`. No `token_type_ids` — `deberta-v2` has `type_vocab_size =
0`.

### 2. README row
None. Recipe-only, CPU-only — deliberately **not** added to the "passes
fp16 eval on all 10 (EP, device) buckets" table, which would be a
factual overclaim for a CPU-only recipe (consistent with #1084 / #1112 /
#1117).

### 3. Build output dir
`temp/mxbai_rerank/` (scratch, gitignored) — `model.onnx` +
`model.onnx.data` (786 MB fp32).

### 4. Build log
`✅ Build complete in 633.6s` (Export 369.6s + Optimize 256.9s; **no
quantize** — `quant: null`). ONNX IR 8, opset 17, external data
co-located, output `logits[1,1]`.

### 5. Appended findings
`model_knowledge/deberta.json` → `deberta-002` (second model in the
`deberta` family; `mxbai-rerank-base-v1` added to `models_tested`). Lane
A (skill repo); **not** part of this model PR's diff.

### 6. Optimum-coverage probe
`deberta-v2` `text-classification` is **VENDOR-ONLY** (`added_by_winml =
[]`). Vendor onnx tasks: `[feature-extraction, fill-mask,
multiple-choice, question-answering, text-classification,
token-classification]`. No winml-added exporter exists or is needed.

### 7. Claimed (Effort, Goal, Outcome)
**L0★ / L2 / L0.** Baseline: `winml build -m
mixedbread-ai/mxbai-rerank-base-v1` on `main` (`origin/main = e95011d`
— branch rebased onto current main; winml 0.2.0) already **PASSES**
(default pipeline 973.3s incl. quantize → uint8/16 327.5 MB).
Contribution = curated CPU float recipe (fp32 + fp16) + L2
relevance-head-preservation proof.

### 8. Goal-ladder verdict table

| Tier | Verdict | Evidence |
|---|---|---|
| L0 (build) | **PASS** | recipe-driven float build exit 0 (633.6 s, no
quantize); ONNX opset 17, inputs
`input_ids[1,512]`+`attention_mask[1,512]`, output `logits[1,1]`,
external data co-located |
| L1 (perf) | **PASS** | CPU/fp32 avg 7027.85 ms, 0.14 samples/s, RAM Δ
+624.7 MB (also auto-ran on QNN/NPU at 523.99 ms / 1.91 samples/s) |
| L2 (numeric vs PyTorch) | **PASS** | 4 real `(query, doc)` pairs:
cosine **1.000000**, max-abs **1.097e-05**, **ranking order 4/4
identical**, top-1 doc agrees |

Ceiling L2 reached; no downgrade.

### 9. Methodology-evolution declaration
No methodology friction. This is the **second** model in the `deberta`
family (added in #1117) — it exercised the self-learning path as
designed: `deberta-001` predicted the recipe shape, the recipe came out
byte-identical (same git blob OID `7b36e695…`), and `deberta-002`
records the reranker-specific ranking-parity check. No skill_meta change
needed.

### 10. Perf & eval data

| EP / Device | Precision | Verdict | Mean | p50 | Throughput | RAM Δ |
Task metric |
|---|---|---|---|---|---|---|---|
| CPUExecutionProvider / cpu | fp32 | PASS | 7027.85 ms | 6933.79 ms |
0.14 samples/s | +624.7 MB | N/A (L3 not marched — L2 ceiling) |
| QNNExecutionProvider / npu | (auto) | PASS (bonus) | 523.99 ms |
522.76 ms | 1.91 samples/s | +1791.7 MB | — (not a full NPU validation)
|

`winml eval` not run (Goal ceiling L2). The NPU row is a bonus data
point from `winml perf` auto-selecting QNN — it is **not** a claimed
coverage bucket (no NPU-side L2 parity yet), so coverage stays
CPU-only/partial.

### 11. Component / op-level data
`winml analyze --ep all`: **568 total operators, 17 unique** (identical
op profile to the NLI sibling). Per-EP: **QNN NPU 17/17 supported**,
**OpenVINO NPU 17/17 supported** (includes the disentangled-attention
`GatherElements` ops); **VitisAI all-unknown** (no rule data — analyze
exit 1, expected, not a functional failure). Artifact:
`temp/mxbai_rerank/analyze_all.json`.

### 12. Reproducible commands

```powershell
# baseline (main already builds this model, no recipe)
winml build -m mixedbread-ai/mxbai-rerank-base-v1 -o temp\mxbai_rerank_baseline

# recipe-driven float build (this PR)
winml build -m mixedbread-ai/mxbai-rerank-base-v1 `
  -c examples\recipes\mixedbread-ai_mxbai-rerank-base-v1\cpu\cpu\text-classification_fp32_config.json `
  -o temp\mxbai_rerank

# L1 perf (CPU, pinned)
winml perf -m temp\mxbai_rerank\model.onnx --device cpu --ep cpu --iterations 15 --warmup 3 --no-analyze

# op coverage
winml analyze -m temp\mxbai_rerank\model.onnx --ep all -o temp\mxbai_rerank\analyze_all.json

# L2 parity + ranking vs PyTorch: temp\mxbai_rerank_l2.py
#   (tokenizes (query, doc) cross-encoder pairs, pad to 512, int32 ids, drop token_type_ids,
#    runs each pair at batch=1 since the recipe fixes batch_size=1, compares logits + argsort)
python temp\mxbai_rerank_l2.py
```

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
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.

3 participants