Download tests/export/test_depth_export.py from mrwine/maya2-native-fast: direct link, hf CLI and curl.
- Browser
- Download file 2.48 kB
-
https://huggingface.co/mrwine/maya2-native-fast/resolve/main/tests/export/test_depth_export.py
- Command line
-
hf download hf://mrwine/maya2-native-fast/tests/export/test_depth_export.py
-
curl -L -o test_depth_export.py https://huggingface.co/mrwine/maya2-native-fast/resolve/main/tests/export/test_depth_export.py
2.48 kB
| import unittest | |
| import numpy as np | |
| import onnxruntime as ort | |
| import torch | |
| from tools.maya_export.common import ckpt_paths, work_dir | |
| from tools.maya_export.streamed_backbone import _Weights, shard_files | |
| BUILD = work_dir() / "depth_build" / "fp32" | |
| REF = work_dir() / "golden" / "ref" / "conv_01_s0.npz" | |
| FRAMES = 20 | |
| N_LEVELS = 15 | |
| def _sess(path): | |
| so = ort.SessionOptions() | |
| so.intra_op_num_threads = 4 | |
| return ort.InferenceSession(str(path), so, providers=["CPUExecutionProvider"]) | |
| class TestDepthLevelParity(unittest.TestCase): | |
| def setUpClass(cls): | |
| if not all((BUILD / f"level_{i:02d}.onnx").exists() for i in range(1, N_LEVELS + 1)): | |
| raise unittest.SkipTest("per-level depth graphs not built") | |
| if not REF.exists(): | |
| raise unittest.SkipTest("reference corpus not found") | |
| cls.weights = _Weights(shard_files(ckpt_paths()["ckpt"])) | |
| def test_chain_matches_reference_depth_logits(self): | |
| """The reference is stored in fp16. Logits here reach about 23, where one fp16 ulp is 0.0156, so the | |
| check is: fp16-rounded outputs equal the stored values except for one-ulp rounding ties (<= 1%), and the | |
| absolute error is at most half an ulp. The fp32 port is checked against upstream PyTorch fp32 separately | |
| (tools/maya_export/depth_check.py).""" | |
| with np.load(REF) as z: | |
| codes = z["codes"][:, :FRAMES].T.astype(np.int64) # (F, 16) | |
| h = z["h_frames"][:FRAMES].astype(np.float32) # (F, 2048) | |
| ref = z["depth_logits"][:FRAMES].astype(np.float32) # (F, 15, 2048), fp16 storage | |
| mem = self.weights.get("depth.null_mem").float().numpy().reshape(1, 1, 1024) | |
| mem = np.repeat(mem, FRAMES, axis=0) | |
| mismatch, total, worst = 0, 0, 0.0 | |
| for level in range(1, N_LEVELS + 1): | |
| sess = _sess(BUILD / f"level_{level:02d}.onnx") | |
| got = sess.run(None, {"h": h, "codes": codes, "mem": mem})[0] | |
| del sess | |
| want = ref[:, level - 1] | |
| g16 = got.astype(np.float16).astype(np.float32) | |
| mismatch += int((g16 != want).sum()) | |
| total += want.size | |
| worst = max(worst, float(np.abs(g16 - want).max())) | |
| print(f"fp16-rounded mismatches {mismatch}/{total}, max abs {worst:.7f}", flush=True) | |
| self.assertLessEqual(mismatch / total, 0.01) | |
| self.assertLessEqual(worst, 0.0078125) | |
| if __name__ == "__main__": | |
| unittest.main() | |