【粉丝需求回应】使用 FMU 源生成用于参数估计的代理项

文摘   2024-11-09 07:25   贵州  

代理模型 (SM) 作为基于物理和实验的模型的代理,可显著降低预测成本,同时提供高精度。在考虑零件几何形状或刀具路径时,构建用于增材制造 (AM) 工艺的 SM 除了从基于物理的模型或实验生成数据的成本很高之外,还受到输入高维的影响。本文设计了一个代理模型的特征,以预测熔丝制造过程中的固结程度。我们的特征由基础热过程的物理特性提供信息,并捕捉到零件几何形状和沉积过程的特征。我们的模型是从基于物理的热模型与聚合物愈合理论相结合生成的中型数据中学习的,以确定固结程度。我们的结果表明,以较低的计算成本(比数值模型快四个数量级)预测固结度预测的准确性很高 (>90%)。

赋予动机

参数估计是一种广泛使用的技术,用于将模型校准为真实世界的数据。工业模型的真实表示可能非常昂贵,无法运行完成参数估计任务所需的次数。在本教程中,我们将演示如何构建一个代理项,作为这些真实模型的高保真度和计算成本的替代品,以便在协同仿真模式下使用耦合离合器 FMU 将其用于此类应用。

分步演练

1. 设置代理生成环境

首先,我们通过导入来准备环境,然后JuliaSimSurrogatesFMIJuliaHub

using FMI
using JuliaSimSurrogates
using JuliaHub
using JLSO

2. 在 FMU Simuator 中加载

我们的模型是 FMU 形式。让我们导入 FMU。这可以通过将 FMU 的路径交给函数来完成。fmi2Load

fmu = FMI.fmi2Load("Path to the CoupledClutches FMU")
Model name:        CoupledClutches
Type: 1

3. 设置 SimulatorConfig

现在我们有一个工作模型,我们想要生成许多样本。然后,可以使用样本集合来训练代理模型。JuliaSimSurrogates 的 DataGeneration 子模块将帮助我们生成数据。

参数空间

我们将为 FMU 的前两个参数定义参数空间,同时保持其余参数固定。为了定义 ParameterSpace,我们定义所需的样本数、空间边界和从 FMU 模型描述中获得的参数标签。

nsamples_p = 100
p_lb = [0.19, 0.39]
p_ub = [0.21, 0.41]
param_labels = FMI.FMIImport.fmi2GetParameterNames(fmu)
param_space = ParameterSpace(p_lb, p_ub, nsamples_p; labels = param_labels[1:2])
 2 dimensional ParameterSpace with 100 samples 
╭──────────────────┬──────────────────────────────────────────────┬──────────...
─────────╮...
Space Type Statistics Number...
of Samples ...
├──────────────────┼──────────────────────────────────────────────┼──────────...
─────────┤...
╭──────────┬──────────────┬──────────────╮ ...
Labels LowerBound UpperBound ...
├──────────┼──────────────┼──────────────┤ ...
T2 0.19 0.21 ...
ParameterSpace ├──────────┼──────────────┼──────────────┤ ...
...
...
├──────────┼──────────────┼──────────────┤ ...
freqHz 0.39 0.41 ...
╰──────────┴──────────────┴──────────────╯ ...
╰──────────────────┴──────────────────────────────────────────────┴──────────...
─────────╯...

模拟器配置

为了生成数据,我们现在定义一个模拟器配置并运行模拟。此 SimulatorConfig 包含有关所有采样空间的信息,并将它们应用于问题定义。

sim_config = SimulatorConfig(param_space);

4. 将 Datagen 作业部署到 JuliaHub

我们已经在上一节中定义了 datagen 脚本,现在我们将在 JuliaHub 上部署用于数据生成的作业。

首先,我们需要在 JuliaHub 中进行身份验证,因为这是提交任何批处理作业所必需的。这将传递给启动作业的函数。

auth = JuliaHub.authenticate()

现在我们获取上面遍历的所有代码并将其放在@datagen

@datagen begin
using FMI
using JuliaSimSurrogates
nsamples_p = 100
p_lb = [0.19, 0.39]
p_ub = [0.21, 0.41]
param_labels = FMI.FMIImport.fmi2GetParameterNames(fmu)
param_space = ParameterSpace(p_lb, p_ub, nsamples_p; labels = param_labels[1:2])
sim_config = SimulatorConfig(param_space);
outputs = FMI.FMIImport.fmi2GetOutputNames(fmu) .|> string

