Download code/tt_sceneseg/tests/test_reference_cpu.py from changh95/sceneseg-p150: direct link, hf CLI and curl.
- Browser
- Download file 6.63 kB
-
https://huggingface.co/changh95/sceneseg-p150/resolve/main/code/tt_sceneseg/tests/test_reference_cpu.py
- Command line
-
hf download hf://changh95/sceneseg-p150/code/tt_sceneseg/tests/test_reference_cpu.py
-
curl -L -o test_reference_cpu.py https://huggingface.co/changh95/sceneseg-p150/resolve/main/code/tt_sceneseg/tests/test_reference_cpu.py
6.63 kB
| # SPDX-License-Identifier: Apache-2.0 | |
| """The CPU reference (``tt_sceneseg.reference``) against onnxruntime on the deployed ONNX: the oracle of every gate. | |
| PYTHONPATH=code tools/research-venv/bin/python -m pytest -q code/tt_sceneseg/tests/test_reference_cpu.py | |
| Runs in the research venv (onnxruntime is not a dependency of the bundle; skipped where it is absent, e.g. in the | |
| tt-metal environment and the image). ORT runs ``SceneSeg_FP32.onnx`` as shipped with every tap of ``config.TAPS`` | |
| exposed as an extra output; the torch reference runs on the same input (the node's exact pre-processing): | |
| - before the data-dependent decision: every tap and the logits at PCC >= 0.9999 (PLAN.md 0.3 item 1; measured | |
| >= 0.9999999995); | |
| - after it (the per-pixel argmax): set-based, the class maps and the published masks agree on >= 99.99 % of the | |
| pixels (fp32 vs fp32 differ only where two logits tie to within the accumulation-order noise). | |
| Also: the reference built from the upstream state_dict (BN folded in fp64) against ORT, the public frames of | |
| research/sceneseg/public_data and the research ORT goldens, and the SPEC's stored golden inputs. | |
| """ | |
| from __future__ import annotations | |
| import numpy as np | |
| import pytest | |
| pytest.importorskip("onnxruntime") | |
| pytest.importorskip("onnx") | |
| torch = pytest.importorskip("torch") | |
| from tt_sceneseg.host.postprocess import class_map_from_logits, postprocess # noqa: E402 | |
| from tt_sceneseg.host.preprocess import prepare_bgr, prepare_image # noqa: E402 | |
| from tt_sceneseg.reference import assets, config # noqa: E402 | |
| from tt_sceneseg.reference.model import SceneSegReference # noqa: E402 | |
| from tt_sceneseg.reference.ort import OrtReference # noqa: E402 | |
| from tt_sceneseg.tests.research import PUBLIC, SAMPLE, SPEC_REF_RUNS, public_ids # noqa: E402 | |
| from tt_sceneseg.ttaw.golden import TapRegistry # noqa: E402 | |
| from tt_sceneseg.ttaw.metrics import error_stats, pcc # noqa: E402 | |
| PCC_MIN = 0.9999 | |
| AGREE_MIN = 0.9999 | |
| ONNX = assets.onnx_path(required=False) | |
| pytestmark = pytest.mark.skipif(ONNX is None, reason="SceneSeg_FP32.onnx not found (set SCENESEG_WEIGHTS_DIR)") | |
| def _threads(): | |
| old = torch.get_num_threads() | |
| torch.set_num_threads(4) | |
| yield | |
| torch.set_num_threads(old) | |
| def ref(): | |
| return SceneSegReference.from_onnx(ONNX) | |
| def ort_taps(): | |
| return OrtReference(ONNX, taps=config.TAPS, threads=4) | |
| def ort_plain(): | |
| return OrtReference(ONNX, threads=4) | |
| def _agree(a_logits, b_logits, hw): | |
| a, b = postprocess(hw, logits=a_logits), postprocess(hw, logits=b_logits) | |
| return (a.class_map == b.class_map).mean(), (a.mask == b.mask).mean() | |
| def test_every_tap_matches_onnxruntime(order, ref, ort_taps): | |
| prep = prepare_image(str(SAMPLE), channel_order=order) | |
| x = prep.network_input() | |
| want = ort_taps.run(x) | |
| rec = TapRegistry() | |
| got = ref.run_numpy(x, taps=rec) | |
| report = {} | |
| for name in config.TAPS: | |
| assert rec[name].shape == want[name].shape, (name, rec[name].shape, want[name].shape) | |
| report[name] = error_stats(rec[name], want[name]) | |
| worst = min(report.items(), key=lambda kv: kv[1]["pcc"]) | |
| print(f"{order}: worst tap {worst[0]} pcc={worst[1]['pcc']:.12f}; logits max|d|={report['logits']['max_abs']:.2e}") | |
| bad = {k: v["pcc"] for k, v in report.items() if not v["pcc"] >= PCC_MIN} | |
| assert bad == {}, f"taps below PCC {PCC_MIN}: {bad}" | |
| assert pcc(got["logits"], want["logits"]) >= PCC_MIN | |
| cls_agree, mask_agree = _agree(got["logits"], want["logits"], prep.src_hw) # after the decision: set-based | |
| assert cls_agree >= AGREE_MIN and mask_agree >= AGREE_MIN | |
| # the tapped session computes the same logits as the plain one | |
| np.testing.assert_array_equal(want["logits"], OrtReference(ONNX, threads=4).run(x)["logits"]) | |
| def test_state_dict_reference_matches_onnxruntime(ort_plain): | |
| """The reference built from the upstream state_dict (re-hosted safetensors or the .pth; BN folded in fp64).""" | |
| sd = assets.state_dict_path(required=False) | |
| if sd is None: | |
| pytest.skip("the .pth / safetensors is not available") | |
| prep = prepare_image(str(SAMPLE)) | |
| x = prep.network_input() | |
| got = SceneSegReference.from_state_dict(sd).run_numpy(x)["logits"] | |
| want = ort_plain.run(x)["logits"] | |
| assert pcc(got, want) >= PCC_MIN | |
| cls_agree, mask_agree = _agree(got, want, prep.src_hw) | |
| assert cls_agree >= AGREE_MIN and mask_agree >= AGREE_MIN | |
| def test_public_frames(fid, ref, ort_plain): | |
| """research/sceneseg/public_data frames, both orders: the reference vs ORT on the exact input, and ORT on the | |
| exact input vs the research ORT golden (whose input was one ulp off: float32 division).""" | |
| from PIL import Image | |
| if fid not in public_ids(): | |
| pytest.skip(f"{fid} not converted") | |
| with Image.open(PUBLIC / "inputs" / fid / "source_bgr.png") as im: | |
| bgr = np.ascontiguousarray(np.asarray(im.convert("RGB"))[:, :, ::-1]) | |
| gold = np.load(PUBLIC / "golden" / fid / "ort_fp32.npz") | |
| for order in config.CHANNEL_ORDERS: | |
| prep = prepare_bgr(bgr, channel_order=order) | |
| x = prep.network_input() | |
| want = ort_plain.run(x)["logits"] | |
| got = ref.run_numpy(x)["logits"] | |
| assert pcc(got, want) >= PCC_MIN, (fid, order) | |
| assert min(_agree(got, want, prep.src_hw)) >= AGREE_MIN, (fid, order) | |
| assert pcc(want, gold[f"logits_{order}"]) >= 0.9999999, (fid, order) | |
| assert (class_map_from_logits(want) == gold[f"cls_{order}"]).mean() >= AGREE_MIN, (fid, order) | |
| def test_spec_golden_inputs(ref): | |
| """The SPEC's stored golden tensors (research/sceneseg/ref_runs/highway_normal_{1,2}: the deployed and the | |
| RGB-bilinear inputs with their ORT logits): the reference on the stored inputs reproduces the stored logits.""" | |
| for name in ("highway_normal_1", "highway_normal_2"): | |
| for tag in ("cpp_bgr", "cpp_rgb"): | |
| p = SPEC_REF_RUNS / name / f"{tag}_input_f32.npy" | |
| if not p.is_file(): | |
| pytest.skip("research/sceneseg/ref_runs not present") | |
| got = ref.run_numpy(np.load(p))["logits"] | |
| want = np.load(SPEC_REF_RUNS / name / f"{tag}_logits_ort_f32.npy") | |
| assert pcc(got, want) >= PCC_MIN, (name, tag) | |
| assert (class_map_from_logits(got) == class_map_from_logits(want)).mean() >= AGREE_MIN, (name, tag) | |