This macro provides a simple example for:
- creating a model with Pytorch and export to ONNX
- parsing the ONNX file with SOFIE and generate C++ code
- compiling the model using ROOT Cling
- run the code and optionally compare with ONNXRuntime
import inspect
import numpy as np
import ROOT
import torch
y_pred = model(x)
modelFile = modelName + ".onnx"
model(dummy_x)
input_names=["input"],
output_names=["output"],
external_data=False,
dynamo=True,
)
print("calling torch.onnx.export with parameters", kwargs)
print("model exported to ONNX as", modelFile)
return modelFile
if verbose:
print("0weight", data)
print("2weight", data)
if verbose:
print("Generated model header file ", modelCode)
return modelCode
modelName = "LinearModel"
sofie =
getattr(ROOT,
"TMVA_SOFIE_" + modelName)
print("\n************************************************************")
print("Running inference with SOFIE ")
print("\ninput to model is ", x)
print("-> output using SOFIE = ", y_sofie)
try:
import onnxruntime as ort
print("Running inference with ONNXRuntime ")
y_ort = outputs[0]
print("-> output using ORT =", y_ort)
testFailed = abs(y_sofie - y_ort) > 0.01
raise RuntimeError(
"Result is different between SOFIE and ONNXRT")
else:
print("OK")
except ImportError:
print("Missing ONNXRuntime: skipping comparison test")
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
calling torch.onnx.export with parameters {'input_names': ['input'], 'output_names': ['output'], 'external_data': False, 'dynamo': True}
[torch.onnx] Obtain model graph for `Sequential([...]` with `torch.export.export(..., strict=False)`...
[torch.onnx] Obtain model graph for `Sequential([...]` with `torch.export.export(..., strict=False)`... ✅
[torch.onnx] Run decompositions...
[torch.onnx] Run decompositions... ✅
[torch.onnx] Translate the graph into ONNX...
[torch.onnx] Translate the graph into ONNX... ✅
[torch.onnx] Optimize the ONNX graph...
[torch.onnx] Optimize the ONNX graph... ✅
model exported to ONNX as LinearModel.onnx
Generated model header file LinearModel.hxx
************************************************************
Running inference with SOFIE
input to model is [[ 0.47008625 1.4903289 -0.17470667 0.79851997 -0.21713655 -1.2410585
-0.3993727 -0.09142418 -0.24927013 0.21638307 1.3903656 0.33159935
-0.96775776 -0.52808785 0.48741376 0.11799018 -0.005374 -0.8268388
-0.91260123 -0.18297234 -0.6724253 -0.8208078 -0.66903675 0.9907345
0.59116954 0.88911647 -1.698871 -1.257624 -0.82386965 0.97384304
-1.3031529 -0.09207327]]
-> output using SOFIE = [0.49135685 0.50864315]
Missing ONNXRuntime: skipping comparison test
- Author
- Lorenzo Moneta
Definition in file TMVA_SOFIE_ONNX.py.