from __future__ import annotations import argparse,json from pathlib import Path import numpy as np import torch import onnxruntime as ort from runtime.trt_torch import TorchTensorRTEngine def stats(a,b): a=a.astype(np.float32).ravel(); b=b.astype(np.float32).ravel() d=np.abs(a-b) denom=(np.linalg.norm(a)*np.linalg.norm(b)+1e-12) cos=float(np.dot(a,b)/denom) return {'max_abs':float(d.max()),'mean_abs':float(d.mean()),'cosine':cos} def ort_run(path,feeds): sess=ort.InferenceSession(str(path),providers=['CUDAExecutionProvider','CPUExecutionProvider']) npfeeds={k:v.detach().cpu().numpy() for k,v in feeds.items()} return sess.run(None,npfeeds)[0] def trt_run(path,feeds): e=TorchTensorRTEngine(path); out=e.run({k:v.clone() for k,v in feeds.items()}); torch.cuda.synchronize(); return next(iter(out.values())).detach().cpu().numpy() def main(): ap=argparse.ArgumentParser();ap.add_argument('--root',default='.');a=ap.parse_args();r=Path(a.root);res={} feeds={'pixel_values':torch.randn(1,3,518,518,device='cuda')} res['dinov2']=stats(ort_run(r/'onnx/dinov2/model.onnx',feeds),trt_run(r/'engines/l4-sm89/dinov2.plan',feeds)) feeds={'image':torch.randn(1,3,544,544,device='cuda'),'intrins':torch.tensor([[[471.117,0,259.0],[0,471.117,259.0],[0,0,1.0]]],device='cuda')} res['dsine']=stats(ort_run(r/'onnx/dsine/model.onnx',feeds),trt_run(r/'engines/l4-sm89/dsine.plan',feeds)) res['passed']=res['dinov2']['cosine']>0.999 and res['dsine']['cosine']>0.995 print(json.dumps(res,indent=2)); (r/'validation_l4.json').write_text(json.dumps(res,indent=2)) if not res['passed']: raise SystemExit('engine validation failed') if __name__=='__main__':main()