28#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
29#include <numpy/arrayobject.h>
41 std::cout <<
"\nPython error message:\n";
43 throw std::runtime_error(
"\nFailed to run python code: " + code);
47const char *PyStringAsString(
PyObject *
string)
121 throw std::runtime_error(
"TMVA::SOFIE - Parsing PyTorch node " +fNodeType+
" is not yet supported ");
156 fAttrTransA = !fAttrTransB;
160 fAttrTransB = !fAttrTransA;
163 std::unique_ptr<ROperator>
op;
170 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Gemm does not yet support input type " +
fNodeDType);
190 std::unique_ptr<ROperator>
op;
197 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Relu does not yet support input type " +
fNodeDType);
216 std::unique_ptr<ROperator>
op;
223 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Selu does not yet support input type " +
fNodeDType);
242 std::unique_ptr<ROperator>
op;
249 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Sigmoid does not yet support input type " +
fNodeDType);
278 std::unique_ptr<ROperator>
op;
285 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Transpose does not yet support input type " +
fNodeDType);
313 std::string fAttrAutopad =
"NOTSET";
314 std::vector<size_t> fAttrDilations = GetDataFromList(
fDilations);
316 std::vector<size_t> fAttrKernelShape = GetDataFromList(
fKernelShape);
317 std::vector<size_t> fAttrPads = GetDataFromList(fPads);
318 std::vector<size_t> fAttrStrides = GetDataFromList(fStrides);
324 std::unique_ptr<ROperator>
op;
331 throw std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator Conv does not yet support input type " +
fNodeDType);
390 if (
isep != std::string::npos){
395 if(!std::ifstream(
filename).good()){
396 throw std::runtime_error(
"Model file "+
filename_nodir+
" not found!");
400 std::time_t
ttime = std::time(0);
412 throw std::runtime_error(
"Can't init global namespace for Python");
415 throw std::runtime_error(
"Can't init local namespace for Python");
422 PyRunString(
"import torch",fGlobalNS,fLocalNS);
423 PyRunString(
"print('Torch Version: '+torch.__version__)",fGlobalNS,fLocalNS);
424 PyRunString(
"from torch.onnx.utils import _model_to_graph",fGlobalNS,fLocalNS);
427 PyRunString(
"globals().update(locals())",fGlobalNS,fLocalNS);
428 PyRunString(
"model.cpu()",fGlobalNS,fLocalNS);
429 PyRunString(
"model.eval()",fGlobalNS,fLocalNS);
432 PyRunString(
"dummyInputs=[]",fGlobalNS,fLocalNS);
433 for(
long unsigned int it=0;it<
inputShapes.size();++it){
434 PyRunString(
"inputShape=[]",fGlobalNS,fLocalNS);
438 PyRunString(
"dummyInputs.append(torch.rand(*inputShape))",fGlobalNS,fLocalNS);
444 PyRunString(
"graph=_model_to_graph(model,dummyInputs)",fGlobalNS,fLocalNS);
448 PyRunString(
"modelData=[]",fGlobalNS,fLocalNS);
451 PyRunString(
"def _node_get(node, key):\n"
452 " sel = node.kindOf(key)\n"
453 " return getattr(node, sel)(key)\n",
454 fGlobalNS, fLocalNS);
455 PyRunString(
"for i in graph[0].nodes():\n"
456 " globals().update(locals())\n"
458 " nodeData['nodeType']=i.kind()\n"
459 " nodeAttributeNames=[x for x in i.attributeNames()]\n"
460 " nodeAttributes={j: _node_get(i, j) for j in nodeAttributeNames}\n"
461 " nodeData['nodeAttributes']=nodeAttributes\n"
462 " nodeInputs=[x for x in i.inputs()]\n"
463 " nodeInputNames=[x.debugName() for x in nodeInputs]\n"
464 " nodeData['nodeInputs']=nodeInputNames\n"
465 " nodeOutputs=[x for x in i.outputs()]\n"
466 " nodeOutputNames=[x.debugName() for x in nodeOutputs]\n"
467 " nodeData['nodeOutputs']=nodeOutputNames\n"
468 " nodeDType=[x.type().scalarType() for x in nodeOutputs]\n"
469 " nodeData['nodeDType']=nodeDType\n"
470 " modelData.append(nodeData)",
471 fGlobalNS, fLocalNS);
476 std::string fNodeType;
484 if(fNodeType ==
"onnx::Gemm"){
485 rmodel.AddBlasRoutines({
"Gemm",
"Gemv"});
487 else if(fNodeType ==
"onnx::Selu" || fNodeType ==
"onnx::Sigmoid"){
488 rmodel.AddNeededStdLib(
"cmath");
490 else if (fNodeType ==
"onnx::Conv") {
491 rmodel.AddBlasRoutines({
"Gemm",
"Axpy"});
498 PyRunString(
"weightNames=[k for k in graph[1].keys()]",fGlobalNS,fLocalNS);
499 PyRunString(
"weights=[v.numpy() for v in graph[1].values()]",fGlobalNS,fLocalNS);
500 PyRunString(
"weightDTypes=[v.type()[6:-6] for v in graph[1].values()]",fGlobalNS,fLocalNS);
508 std::size_t fWeightSize;
523 std::shared_ptr<void> fData(
malloc(fWeightSize *
sizeof(
float)), free);
524 std::memcpy(fData.get(),
fWeightValue,fWeightSize *
sizeof(
float));
535 PyRunString(
"inputs=[x for x in model.graph.inputs()]",fGlobalNS,fLocalNS);
536 PyRunString(
"inputs=inputs[1:]",fGlobalNS,fLocalNS);
537 PyRunString(
"inputNames=[x.debugName() for x in inputs]",fGlobalNS,fLocalNS);
540 std::vector<size_t>fInputShape;
559 PyRunString(
"outputs=[x for x in graph[0].outputs()]",fGlobalNS,fLocalNS);
560 PyRunString(
"outputNames=[x.debugName() for x in outputs]",fGlobalNS,fLocalNS);
562 std::vector<std::string> fOutputNames;
566 rmodel.AddOutputTensorNameList(fOutputNames);
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
const_iterator end() const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
std::unique_ptr< ROperator > MakePyTorchGemm(PyObject *fNode)
Prepares a ROperator_Gemm object.
std::unique_ptr< ROperator > MakePyTorchNode(PyObject *fNode)
Prepares equivalent ROperator with respect to PyTorch ONNX node.
std::unique_ptr< ROperator > MakePyTorchConv(PyObject *fNode)
Prepares a ROperator_Conv object.
std::unique_ptr< ROperator > MakePyTorchSigmoid(PyObject *fNode)
Prepares a ROperator_Sigmoid object.
std::unique_ptr< ROperator > MakePyTorchSelu(PyObject *fNode)
Prepares a ROperator_Selu object.
std::unique_ptr< ROperator > MakePyTorchRelu(PyObject *fNode)
Prepares a ROperator_Relu object.
const PyTorchMethodMap mapPyTorchNode
std::unordered_map< std::string, std::unique_ptr< ROperator >(*)(PyObject *fNode)> PyTorchMethodMap
std::unique_ptr< ROperator > MakePyTorchTranspose(PyObject *fNode)
Prepares a ROperator_Transpose object.
RModel Parse(std::string filepath, std::vector< std::vector< size_t > > inputShapes, std::vector< ETensorType > dtype)
Parser function for translating PyTorch .pt model into a RModel object.
std::string ConvertTypeToString(ETensorType type)
ETensorType ConvertStringToType(std::string type)