ed = sim_config(fmu; outputs = outputs[1:3]);
end

我们提供将上传生成数据的数据集的名称。

dataset_name = "coupledclutches_cs_dict"
"coupledclutches_cs_dict"

接下来,我们提供作业所需的计算规格:CPU、GPU 和 GB 内存的数量。根据经验,我们通常需要具有大量 CPU 的机器来并行化和扩展数据生成过程。

datagen_specs = (ncpu = 4, ngpu = 0, memory = 32)
(ncpu = 4, ngpu = 0, memory = 32)

接下来,我们提供用于作业的批处理图像。我们将使用 JuliaSim 映像,因为我们需要的所有包都只能通过它访问。

batch_image = JuliaHub.batchimage("juliasim-batch", "JuliaSim")

然后,我们调用 run_datagen 来启动并运行作业。

datagen_job, datagen_dataset = run_datagen(@__DIR__,
batch_image;
auth,
dataset_name,
specs = datagen_specs)

此处,指的是当前工作目录,该目录将作为 appbundle 上传和运行。此目录可用于上传在启动的计算节点上执行脚本时可能需要的任何 FMU 或其他文件。任何需要捆绑的此类工件(不属于 JuliaHub 项目或数据集)都必须放在此目录中。@__DIR__

下载数据集

数据生成作业完成后,我们可以使用 JuliaHub API 下载生成的数据。

path_datagen_dataset = JuliaHub.download_dataset(datagen_dataset, "local_path_of_the_file"; auth)

我们将使用 JLSO 对其进行反序列化并将其作为 ExperimentData 加载。

ed = ExperimentData(JLSO.load(path_datagen_dataset)[:result])
 Number of Trajectories in ExperimentData: 100 
Basic Statistics for Given Dynamical System's Specifications
Number of y0s in the ExperimentData: 3
Number of ps in the ExperimentData: 2
╭─────────┬──────────────────────────────────────────────────────────────────...
──╮...
Field ...
...
├─────────┼──────────────────────────────────────────────────────────────────...
──┤...
╭──────────────┬──────────────┬──────────────┬────────┬─────────...
Labels LowerBound UpperBound Mean StdDev...
├──────────────┼──────────────┼──────────────┼────────┼─────────...
outputs[1] 10.0 10.0 10.0 0.0...
y0s ├──────────────┼──────────────┼──────────────┼────────┼─────────...
...
...
├──────────────┼──────────────┼──────────────┼────────┼─────────...
outputs[3] 0.0 0.0 0.0 0.0...
╰──────────────┴──────────────┴──────────────┴────────┴─────────...
├─────────┼──────────────────────────────────────────────────────────────────...
──┤...
╭──────────┬──────────────┬──────────────┬────────┬──────────╮...
Labels LowerBound UpperBound Mean StdDev...
├──────────┼──────────────┼──────────────┼────────┼──────────┤...
T2 0.19 0.21 0.2 0.006...
ps ├──────────┼──────────────┼──────────────┼────────┼──────────┤...
...
...
├──────────┼──────────────┼──────────────┼────────┼──────────┤...
freqHz 0.39 0.41 0.4 0.006...
╰──────────┴──────────────┴──────────────┴────────┴──────────╯...
╰─────────┴──────────────────────────────────────────────────────────────────...
──╯...
Basic Statistics for Given Dynamical System's Continuous Fields
Number of observables in the ExperimentData: 3
╭───────────────┬────────────────────────────────────────────────────────────...
─────────╮...
Field ...
...
├───────────────┼────────────────────────────────────────────────────────────...
─────────┤...
╭──────────────┬──────────────┬──────────────┬─────────┬──...
Labels LowerBound UpperBound Mean...
├──────────────┼──────────────┼──────────────┼─────────┼──...
outputs[1] 5.868 10.0 6.907...
observables ├──────────────┼──────────────┼──────────────┼─────────┼──...
...
...
├──────────────┼──────────────┼──────────────┼─────────┼──...
outputs[3] 0.0 2.119 1.609...
╰──────────────┴──────────────┴──────────────┴─────────┴──...
╰───────────────┴────────────────────────────────────────────────────────────...
─────────╯...

这将生成一个可用于拟合 DigitalEcho 的 ExperimentData

这是生成的轨迹的相空间图。

5. 安装 DigitalEcho

设置训练脚本

