【问题标题】:FMU machine learning model [closed]FMU机器学习模型[关闭]
【发布时间】:2021-08-29 02:16:42
【问题描述】:

我通过外部 C 函数在模拟环境(OpenModelica,在此上下文中)中部署我的机器学习模型(已经训练)取得了一些成功。

但是,为了标准化流程,我的目标是使用 FMI 标准而不是外部 C 函数。因此,我需要将我的 ML 模型包装为 FMU。

有什么办法可以做到吗?我读过 PyFMI,但是,它似乎只控制 Python 环境中的协同仿真,而不是将您的 ML 模型包装为 FMU。

目标是从经过训练的 ML 模型生成 FMU,然后在模拟环境(例如 OpenModelica)中部署该 FMU。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 很难弄清楚您要做什么。你能提供一个最小的工作示例吗?我不确定你想在 FMU 中包装什么部分。您不能仅将外部函数调用包装为 FMU。 FMI 标准用于以某种标准化方式包装整个仿真模型(常微分方程组)。查看规范概述github.com/modelica/fmi-standard/releases/download/v2.0.2/…
  • 嗨,安,从昨天开始,我的问题又增加了,所以我会试着解释一下。我有 2 个用 Modelica 编写的组件模型。 A 的状态受 B 的状态影响。B 接收 Real 输入(标量),这些输入用于计算 B 的状态。为此,在 B 内,外部 C 函数调用预训练的神经网络,并传播 Real 输入以计算 B 的状态。不使用外部 C 调用,是否可以用 FMU 替换整个组件 B(内部有神经网络)?
  • 您可以将模型 A 和 B 替换为 FMU,因为它们是完整的模型。 FMU B 可以有外部函数调用,只要它们包含在 FMU 内部,它们来自哪里都没有关系。但是为一个外部函数创建一个 FMU 是没有意义的。

标签: python machine-learning openmodelica fmi


【解决方案1】:

假设您有两个 Modelica 模型 AB

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 正在使用来自myExternalLib.dll 的一些外部函数myExternalFunction。这可能是一个函数,使用您经过训练的网络从某个值 x 中预测一些 y

Modelica 中的外部函数是标准化的,请参阅Modelica specification 3.4, Section 12.9

现在您当然可以将这些模型连接到一个新的 Modelica 模型中

model connectedAB
  A a;
  B b;
equation
  a.x = b.x;
end connectedAB;

现在到 FMU。 Functional Mock-up Interface 是一个标准,它定义了一个容器来交换动态模型。

有不同的工具可用,有些可以将动态模型导出为 FMU(例如 OpenModelica、Dymola...),有些可以导入 FMU 来模拟它们(例如 PyFMI、OMSimulator)。当然有些工具可以两者兼得。

因此模型 AB 可以导出为 FMU。 但是,它并不打算导出像 myExternalFunction 这样的单个外部函数。

所以在 OpenModelica 中您可以导出 A.fmuB.fmu,创建一个新的强连接 SSP 模型并将这些 FMU 添加为子模型。在后台 OMEdit 将使用 OMSimulator 来模拟 SSP/FMU。

即使不打算这样做,您仍然可以将外部函数导出为 FMU。只需创建一个只调用外部函数的小模型(或多或少就像我在B 中所做的那样)。但是这样做并没有带来任何好处。

【讨论】:

  • 如果可以的话,我尝试关注openmodelica.org/doc/OpenModelicaUsersGuide/v1.11.0/… 来测试将 FMU 连接在一起并进行模拟。其中一个 FMU 是通过从 Modelica.Mechanics.Rotational.Examples.GenerationOfFMUs 导出 DirectInertia 模型作为 FMU 获得的。将 FMU 导入回 OMEdit 没问题,但我无法获取接口数据。即使我等了一晚,进度条也一直停留在 0%。你知道这个问题吗?在文档中,它似乎应该可以工作,考虑到我使用的 Modelica 模型是默认示例。谢谢
  • 您应该尝试使用更新版本的 OpenModelica。版本 1.11.0 来自 2017 年。当时没有可用的 SSP 支持。此外,“旧”FMU 导入与我使用 SSP 和 OMSimulator 的答案的方法完全不同。是的,在许多情况下,OMEdit File->Import->FMU 中的导入根本不起作用。
  • 嗨,我使用的是 1.14.2。您使用的 OpenModelica 版本是什么?当我们安装 OpenModelica 时,OMSimulator 和 SSP 是一起提供的,还是应该单独安装?看来可以成功生成取数据接口了。我尝试使用复合模型框架而不是您使用的 SSP 方法。能否请您指出有关 SSP + FMU 模拟的文档?
  • 也许您应该在 StackOverflow 或 OpenModelica 论坛上提出一个新的、更明确的问题。您最初关于 ML 和 FMU 的问题与此无关。但请查看 openmodelica.org 以获取最新版本的 OpenModelica (1.18)。 OMSimulator 与 OMEdit 一起提供,SSP 是 OpenModelica/OMSimulator (ssp-standard.org) 使用的标准。有关文档,请查看 OpenModelica 的用户指南:openmodelica.org/doc/OpenModelicaUsersGuide/latest/…
  • 谢谢 An,其实我在 OpenModelica 论坛上问过关于无法获取接口数据的问题。我还向您的 OpenModelica 帐户发送了一条消息,如果您有空,请查看。我想我是一周前寄的。这是我的帖子的链接openmodelica.org/forum/default-topic/… 谢谢
猜你喜欢
  • 2011-03-13
  • 2019-07-25
  • 2017-12-25
  • 2018-05-27
  • 2013-02-04
  • 2011-06-16
  • 2018-11-16
  • 1970-01-01
  • 2020-03-06
相关资源
最近更新 更多