Detach C++ node tests from ONNX on-disk data/node artifacts (onnx#7959) + retiring equivalence proof + corpus-collapse tripwire - #29504
Conversation
…ence test Detach ORT's node-test coverage from the on-disk ONNX corpus (onnx/backend/test/data/node) that ONNX PR #7959 deletes, by regenerating it from ONNX's in-memory Python generators instead. - tools/python/materialize_onnx_node_tests.py: build-time generator that calls ONNX's collect_testcases and writes the node-test corpus (model.onnx + test_data_set_*/*.pb) into the build tree, with onnx/numpy version guards and a byte-equivalence comparator against the on-disk oracle. - tools/python/compare_node_test_corpora.py: standalone oracle-vs-materialized equivalence comparator, reusable outside cmake. - onnxruntime/test/python/onnx_node_test_equivalence_test.py: retiring unittest that materializes to a tmpdir and byte-compares against the on-disk oracle, auto-skipping once the pin advances past #7959. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…runner Add a -m/--min_cases floor to onnxruntime/test/onnx/main.cc: after loading the test corpus, if the collected case count is below the floor, exit non-zero. This catches a silently empty/partial/truncated materialized node corpus at the consumption point (onnx_test_runner skips non-existent dirs and would otherwise exit green with near-zero coverage). Names ONNX #7959 in the failure message. Mirror the same floor in onnxruntime/test/python/onnx_backend_test_series.py (MIN_NODE_CASES) so the Python-driven node series has the equivalent guard. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ts into cmake Add the onnxruntime_MATERIALIZE_ONNX_NODE_TESTS option (cmake/CMakeLists.txt), ON by default when building unit tests (non-reduced, non-minimal builds). In cmake/onnxruntime_unittests.cmake: - Fail the configure step loudly with an actionable message if onnx/numpy are missing (never silently skip materialization). - Add the onnx_node_tests_materialized build target that runs the materializer with --min-cases (build-time GENERATION floor). - Register the onnx_test_node_materialized ctest (onnx_test_runner -m, the CONSUMPTION-point floor) and the auto-retiring onnx_node_tests_equivalence ctest (gated on the on-disk oracle existing at configure time, so it stops registering cleanly once the pin advances past #7959). - Single-source both floors via ORT_ONNX_NODE_MIN_CASES. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lized corpus Repoint the QNN CI node-test consumers from the on-disk ONNX corpus (cmake/external/onnx/.../data/node) to the build-tree materialized copy (onnx_node_tests/node), and install onnx==1.22.0 + numpy (python-conditional pins matching the CMake gate's assertion) before the build so the host-side materializer can run. Covers linux-qnn, win-qnn-arm64, windows_qnn_x64, and the android-arm64 QNN cross-compile pipeline (whose single-case copy source is repointed too). No -m floor is added to the QNN legs: they build in-place on the same tree the build-time --min-cases gate already guards, so the global corpus-collapse regression is caught PR-wide by that gate plus the CPU node ctest -m backstop. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…set-bump checklist Document in the onnx-opset-bump-checklist skill that ONNX PR #7959 deletes the on-disk node-test corpus, that ORT now materializes it from ONNX's Python generators at build time, and how the build-time --min-cases gate plus the consumption-point -m tripwire guard against a silent coverage collapse when the ONNX pin advances past #7959. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…visioned legs The materialize option defaulted ON on every unit-test build, but only the QNN legs install onnx, so the configure-time HARD-FATAL gate broke every other unit-test CI leg with `ModuleNotFoundError: No module named 'onnx'`. Flip the cmake_dependent_option default to OFF (explicit opt-in) and keep the HARD-FATAL gate unchanged so it still fires loudly when the option is explicitly set ON but onnx/numpy are missing or off-pin. With the default OFF, non-opted-in legs revert to exactly their pre-PR behavior (node tests read from the FetchContent'd ONNX source tree, which still ships data/node on the pinned version) -- a zero-regression no-op today. Enable materialization explicitly via `--cmake_extra_defines onnxruntime_MATERIALIZE_ONNX_NODE_TESTS=ON` on the legs that consume the materialized corpus and are provisioned with the pinned onnx==1.22.0 + numpy at CONFIGURE-time: - the 3 QNN legs (linux-qnn, win-qnn-arm64, windows_qnn_x64), which pip-install the pins in a dedicated step before build; - the android-arm64 QNN cross-compile leg, whose single-case `cp` reads from the materialized tree (it also pip-installs the pins pre-build); - the Linux CPU release leg build-linux-x64-release-py314, whose configure interpreter is /opt/python/cp314-cp314 -- cp314 is one of the interpreters that the manylinux install_deps.sh provisions with requirements.txt (onnx==1.22.0 + numpy==2.4.2 for py>=3.11, matching the gate's pins), and the leg runs tests, so the equivalence + materialized-node ctests actually execute in upstream CI. (The cp310 build-linux-x64-release leg is deliberately NOT opted in: cp310 is not in install_deps.sh's provisioned interpreter list, so its configure python would fail the onnx gate.) Also correct a now-stale comment in onnxruntime_unittests.cmake that still said the option defaults ON. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR prepares ONNX Runtime’s C++ ONNX node-test coverage for ONNX PR onnx/onnx#7959, which removes the on-disk onnx/backend/test/data/node/ corpus. It introduces a build-time materialization step to regenerate the node-test artifacts to disk (so onnx_test_runner can keep consuming a directory), adds an equivalence oracle that auto-retires when the upstream oracle disappears, and adds “silent-green” collapse tripwires (build-time and run-time) across CMake, C++ runner, and Python test discovery.
Changes:
- Add Python tooling to materialize ONNX node tests from ONNX generators and (optionally) byte-compare vs the pre-#7959 on-disk oracle.
- Add CMake option + build/test wiring to generate the node corpus into the build tree, run it via
onnx_test_runner, and (while available) run an equivalence ctest. - Add “minimum discovered cases” tripwires to prevent silent pass on empty corpora; update QNN CI legs and Linux CI to consume the materialized tree.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tools/python/materialize_onnx_node_tests.py | New materializer + oracle comparator core for node-test corpus regeneration and equivalence classification. |
| tools/python/compare_node_test_corpora.py | Build-wired wrapper to compare an already-materialized corpus vs the on-disk ONNX oracle. |
| tools/ci_build/github/azure-pipelines/win-qnn-arm64-ci-pipeline.yml | Installs pinned onnx/numpy, enables materialization, repoints QNN node-test run to materialized tree with -m 1 sentinel. |
| tools/ci_build/github/azure-pipelines/linux-qnn-ci-pipeline.yml | Same as Windows QNN: install deps, enable materialization, repoint node-test run + sentinel floor. |
| tools/ci_build/github/azure-pipelines/android-arm64-v8a-QNN-crosscompile-ci-pipeline.yml | Enables materialization on host; repoints the single copied node test to materialized tree. |
| onnxruntime/test/python/onnx_node_test_equivalence_test.py | New retiring Python unittest to materialize into a tmpdir and compare vs oracle when present. |
| onnxruntime/test/python/onnx_backend_test_series.py | Adds a Python discovery-count floor to fail loud if node tests disappear from disk. |
| onnxruntime/test/onnx/main.cc | Adds -m minimum-tests option to onnx_test_runner to prevent silent-green on empty dirs. |
| cmake/onnxruntime_unittests.cmake | Adds onnxruntime_MATERIALIZE_ONNX_NODE_TESTS wiring: configure-time dependency gating, build-time materialization target, ctests, and oracle retirement. |
| cmake/CMakeLists.txt | Introduces the new opt-in dependent CMake option for node-test materialization. |
| .github/workflows/windows_qnn_x64.yml | Installs pinned onnx/numpy, enables materialization, repoints node-test run to materialized tree + -m 1 sentinel. |
| .github/workflows/linux_ci.yml | Enables materialization on a Linux CPU CI leg to exercise the build/test wiring. |
| .agents/skills/onnx-opset-bump-checklist/SKILL.md | Documents the onnx#7959 “silent-green” landmine and mitigation guidance in the opset bump checklist. |
Review synthesis (multi-model review team)Strong, well-engineered PR. An end-to-end run of the materializer confirmed 1799 cases, byte-identical to the on-disk oracle, the 6 inverse-trig ULP cases reproduced exactly, and the writer is a faithful verbatim transcription of ONNX's 🔴 Critical (verified against ONNX source — blocks merge)
🟠 Major
🟡 Minor
Nits
Recommendation: fix the Critical ( 🤖 Generated with multi-model review (readability / code / critical / deep / integration). |
…N/android legs (f2py perms) The android + linux-qnn legs run on bare non-root Ubuntu agents using the system python3 (no venv). A plain 'pip install onnx==1.22.0 numpy' tries to write /usr/local/bin/f2py -> [Errno 13] Permission denied. --user installs into ~/.local for the same agent user; the configure-time 'import onnx' (build.py) runs as that same user with the same python3, so it resolves from ~/.local. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…s floor onnx 1.22.0's Runner.__init__ dispatches the node corpus to _add_model_test with the capitalized category label "Node", not the lowercase load kind. Our MIN_NODE_CASES twin counted 'if kind == "node"', which never matched, so _node_case_count was always 0 and the floor false-fired on every full onnx_backend_test_series.py run (reds every CPU full-backend leg). Compare case-insensitively. Verified against onnx 1.22.0: healthy corpus tallies 1799 (>= 1500, satisfied); a genuinely empty corpus still tallies 0 (< 1500, floor still fires) -- the guard is corrected, not disabled. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lowercase block-local temps Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… + image_decoder equivalence class + narrow bare-except Agent-signed-off: Architect (dae3a478) [claude-opus-4.8 via copilot] Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… doc comments + register pin sites & remaining 1.23 consumers in bump checklist Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Re-review of the updateVerified the pushed fixes against source (and empirically for the numerical one). The blocking Critical is resolved and the core fixes are correct. ✅ Verified fixed
|
| Consumer | Fires when | Impact |
|---|---|---|
docs/python/conf.py:124 |
onnx master merges #7959 (independent of ORT's pin) | URL hardcodes master; urllib.request.urlretrieve on a 404 raises HTTPError and is not wrapped in try/except → Sphinx docs build hard-fails. Fires soonest — recommend pinning the URL to a fixed tag even in this PR. |
csharp/test/Microsoft.ML.OnnxRuntime.EndToEndTests/runtest.sh:25 |
cmake/external/onnx submodule advances past #7959 |
macOS NuGet EndToEnd leg only (if IsMacOS); the data/node symlink goes dangling → no opset* dir → silent-green, zero C# model tests. |
js/scripts/prepare-onnx-node-tests.ts:53 |
a post-#7959 opset is added to TEST_DATA_OPSET_VERSIONS |
Extracts nothing from the archive → silent JS node-test coverage loss. |
Remaining minors (non-blocking)
- Post-retirement, opset fidelity rests entirely on pip-pin discipline (version string + count floor; no executable schema-drift check once the equivalence oracle retires). Worth a one-line note.
- The
1500floor is still triple-defined (CMake single-sources its own 3 consumers, but the two PythonMIN_NODE_CASESliterals are coupled only by comment).
Net: good to go for the C++ objective once the above follow-ups are tracked. Nice work on the fixes.
🤖 Multi-model review re-pass.
…, parity with filters.jsonc), not missing IRFFT kernel Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…master #7959 node-data deletion) Agent-signed-off: Architect (dae3a478) [claude-opus-4.8 via copilot] Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Thanks for the review! Dispositions:
Cross-consumer note for the #7959 viability question: the in-memory generator approach works cleanly for single-version consumers (C++, csharp, docs), but not for consumers needing a historical multi-opset matrix (our JS tests span opset 7-21), since onnx's generator is single-version and can't regenerate old opsets from a new onnx. |
Review team re-review (round 2, current state)Ran the full 5-reviewer team (readability / code / critical / deep / integration) against the latest state. All round-1 fixes confirmed resolved:
Still-open / new findings (none are merge-blockers)🟠 Major — ULP classifier accepts finite↔∞ and ∞↔NaN as "Class A" ( 🟡 Minor — signed-zero false-RED. A pure 🟡 Minor — stale IRFFT reason in 🟡 Minor — two more residual on-disk
Pin/repoint both to the materialized dir or a tagged ONNX ref. 🟡 Minor — 1500 floor is now quadruple-defined (a 4th copy landed in 🔵 Nits — the Bottom lineNo merge-blocker. The one item worth fixing here is the ULP finite/∞/NaN classifier gap (cheap, valid), plus the jsonc IRFFT reason-sync and the two extra doc/skill consumers. |
|
Is the utility for materializing the node test cases worth upstreaming to onnx repo? (separately, not to block this PR.) |
…(F1/F2/F3/F4a)
F1 (MAJOR): _classify_tensor_diff mis-blessed finite<->inf and inf<->NaN
output drift as Class A because the raw-bit ULP metric makes max-finite/inf
and inf/adjacent-NaN 1 ULP apart. Reject any finite/inf/NaN structural
mismatch (or non-finite max|d|) as Class B before the Class-A ULP band.
F2 (MINOR): document that a pure +0.0/-0.0 flip is intentionally caught as
byte/proto Class-B drift by the array_equal gate, and that _max_ulp_diff's
signed-zero merge only prevents a co-occurring signed zero from inflating a
genuine mixed-tensor skew -- resolves the docstring/behavior contradiction.
F4a (MINOR): pin plot_load_and_predict.py test_sigmoid gallery link from
onnx blob/main to blob/v1.22.0 (survives onnx#7959 node-data deletion),
mirroring the conf.py pin.
F3 (MINOR): correct the DFT rfft/irfft skip *reason* in
onnx_backend_test_series_filters.jsonc -- the old text ('ORT does not
implement IRFFT, outputs complex last dim=2') is false per dft.cc:458-459
(IRFFT sets last dim=1). Real cause is platform-dependent near-zero FFT
roundoff exceeding the tight abs tol; mirrors TestCase.cc. Skip retained.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…e r3537835567 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
tianleiwu
left a comment
There was a problem hiding this comment.
Reviewed the node-test detach + materializer + tripwire. Overall this is a careful, well-documented change and the design (materialize from ONNX's surviving Python generators, keep the C++ runner reading from disk, add a cause-agnostic min-count tripwire, auto-retire the equivalence oracle post-#7959) is sound. The earlier automated-review findings look addressed on this head: the per-dataset arity guard in _write_case, the overflow-proof unsigned sign-magnitude fold in _max_ulp_diff, and the RC/.dev-aware release-base comparison in the cmake onnx gate are all present.
Two coupled points on the new CPU node ctest are worth confirming before merge (both left inline):
-
New CPU full-corpus coverage / broken-test parity.
onnx_test_node_materializedruns the entiredata/nodecorpus on the CPU EP for the first time.onnx_test_runnerhard-fails on any case that fails on CPU but isn't in the C++GetBrokenTestslist, and this PR mirrors onlyconvinteger+ the 4dft_*cases, while the Pythononnx_backend_test_series_filters.jsoncexcludes a much larger set. -
-mfloor vs. skipped-case count. The-m 1500floor is checked againsttests.size(), which excludes broken/disabled/training-domain cases, so the real headroom is smaller than the~1799 -> 1500reasoning implies, and the C++ and Python floors measure different populations.
The MATERIALIZE=ON py314 leg runs mode: test, so both would surface as CI-red rather than silently — but the PR description's own [needs-run] note says the MATERIALIZE=ON inner path (materialization + the two add_test bodies) hasn't executed on a pinned box yet. Running that leg's ctests once on-pin would de-risk the merge.
Minor / non-blocking: the numpy pin (2.2.6/2.4.2) is now duplicated across cmake, the 4 CI yaml files, and requirements.txt; the SKILL.md documents the lockstep requirement, but it remains three manual sync points.
…tionally-different populations (tianleiwu P2) The C++ -m floor checks tests.size() (post-skip collected count) while the Python MIN_NODE_CASES counts the pre-exclude population. Same 1500 literal, different populations by design; ~1794 vs 1500 today is huge margin and any future over-growth of the CPU skip set fails loud (never silent). Comment-only, no logic or floor-value change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
cc @tianleiwu |
tianleiwu
left a comment
There was a problem hiding this comment.
Re-reviewed the current head (381ccd6). This is a thorough, well-documented change and my three earlier threads are now addressed — resolved them:
- python 3.10 literal: agreed it's a
find_packagelower bound, not a hard version, so 3.10 legs aren't blocked. - CPU
onnx_test_node_materializedbroken-test parity: confirmed green on-pin (run 28893847416); future CPU-failing node tests surface as loud CI-red on the same leg. ORT_ONNX_NODE_MIN_CASESfloor: the tightened comment now documents the two intentionally-different populations and the safe failure direction.
The materializer/compare core, the retiring equivalence guards (Python unittest + compare_node_test_corpora.py ctest), the configure-time onnx/numpy gates, and the -m runtime tripwire all look correct and internally consistent. One minor non-blocking nitpick left inline. LGTM once CI is green.
|
I will address comments with another PR. |
… for QNN materialize deps, cmake ctest comment (#29504 follow-up) Follow-up to merged #29504 addressing tianleiwu's non-blocking post-merge review comments. N1 (cmake): Drop the two no-op `set_tests_properties(... DEPENDS onnx_node_tests_materialized)` calls. That name is an add_custom_target(... ALL), not a registered test, so a ctest test-level DEPENDS on it is a silent no-op. Replace each with a comment documenting the real ordering guarantee: the ALL target materializes the corpus during the normal build (before ctest), and the -m / --min-cases tripwire fails loud on a missing/partial corpus. N2 (conf.py): Replace the doc-build-time urlretrieve of onnx/backend/test/data/node/test_sigmoid/model.onnx with an in-memory onnx.helper Sigmoid graph (input "x" -> output "y", float32 [3,4,5]) saved to the same destination. Removes the network dependency and the latent 404 once onnx/onnx#7959 deletes that on-disk corpus; keeps the doc build hermetic. N3-5 (requirements file): Add a dedicated minimal requirements-materialize-onnx-node-tests.txt (onnx + numpy only, with the hybrid numpy env markers: 2.2.6 for python_version<'3.11', 2.4.2 for >='3.11'). Repoint the four QNN/Android CI legs from inline pip pins to `pip install -r` (preserving --user on the linux + android legs; the two Windows legs omit it). Placed at the repo root so Dependabot (pip directory: "/") can track the onnx/numpy upgrades without dragging the heavy docker requirements.txt onto the QNN legs. Pins stay locked in lockstep with the CMake gate, which HARD-FATALs on installed!=pinned. Update the onnx-opset-bump-checklist SKILL.md gotcha-p to reflect the new requirements file (reversing its prior "inline by design" note) and add it to the numpy pin sync-site list. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…track QNN materialize deps (#29577) Follow-up to the merged #29504 (ONNX node-test detachment). This PR consolidates **all** post-#29504 follow-up work into a single change set. Changes C/D/E address @tianleiwu's non-blocking post-merge review comments; A/B were the original scope of this PR. None change the behavior of the shipped feature — this is hardening + hygiene + doc detachment. ### (A) C# — loud-fail guard on the macOS node-test symlink `csharp/test/Microsoft.ML.OnnxRuntime.EndToEndTests/runtest.sh` symlinked the ONNX on-disk node-test corpus. Once the onnx pin advances past onnx/onnx#7959 (which deletes that corpus) the symlink target vanishes and the suite would silently pass with zero cases. Added a loud-fail guard: enforce a discovered-case floor (1000) and keep the immutable v1.13.1 pin, so corpus absence becomes a red instead of a silent-green. ### (B) JS — post-#7959 opset caveat in `prepare-onnx-node-tests.ts` Documented that once onnx ships without the on-disk node-test data (onnx/onnx#7959), post-#7959 opsets cannot use the `rel-*` archive download path — a caveat for the next opset bump. ### (C = N1) cmake — drop no-op ctest `DEPENDS` + document real ordering `cmake/onnxruntime_unittests.cmake`: the two `set_tests_properties(... PROPERTIES DEPENDS onnx_node_tests_materialized)` calls named an `add_custom_target(... ALL)`, not a registered test, so a CTest test-level `DEPENDS` on it is a silent no-op. Removed both and documented the real ordering guarantee: the `ALL` target materializes the corpus during the build (before ctest), and the `-m` / `--min-cases` tripwire fails loud on a missing/partial corpus. ### (D = N2) conf.py — hermetic in-memory doc model `docs/python/conf.py` urlretrieved `.../node/test_sigmoid/model.onnx` from GitHub at doc-build time — a latent 404 once onnx/onnx#7959 deletes that path. Replaced with an in-memory `onnx.helper` single-node Sigmoid graph (input `x` → output `y`, float32 `[3,4,5]`) written to the same destination. Keeps the doc build hermetic and drop-in compatible. ### (E = N3-5) requirements file for QNN/Android materialize deps + SKILL.md The four QNN/Android CI legs used inline `pip install onnx==... "numpy==...; ..."` pins (invisible to Dependabot) to feed the `onnxruntime_MATERIALIZE_ONNX_NODE_TESTS` gate. Added a dedicated minimal `requirements-materialize-onnx-node-tests.txt` (onnx + numpy only, with hybrid numpy env markers `2.2.6` for `python_version<'3.11'`, `2.4.2` for `>='3.11'`) and repointed all four legs to `pip install -r` (preserving `--user` on linux + android; the two Windows legs omit it). Placed at the repo root because `dependabot.yml` pins pip to `directory: "/"` (non-recursive). Pins stay locked in lockstep with the CMake gate, which HARD-FATALs on `installed != pinned`. Updated the `onnx-opset-bump-checklist` SKILL.md gotcha-p to reflect the new file (reversing its prior "inline by design" note) and added it to the numpy pin sync-site list. --- Consolidates the standalone #29746 (now closed) per author request. Triple-review passed on both change sets independently. Merge after #29504 (already merged), which this references. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Motivation
ONNX onnx/onnx#7959 removes the on-disk
onnx/backend/test/data/node/corpus (targeted for ONNX 1.23), replacing it with on-the-fly in-memory generation. ORT's C++onnx_test_runnerreads that corpus from disk — after the deletion it would load 0 node tests and silently exit 0 (green CI on a corpus that no longer exists). This PR detaches ORT from the deleted artifacts ahead of the bump.What this does (3 pieces)
tools/python/materialize_onnx_node_tests.py) regenerates the node corpus to disk from ONNX's surviving generator (collect_testcases), so the C++ runner keeps reading from disk unchanged. EP-agnostic (CPU/CUDA/QNN share one materialized tree).onnxruntime/test/python/onnx_node_test_equivalence_test.py+tools/python/compare_node_test_corpora.py) proves the materialized corpus is byte-identical to the original (modulo a documented ULP band); it auto-skips once the ONNX on-disk oracle disappears post-Add transformers tool test to pipeline #7959.--min-casesgate (FATALs the build on every MATERIALIZE=ON leg if generation < floor) + a runtime-mfloor on the CPU node ctest, turning silent-green-on-empty into a loud red.Key decisions
-m 1collapse sentinel (NOT the 1500 build floor):-e qnnlegitimately reduces the collected set to ~1529, so a 1500 runtime floor would be a false-red timebomb on the next opset bump — the strict count is enforced at build time via--min-cases, while-m 1(zero false-red risk) catches a per-legMATERIALIZE=OFFthat still runs the node dir. The android leg's single-casecp -rsource is repointed to the materialized tree (the olddata/nodesource vanishes post-Add transformers tool test to pipeline #7959).Testing
-m) unchanged.MATERIALIZE=ONinner path (actual materialization + the two add_test bodies) — this dev box is off-pin so the numpy gate FATALs by design.Relates to: onnx/onnx#7959
Cross-consumer viability note (re: onnx/onnx#7959)
While detaching, we assessed all of ORT's node-test consumers. The in-memory generator approach behind #7959 works cleanly for single-version consumers (C++, C#, docs), but has a gap for consumers needing a historical multi-opset matrix:
rel-*release archives. Since onnx's generator is single-version, old opsets can't be regenerated from a new onnx.Net: workable for single-version consumers; the multi-version case would need a small per-version serialization utility or a documented migration note upstream.