Companion-Forge-L4-ONNX / bench /validate_engines.py
patdev's picture
Add TensorRT vs ONNX numerical validation
d718980 verified
Raw
History Blame Contribute Delete
1.72 kB
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()