File size: 1,720 Bytes
d718980
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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()