ModelingToolkit、Modelica 和 Modia:Julia 中可组合建模的未来

2021-08-09 13:41:54

让我在这里花一点时间写出对 ModelingToolkit 的完整规范答案以及它与 Modia 和 Modelica 的关系。这个问题经常出现:为什么 ModelingToolkit 存在而不是建立在 Modelica 编译器的工具上?我首先要说我是 Martin 和 Hilding 工作的忠实粉丝,我们与他们在基于 Julia 的建模和仿真工具的方向上密切合作。 ModelingToolkit 作为一个新系统,在它探索的设计空间中具有一定的灵活性,虽然我们遵循不同的基本理念,但我们有许多相同的目标。 SciML 组织中的一切都围绕联合模块化开发的原则构建:让其他包影响您自己的功能。这在一篇关于 DifferentialEquations.jl 的包结构的论文中得到了强调。基本原则是,并非每个人都希望或需要成为包的开发人员,但仍可能希望做出贡献。例如,ODE 求解器中的研究人员想要构建一个将一个求解器添加到 SciML 生态系统的包的情况并不少见。这样做是为了他们自己的学分,但现在它存在于多重派遣世界中的免费奖金。在DifferentialEquations.jl 的设计中,solve(prob,IRKGL16()) 现在因为它们的包而存在,所以我们将它添加到文档中。有些工作甚至不在组织内部,但我们仍然支持它。其理念是让每位研究人员都成为计算研究领域的萌芽艺术家,包括所有可能的方法,并建立一个促进方法中自由研究氛围的基础设施。顶级默认值和文档可能会引导人们进入生态系统中最稳定的方面,但只需轻按一下开关,您就可以测试最新的研究。 Modelica 生态系统(开放标准、OpenModelica、多种商业实现),基于面向方程建模的简单思想开始,对行业产生了巨大影响,解决了许多困难的实际工业问题。今天的现代仿真系统设计人员希望从他们的语言和编译器堆栈中获得更多。例如,在 Modelica 语言中,没有提到对您的模型进行了哪些转换以使其“可模拟”。人们知道 Pantelides 算法和“奇点消除”,但这不在语言范围内。编译器可能会为您提供一些选项,但用户或代码不会主动与之交互。每个编译器都是不同的,当你使用另一个编译器时,一个编译器的进步对你的模型没有帮助,整个世界都是孤立的。通过这种设计,外部用户很难在 Modelica 中编写编译器过程,这会影响这个模型降低过程。你可以调整旋钮,或者编写一个新的编译器,或者 fork OpenModelica 并破解整个编译器来做你想要的更改。正如 Julia 编译器生态系统所展示的那样,进入门槛可以显着降低。我认为在很多情况下,Modelica 中的一组符号案例可能还不够,而且崭露头角的系统设计人员可能想自己编写。例如,在 SDE 上有一个 Lamperti 变换,它可以将一般 SDE 转换为具有加性噪声的 SDE。它并不总是适用,但当它适用时,它可以大大提高求解器的速度和稳定性。这足够小众,它可能永远不会出现在商业 Modelica 编译器中(实际上,Modelica 目前没有 SDE),但某些用户可能希望能够将其添加到流程中。因此,ModelingToolkit 的初始目标是提供一个开放的模块化转换系统,整个建模生态系统都可以在此系统上蓬勃发展。我之前的博文举例说明了不熟悉的代码转换用例如何解决许多困难的数学问题,我的目标是将这种能力赋予整个开发社区。 `structural_simplify` 是 ModelingToolkit 中内置的东西,用于在标准系统上进行“标准转换”,但转换的世界要大得多。对几个变量进行对数转换?取几个指数以确保积极性? SDE 的 Lamperti 变换?转换为灵敏度方程?不仅仅是转换,还有用于检查和分析模型的功能。方程是线性的吗?哪些参数在结构上是可识别的? ModelingToolkit 是对建模语言的解构。它将其分解为组成部分,然后可以轻松构建新的建模语言,例如 Catalyst.jl,这些语言在内部使用 ModelingToolkit 进行所有困难的转换。解构形式是构建新的基于领域的语言以及针对特定模型优化编译器的新转换的一个跳跃点。最后,随着核心 MTK 的改进,基于它构建的每个人都会获得更高的稳定性、性能和并行性。现在有两个主要方面需要处理才能完全实现这样的愿景。如果您希望人们能够在转换之间重用代码,那么您想要的是公开您如何更改代码。为了实现这一目标,为 ModelingToolkit.jl 创建了一个新的计算机代数系统 (CAS) Symbolics.jl。这个想法是,如果我们希望每个人都编写代码转换,他们都应该可以轻松访问用于执行此类代码转换的通用数学工具集。我们不应该让每个人都为差异化、简化和替代构建新代码。而且我们也不应该让每个人都依赖 ModelingToolkit.jl 未记录的内部结构:这应该是开放的、经过良好测试的、有记录的和众所周知的系统,以便每个人都可以轻松成为“ModelingToolkit 编译器开发人员”。通过构建 CAS 并使其成为 Julia 标准,我们可以弥合开发人员之间的差距,因为现在每个人都知道如何轻松操作模型:它们只是 Symbolics.jl 表达式。

