I had some success in deploying my machine learning model (already trained) in a simulation environment (OpenModelica, in this context) via an external C-function.
However, to standardise the process, I am aiming to use the FMI standard instead of the external C-function. Therefore I need to wrap my ML model as an FMU.
Is there any way that I can do that? I read about PyFMI, however, it seems that it only controls the Co-simulation in a Python environment, instead of wrapping your ML model as an FMU.
The goal is to produce FMU from a trained ML model, and then deploy this FMU in a simulation environment (OpenModelica, for example). Any help will be very much appreciated.
Let’s say you have two Modelica models
model A output Real x (start=1,fixed=true); equation der(x) = 2*x; end A;
model B input Real x; Real y; function myExternalFunction input Real x; output Real y; external "C" annotation(Library="myExternalLib"); end myExternalFunction; equation y = myExternalFunction(x); end B;
B is using some external function
myExternalLib.dll. This could be a function using your trained network to predict some
y from some value
External functions in Modelica are standardized, see the Modelica specification 3.4, Section 12.9.
Now you can of course connect these models in a new Modelica model
model connectedAB A a; B b; equation a.x = b.x; end connectedAB;
Now to FMUs. The Functional Mock-up Interface is a standard that defines a container to exchange dynamic models.
There are different tools available, some can export a dynamic model as FMU (e.g. OpenModelica, Dymola,…) and some can import FMUs to simulate them (e.g. PyFMI, OMSimulator). Of course some tools can do both.
B could be exported as FMUs.
However it’s not intended to export a single external function like
So in OpenModelica you can export
B.fmu, create a new strongly connected SSP Model and add these FMUs as submodels. Under the hood OMEdit will use OMSimulator to simulate SSP/FMUs.
Even while it is not intended to do so you could probably still export your external function as a FMU. Just create a tiny model that will only call the external function (more or less like I did in
B). But you are not getting any benefits from doing that.