Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【hydra No.7】Adapt ldc2d_unsteady_Re10 to hydra #580

Merged
merged 6 commits into from
Oct 24, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 35 additions & 26 deletions docs/zh/examples/ldc2d_unsteady.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

<a href="https://aistudio.baidu.com/aistudio/projectdetail/6160749?contributionType=1&sUid=438690&shared=1&ts=1683961132625" class="md-button md-button--primary" style>AI Studio快速体验</a>

=== "模型训练命令"
``` sh
```
lknt marked this conversation as resolved.
Show resolved Hide resolved


=== "模型评估命令"
``` sh
```
lknt marked this conversation as resolved.
Show resolved Hide resolved

## 1. 背景简介

顶盖方腔驱动流LDC问题在许多领域中都有应用。例如,这个问题可以用于计算流体力学(CFD)领域中验证计算方法的有效性。虽然这个问题的边界条件相对简单,但是其流动特性却非常复杂。在顶盖驱动流LDC中,顶壁朝x方向以U=1的速度移动,而其他三个壁则被定义为无滑移边界条件,即速度为零。
Expand Down Expand Up @@ -116,9 +125,9 @@ $$

上式中 $f$ 即为 MLP 模型本身,用 PaddleScience 代码表示如下

``` py linenums="30"
``` py linenums="29"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:30:31
examples/ldc/ldc2d_unsteady_Re10.py:29:30
--8<--
```

Expand All @@ -130,9 +139,9 @@ examples/ldc/ldc2d_unsteady_Re10.py:30:31

由于 2D-LDC 使用的是 Navier-Stokes 方程的2维瞬态形式,因此可以直接使用 PaddleScience 内置的 `NavierStokes`。

``` py linenums="33"
``` py linenums="31"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:33:34
examples/ldc/ldc2d_unsteady_Re10.py:31:32
--8<--
```

Expand All @@ -143,9 +152,9 @@ examples/ldc/ldc2d_unsteady_Re10.py:33:34
本文中 2D-LDC 问题作用在以 [-0.05, -0.05], [0.05, 0.05] 为对角线的二维矩形区域,且时间域为 16 个时刻 [0.0, 0.1, ..., 1.4, 1.5],
因此可以直接使用 PaddleScience 内置的空间几何 `Rectangle` 和时间域 `TimeDomain`,组合成时间-空间的 `TimeXGeometry` 计算域。

``` py linenums="36"
``` py linenums="33"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:36:44
examples/ldc/ldc2d_unsteady_Re10.py:33:41
--8<--
```

Expand Down Expand Up @@ -199,17 +208,17 @@ examples/ldc/ldc2d_unsteady_Re10.py:36:44

在定义约束之前,需要给每一种约束指定采样点个数,这表示某种约束在其对应计算域内采样数据的数量,以及指定通用的采样配置。

``` py linenums="46"
``` py linenums="43"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:46:60
examples/ldc/ldc2d_unsteady_Re10.py:43:56
--8<--
```

#### 3.4.1 内部点约束

以作用在矩形内部点上的 `InteriorConstraint` 为例,代码如下:

``` py linenums="62"
``` py linenums="59"
# set constraint
pde_constraint = ppsci.constraint.InteriorConstraint(
equation["NavierStokes"].equations,
Expand Down Expand Up @@ -257,57 +266,57 @@ pde_constraint = ppsci.constraint.InteriorConstraint(

由于 `BoundaryConstraint` 默认会在所有边界上进行采样,而我们需要对四个边界分别施加约束,因此需通过设置 `criteria` 参数,进一步细化出四个边界,如上边界就是符合 $y = 0.05$ 的边界点集

``` py linenums="77"
``` py linenums="69"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:77:112
examples/ldc/ldc2d_unsteady_Re10.py:77:104
--8<--
```

#### 3.4.3 初值约束

最后我们还需要对 $t=t_0$ 时刻的矩形内部点施加 N-S 方程约束,代码如下:

``` py linenums="113"
``` py linenums="105"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:113:121
examples/ldc/ldc2d_unsteady_Re10.py:105:113
--8<--
```

在微分方程约束、边界约束、初值约束构建完毕之后,以我们刚才的命名为关键字,封装到一个字典中,方便后续访问。

``` py linenums="122"
``` py linenums="114"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:122:130
examples/ldc/ldc2d_unsteady_Re10.py:114:122
--8<--
```

### 3.5 超参数设定

接下来我们需要指定训练轮数和学习率,此处我们按实验经验,使用两万轮训练轮数和带有 warmup 的 Cosine 余弦衰减学习率。
接下来需要在配置文件中指定训练轮数,此处我们按实验经验,使用两万轮训练轮数和带有 warmup 的 Cosine 余弦衰减学习率。

``` py linenums="132"
``` py linenums="26"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:132:139
examples/ldc/conf/ldc2d_unsteady_Re10.yaml:26:29
--8<--
```

### 3.6 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器。

``` py linenums="141"
``` py linenums="131"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:141:142
examples/ldc/ldc2d_unsteady_Re10.py:131:132
--8<--
```

### 3.7 评估器构建

在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.GeometryValidator` 构建评估器。

``` py linenums="144"
``` py linenums="134"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:144:162
examples/ldc/ldc2d_unsteady_Re10.py:134:152
--8<--
```

Expand All @@ -329,19 +338,19 @@ examples/ldc/ldc2d_unsteady_Re10.py:144:162

本文中的输出数据是一个区域内的二维点集,每个时刻 $t$ 的坐标是 $(x^t_i,y^t_i)$,对应值是 $(u^t_i, v^t_i, p^t_i)$,因此我们只需要将评估的输出数据按时刻保存成 16 个 **vtu格式** 文件,最后用可视化软件打开查看即可。代码如下:

``` py linenums="164"
``` py linenums="154"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:164:195
examples/ldc/ldc2d_unsteady_Re10.py:154:185
--8<--
```

### 3.9 模型训练、评估与可视化

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练、评估、可视化。

``` py linenums="197"
``` py linenums="187"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:197:
examples/ldc/ldc2d_unsteady_Re10.py:187:208
--8<--
```

Expand Down
45 changes: 45 additions & 0 deletions examples/ldc/conf/ldc2d_unsteady_Re10.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
hydra:
run:
# dynamic output directory according to running time and override name
dir: ldc2d_unsteady_Re10/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
lknt marked this conversation as resolved.
Show resolved Hide resolved
job:
name: ${mode} # name of logfile
chdir: false # keep current working direcotry unchanged
sweep:
# output directory for multirun
dir: ${hydra.run.dir}
subdir: ./
# general settings
mode: train # running mode: train/eval
seed: 42
output_dir: ${hydra:run.dir}

# model settings
MODEL:
model:
input_keys: ["t", "x", "y"]
output_keys: ["u", "v", "p"]
num_layers: 9
hidden_size: 50
activation: "tanh"

# training settings
TRAIN:
epochs: 20000
iters_per_epoch: 1
eval_during_train: true
eval_freq: 200
lr_scheduler:
epochs: ${TRAIN.epochs}
iters_per_epoch: ${TRAIN.iters_per_epoch}
learning_rate: 0.001
weight:
pde: {"continuity": 0.0001,"momentum_x": 0.0001,"momentum_y": 0.0001}
pretrained_model_path: null
checkpoint_path: null

# evaluation settings
EVAL:
pretrained_model_path: null
batch_size:
residual_validator: 8192
Loading