Skip to content

Commit

Permalink
【hydra No.9】darcy2d (PaddlePaddle#590)
Browse files Browse the repository at this point in the history
* Add darcy2d hydra

* Fix

* Fix

* Fix

* Apply suggestions from code review

Co-authored-by: HydrogenSulfate <490868991@qq.com>

* Fix

* Fix

* Fix

---------

Co-authored-by: HydrogenSulfate <490868991@qq.com>
  • Loading branch information
co63oc and HydrogenSulfate authored Oct 27, 2023
1 parent ae693ec commit 688e315
Show file tree
Hide file tree
Showing 3 changed files with 236 additions and 72 deletions.
64 changes: 38 additions & 26 deletions docs/zh/examples/darcy2d.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

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

=== "模型训练命令"

``` sh
python darcy2d.py
```

=== "模型评估命令"

``` sh
python darcy2d.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/darcy2d/darcy2d_pretrained.pdparams
```

## 1. 背景简介

Darcy Flow是一个基于达西定律的工具,用于计算液体的流动。在地下水模拟、水文学、水文地质学和石油工程等领域中,Darcy Flow被广泛应用。
Expand Down Expand Up @@ -42,9 +54,9 @@ $$

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

``` py linenums="32"
``` py linenums="33"
--8<--
examples/darcy/darcy2d.py:32:33
examples/darcy/darcy2d.py:33:34
--8<--
```

Expand All @@ -56,9 +68,9 @@ examples/darcy/darcy2d.py:32:33

由于 2D-Poisson 使用的是 Poisson 方程的2维形式,因此可以直接使用 PaddleScience 内置的 `Poisson`,指定该类的参数 `dim` 为2。

``` py linenums="35"
``` py linenums="36"
--8<--
examples/darcy/darcy2d.py:35:36
examples/darcy/darcy2d.py:36:37
--8<--
```

Expand All @@ -67,9 +79,9 @@ examples/darcy/darcy2d.py:35:36
本文中 2D darcy 问题作用在以 (0.0, 0.0), (1.0, 1.0) 为对角线的二维矩形区域,
因此可以直接使用 PaddleScience 内置的空间几何 `Rectangle` 作为计算域。

``` py linenums="38"
``` py linenums="39"
--8<--
examples/darcy/darcy2d.py:38:39
examples/darcy/darcy2d.py:39:40
--8<--
```

Expand All @@ -79,19 +91,19 @@ examples/darcy/darcy2d.py:38:39

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

``` py linenums="41"
``` py linenums="42"
--8<--
examples/darcy/darcy2d.py:41:49
examples/darcy/darcy2d.py:42:46
--8<--
```

#### 3.4.1 内部点约束

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

``` py linenums="51"
``` py linenums="48"
--8<--
examples/darcy/darcy2d.py:51:68
examples/darcy/darcy2d.py:48:65
--8<--
```

Expand All @@ -113,9 +125,9 @@ examples/darcy/darcy2d.py:51:68

同理,我们还需要构建矩形的四个边界的约束。但与构建 `InteriorConstraint` 约束不同的是,由于作用区域是边界,因此我们使用 `BoundaryConstraint` 类,代码如下:

``` py linenums="70"
``` py linenums="67"
--8<--
examples/darcy/darcy2d.py:70:80
examples/darcy/darcy2d.py:67:77
--8<--
```

Expand All @@ -131,39 +143,39 @@ lambda _in: np.sin(2.0 * np.pi * _in["x"]) * np.cos(2.0 * np.pi * _in["y"])

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

``` py linenums="81"
``` py linenums="78"
--8<--
examples/darcy/darcy2d.py:81:85
examples/darcy/darcy2d.py:78:82
--8<--
```

### 3.5 超参数设定

接下来我们需要指定训练轮数和学习率,此处我们按实验经验,使用一万轮训练轮数。

``` py linenums="87"
``` yaml linenums="39"
--8<--
examples/darcy/darcy2d.py:87:88
examples/darcy/conf/darcy2d.yaml:39:47
--8<--
```

### 3.6 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器,并配合使用机器学习中常用的 OneCycle 学习率调整策略。

``` py linenums="90"
``` py linenums="84"
--8<--
examples/darcy/darcy2d.py:90:97
examples/darcy/darcy2d.py:84:86
--8<--
```

### 3.7 评估器构建

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

``` py linenums="99"
``` py linenums="88"
--8<--
examples/darcy/darcy2d.py:99:116
examples/darcy/darcy2d.py:88:105
--8<--
```

Expand All @@ -173,9 +185,9 @@ examples/darcy/darcy2d.py:99:116

本文中的输出数据是一个区域内的二维点集,因此我们只需要将评估的输出数据保存成 **vtu格式** 文件,最后用可视化软件打开查看即可。代码如下:

``` py linenums="118"
``` py linenums="106"
--8<--
examples/darcy/darcy2d.py:118:156
examples/darcy/darcy2d.py:106:147
--8<--
```

Expand All @@ -185,19 +197,19 @@ examples/darcy/darcy2d.py:118:156

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

``` py linenums="158"
``` py linenums="148"
--8<--
examples/darcy/darcy2d.py:158:179
examples/darcy/darcy2d.py:148:169
--8<--
```

#### 3.9.2 使用 L-BFGS 微调[可选]

在使用 `Adam` 优化器训练完毕之后,我们可以将优化器更换成二阶优化器 `L-BFGS` 继续训练少量轮数(此处我们使用 `Adam` 优化轮数的 10% 即可),从而进一步提高模型精度。

``` py linenums="181"
``` py linenums="172"
--8<--
examples/darcy/darcy2d.py:181:206
examples/darcy/darcy2d.py:172:198
--8<--

```
Expand Down
64 changes: 64 additions & 0 deletions examples/darcy/conf/darcy2d.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
hydra:
run:
# dynamic output directory according to running time and override name
dir: outputs_darcy2d/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
job:
name: ${mode} # name of logfile
chdir: false # keep current working direcotry unchaned
config:
override_dirname:
exclude_keys:
- TRAIN.checkpoint_path
- TRAIN.pretrained_model_path
- EVAL.pretrained_model_path
- mode
- output_dir
- log_freq
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}

# set working condition
NPOINT_PDE: 9801 # 99 ** 2
NPOINT_BC: 400 # 100 * 4

# model settings
MODEL:
input_keys: ["x", "y"]
output_keys: ["p"]
num_layers: 5
hidden_size: 20
activation: "stan"

# training settings
TRAIN:
epochs: 10000
iters_per_epoch: 1
lr_scheduler:
epochs: ${TRAIN.epochs}
iters_per_epoch: ${TRAIN.iters_per_epoch}
max_learning_rate: 1.0e-3
end_learning_rate: 1.0e-7
lbfgs:
iters_per_epoch: ${TRAIN.iters_per_epoch}
output_dir: ./outputs_darcy2d_L-BFGS
learning_rate: 1.0
max_iter: 10
eval_freq: ${TRAIN.eval_freq}
eval_during_train: ${TRAIN.eval_during_train}
eval_freq: 200
eval_during_train: true
pretrained_model_path: null
checkpoint_path: null

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

0 comments on commit 688e315

Please sign in to comment.