我们将使用 @train 写出训练脚本,该脚本将在工作中执行。这类似于数据生成,我们需要编写代码来导入所需的包和训练代理项。在这里,我们使用 module 来训练 DigitalEchoSurrogatize

@train begin
using Surrogatize, Training, DataGeneration, JLSO

## Loading the dataset
dict = JLSO.load(JSS_DATASET_PATH)[:result]
ed = ExperimentData(dict)

## Training
surrogate = DigitalEcho(ed;
ground_truth_port = :observables,
n_epochs = 24500,
batchsize = 2048,
lambda = 1e-7,
tau = 1.0,
verbose = true,
callevery = 100)
end

在 JuliaHub 上部署训练作业

我们提供数据集的名称,该名称将在作业中为我们下载,并且可以通过环境变量访问其路径。我们可以在训练脚本中引用它,如上所示。我们还提供了将上传经过训练的代理的代理数据集的名称。JSS_DATASET_PATH

dataset_name = "coupledclutches_cs_dict"
surrogate_name = "coupledclutches_cs_digitalecho"
"coupledclutches_cs_digitalecho"

接下来,我们提供作业所需的计算规格。根据经验,我们需要 GPU 机器来拟合 DigitalEcho 以加快训练速度。

training_specs = (ncpu = 8, ngpu = 1, memory = 61, timelimit = 12)
(ncpu = 8, ngpu = 1, memory = 61, timelimit = 12)

接下来,我们提供用于作业的批处理图像。同样,我们将使用 JuliaSim 映像,因为我们需要的所有包都只能通过它访问。

batch_image = JuliaHub.batchimage("juliasim-batch", "JuliaSim")
JuliaHub.BatchImage: 
product: juliasim-batch
image: JuliaSim
CPU image: juliajuliasim
GPU image: juliagpujuliasim

然后,我们调用 run_training 来启动并运行作业。

train_job, surrogate_dataset = run_training(@__DIR__,
batch_image,
dataset_name;
auth,
surrogate_name,
specs = training_specs)

下载模型

训练作业完成后,我们可以将代理下载到我们的 JuliaSimIDE 实例上,以执行一些验证,以检查我们训练的代理是否表现良好。

path_surrogate_dataset = JuliaHub.download_dataset(surrogate_dataset, "local_path_of_the_file"; auth)

该模型使用 JLSO 进行序列化,因此我们对其进行反序列化:

model = JLSO.load(path)[:result]
A Continous Time Surrogate wrapper with:
prob:
A `DigitalEchoProblem` with:
model:
A DigitalEcho with :
RSIZE : 256
USIZE : 3
XSIZE : 0
PSIZE : 2
ICSIZE : 0
solver: Tsit5(; stage_limiter! = trivial_limiter!, step_limiter! = trivial_limiter!, thread = static(false),)

6. 结果可视化

以下是 DigitalEcho 对训练数据轨迹的真实值和预测图

相关的代码及资料文档已经上传知识星球:

近期上传资料如下:

【智慧兵棋推演专题】美国在人工智能兵棋推演的使用介绍--21份技术资料,超50万字的干货

提高空中和导弹防御(AMD)系统在人类与人工智能之间的信任-182页论文+145页技术论文

工智能用于防空和导弹防御安全风险评估的技术报告-162页

基于代理的模型对马赛克战争的建模技术介绍-涉及180页资料共计13万字的干货

【人工智能与杀伤链专题】以机器速度做出决策:将 AI 引入命令链-含30份技术资料-共406页-超100万字干货

【反无人机蜂群专题】关于在战斗中对小型无人机蜂群防御和手段-涉及28份资料-超100万字

海军兵棋推演战斗管理辅助工具中的博弈论和规范分析-2022最新84页论文

多域作战中的风险感知-美国陆军55页报告

游荡弹药和不可预测性:武器系统的自主性和对人类控制的挑战-72页

技术报告基于人工智能(AI)的空中和导弹防御(AMD):以结果为导向的辅助决策-145页

近日推出反无人机专题-含关于在战斗中对小型无人机蜂群防御和手段-涉及28份资料-超100万字

本文节选自原文的一部分内容,原文进入知识星球下载:


软件工程技术交流
本公众号用于分享软件设计/软件工程化管理/CMMI/GJB5000等技术知识,将分享关于嵌入式软件设计/编码/测试等技术知识,同时分享软件工程的管理经验。
 最新文章