第二个主要方面是实现对宿主语言的自然嵌入。 Modelica 不是一种人们可以编写编译器传递的语言,这在建模者和建模语言扩展的开发者之间引入了主要差距。如果我们想弥合这一差距,我们需要确保整个建模语言都来自主机,这是一种完整的命令式编程语言。并且您需要使用一种交互式、高性能的语言,并且具有用于建模和仿真的完善的生态系统。 Martin 和 Hilding 将这一事实视为 Modia 的综合,Julia 如何独特地满足了这一需求,但我认为我们可以更进一步。要真正使嵌入自然,您应该能够在运行中自动将代码转换为符号形式或从符号形式转换。在上一篇博文中,我展示了 ModelingToolkit.jl 如何通过自动并行化和执行索引减少来改进人们的代码,即使代码不是用 ModelingToolkit.jl 编写的。这使转换语言的开发人员受众从“任何想要转换模型的人”增加到“任何想要自动化改进模型和通用代码的人”。因此,这种受众的扩大吸引了对自动化并行性和 GPU 代码生成等感兴趣的开发人员,并将他们带入 MTK 开发人员社区。反过来,由于所有这些进步都适用于 MTK 内部和代码生成工具,例如 Symbolics.jl 的 build_function,由于社区的组成方式,新功能一直在出现。 CTarget build_function 首先被创建以将 Julia 代码转换为 C,因此 ModelingToolkit 模型可以生成 C 输出以编译到嵌入式系统中。看到一个例子时这是一个意外,但是当您注意到整个系统如此快速增长时,它就是设计。现在我们早期收到的一个问题是,您是否无法与仅用于 Modelica 的专用编译器的性能相匹敌,对吗?虽然从表面上看,超专业化似乎是有益的,但超专业化的真正影响是算法效率较低,因为投入的工作较少。 Symbolics.jl 已经成为一种现象,有多个不同的百条评论线程挖掘其设计的优缺点的许多方面,这甚至不包括 200 人的聊天频道,该频道在CAS 发布后不到 2 个月。很多人都在建议如何改进每一个加法和乘法运算。因此,很快添加了许多细节,但距离 Modelica 的实现还有几年的时间,这应该不足为奇。它自动多线程遍历树并重写规则。它会自动生成快速并行化的代码,并且可以通过撕裂非线性方程的方式来实现。它允许用户定义自己的高性能和并行化函数,注册它们,并将它们粘贴到右侧。这甚至不包括更高级别的结果,例如它是完全可微的,因此允许训练在模型内分解的神经网络,并自动从数据中发现方程。只是在最基本的层面上,我们可以看到 CAS 正在改变科学家和工程师在建模过程的许多方面的工作流程。通过分发改进符号计算的工作,我们已经采取了本质上无法获得的示例,并使用 Symbolics.jl 使其即时化:我们正在为符号生态系统构建一个完整的基准测试系统,以随着时间的推移跟踪性能并确保它达到顶层。它整合了 OSCAR 项目的部分内容,让很多人跟踪他们自己工作中的表现,并建立了一个社区。每一步都是另一项重大改进,这个生态系统正在加快这些步骤。这是一个相当好的问题,因为 Modelica 已经编写了很多模型,如果我们无法连接到该生态系统,那将是一种耻辱。我会暗示,作为 JuliaSim 的一部分,即将推出的工具用于连接到许多预先存在的模型库。此外,我们希望利用像 Modia.jl 和 TinyModia.jl 这样的工具,与 Modelica 社区的合作将帮助我们架起一座桥梁。

ModelingToolkit.jl 的可组合性和分布式开发特性是其催化剂。这就是 ModelingToolkit.jl 看起来像是穿上了火箭鞋的原因:它很快,而且移动得也很快。这是因为设计中的思想。这是因为 ModelingToolkit.jl 将整个研究社区作为其资产而不仅仅是其用户。我计划从这里继续前进,回顾过去向伟人学习,但要按照我们自己的形象进行建设。我们采用建模语言的理念,将其分发到建模和仿真领域最活跃的开发人员社区之一,采用一种旨在构建快速并行代码的语言。你被邀请了。我将发布 Jonathan 在 NASA Launch Services Program 的近期演讲,他看到了从 Simulink 迁移到 ModelingToolkit.jl 后的 15,000 倍加速。说够了。虽然我们不希望每个应用程序都会看到这种加速(尽管我们希望他们会!),但我们很想听听您使用 ModelingToolkit 的经验。 Christopher Rackauckas,ModelingToolkit、Modelica 和 Modia:Julia 的可组合建模未来,Winnower 8:e162133.39054(2021 年)。 DOI:10.15200/winn.162133.39054