Skip to content

Commit a0b9851

Browse files
Fix
1 parent 234d7d0 commit a0b9851

File tree

4 files changed

+122
-123
lines changed

4 files changed

+122
-123
lines changed

docs/zh/user_guide.md

Lines changed: 117 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -682,121 +682,7 @@ solver.eval()
682682
683683
## 2. 进阶功能
684684
685-
### 2.1 分布式训练
686-
687-
#### 2.1.1 数据并行
688-
689-
接下来以 `examples/pipe/poiseuille_flow.py` 为例,介绍如何正确使用 PaddleScience 的数据并行功能。分布式训练细节可以参考:[Paddle-使用指南-分布式训练-快速开始-数据并行](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/06_distributed_training/cluster_quick_start_collective_cn.html)。
690-
691-
1. 在 constraint 实例化完毕后,将 `ITERS_PER_EPOCH` 重新赋值为经过自动多卡数据切分后的 `dataloader` 的长度(一般情况下其长度等于单卡 dataloader 的长度除以卡数,向上取整),如代码中高亮行所示。
692-
693-
``` py linenums="146" title="examples/pipe/poiseuille_flow.py" hl_lines="22"
694-
ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE)
695-
696-
pde_constraint = ppsci.constraint.InteriorConstraint(
697-
equation["NavierStokes"].equations,
698-
{"continuity": 0, "momentum_x": 0, "momentum_y": 0},
699-
geom=interior_geom,
700-
dataloader_cfg={
701-
"dataset": "NamedArrayDataset",
702-
"num_workers": 1,
703-
"batch_size": BATCH_SIZE,
704-
"iters_per_epoch": ITERS_PER_EPOCH,
705-
"sampler": {
706-
"name": "BatchSampler",
707-
"shuffle": False,
708-
"drop_last": False,
709-
},
710-
},
711-
loss=ppsci.loss.MSELoss("mean"),
712-
evenly=True,
713-
name="EQ",
714-
)
715-
ITERS_PER_EPOCH = len(pde_constraint.data_loader) # re-assign to ITERS_PER_EPOCH
716-
717-
# wrap constraints together
718-
constraint = {pde_constraint.name: pde_constraint}
719-
720-
EPOCHS = 3000 if not args.epochs else args.epochs
721-
```
722-
723-
2. 使用分布式训练命令启动训练,以 4 卡数据并行训练为例
724-
725-
``` sh
726-
# 指定 0,1,2,3 张卡启动分布式数据并行训练
727-
export CUDA_VISIBLE_DEVICES=0,1,2,3
728-
python -m paddle.distributed.launch --gpus="0,1,2,3" poiseuille_flow.py
729-
```
730-
731-
<!-- #### 1.1.2 模型并行
732-
733-
TODO -->
734-
735-
### 2.2 自动混合精度训练
736-
737-
接下来介绍如何正确使用 PaddleScience 的自动混合精度功能。自动混合精度的原理可以参考:[Paddle-使用指南-性能调优-自动混合精度训练(AMP)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/performance_improving/amp_cn.html#amp)。
738-
739-
实例化 `Solver` 时加上 2 个参数: `use_amp=True`, `amp_level="O1"`(或`amp_level="O2"`)。如代码中高亮行所示,通过指定 `use_amp=True`,开启自动混合精度功能,接着再设置 `amp_level="O1"`,指定混合精度所用的模式,`O1` 为自动混合精度,`O2` 为更激进的纯 fp16 训练模式,一般推荐使用 `O1`。
740-
741-
``` py hl_lines="5 6"
742-
# initialize solver
743-
solver = ppsci.solver.Solver(
744-
...,
745-
...,
746-
use_amp=True,
747-
amp_level="O1", # or amp_level="O2"
748-
)
749-
```
750-
751-
### 2.3 梯度累加
752-
753-
接下来介绍如何正确使用 PaddleScience 的梯度累加功能。梯度累加的原理可以参考:[Paddle-使用指南-性能调优-自动混合精度训练(AMP)-动态图下使用梯度累加](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/performance_improving/amp_cn.html#dongtaituxiashiyongtiduleijia)。
754-
755-
实例化 `Solver` 时指定 `update_freq` 参数为大于 1 的正整数即可。如代码中高亮行所示,`update_freq` 可以设置为 2 或者更大的整数,推荐使用 248,此时对于训练任务来说,全局 `batch size` 等价于 `update_freq * batch size`。梯度累加方法在大多数场景中能够让间接地扩大每个 batch 内的样本数量,从而让每个 batch 分布更接近真实数据分布,提升训练任务的性能。
756-
757-
``` py hl_lines="5"
758-
# initialize solver
759-
solver = ppsci.solver.Solver(
760-
...,
761-
...,
762-
update_freq=2, # or 4, 8
763-
)
764-
```
765-
766-
### 2.4 多任务学习
767-
768-
在机理驱动、数理融合场景中,往往会同时优化多个损失项,如控制方程残差损失、(初)边值条件损失等。在训练过程中这些损失项对参数的梯度方向可能会互相冲突,阻碍训练精度收敛,而这正是多任务学习方法能解决的问题。因此 PaddleScience 在多任务学习模块中引入了几种常见的算法,其主要通过对不同任务的权重或产生的梯度进行调整,从而缓解该问题,最终提升模型收敛精度。下面以 [`Relobralo`](https://paddlescience-docs.readthedocs.io/zh/latest/zh/api/loss/mtl/#ppsci.loss.mtl.Relobralo) 算法进行举例,使用方式如下:
769-
770-
1. 实例化一个多任务学习方法的对象
771-
772-
``` py hl_lines="3"
773-
from ppsci.loss import mtl
774-
model = ...
775-
num_losses = 2 # number of losses to be optimized
776-
loss_aggregator = mtl.Relobralo(num_losses)
777-
```
778-
779-
2. 将该对象作为 `Solver` 的实例化参数之一传入
780-
781-
``` py hl_lines="4"
782-
solver = ppsci.solver.Solver(
783-
...,
784-
...,
785-
loss_aggregator=loss_aggregator,
786-
)
787-
```
788-
789-
3. 启动训练,训练过程中 `loss_aggregator` 会自动对获取到的多个损失项应用对应的多任务学习方法进行优化
790-
791-
``` py
792-
solver.train()
793-
```
794-
795-
!!! info "影响说明"
796-
797-
个别多任务学习方法(如weight based method)可能会改变**训练过程**中损失函数的计算方式,但仅限于影响训练过程,模型**评估过程**的损失计算方式保持不变。
798-
799-
### 2.5 贝叶斯超参搜索
685+
### 2.1 贝叶斯超参搜索
800686
801687
hydra 的自动化实验功能可以与 [optuna](https://optuna.readthedocs.io/en/stable/index.html) 超参数调优工具一起使用。在 yaml 文件中设置好需要调整的参数和最大实验次数后,可以调用 Tree-structured Parzen Estimator(TPE) 算法进行自动化调参工具,效率高于网格调参法。
802688
@@ -865,7 +751,7 @@ hydra 的自动化实验功能可以与 [optuna](https://optuna.readthedocs.io/e
865751
1. 调优的参数需要与 yaml 文件中配置的参数名一致,如 `MODEL.num_layers`、`TRAIN.lr_scheduler.learning_rate`。
866752
2. 调优的参数范围根据不同语义进行指定,比如模型层数必须为整数,可以使用 `choice(...)` 设置有限范围,而学习率一般为浮点数,可以使用 `interval(...)` 设置其上下界。
867753
868-
3. 修改 viv.py,使得被 `@hydra.main` 装饰的 `main` 函数返回实验指标结果(高亮部分所示)
754+
3. 修改 viv.py,使得被 `@hydra.main` 装饰的 `main` 函数返回实验指标结果(高亮部分所示)
869755
870756
``` py title="viv.py" hl_lines="13 14 20 21"
871757
def train(cfg: DictConfig):
@@ -893,7 +779,7 @@ hydra 的自动化实验功能可以与 [optuna](https://optuna.readthedocs.io/e
893779
evaluate(cfg)
894780
```
895781
896-
4. 运行以下命令,开始自动调参
782+
4. 运行以下命令,开始自动化调优
897783
898784
``` sh
899785
python viv.py --multirun
@@ -911,6 +797,120 @@ best_value: 0.02460772916674614
911797
912798
更多详细信息以及多目标自动调优方法,可参考:[Optuna Sweeper plugin](https://hydra.cc/docs/plugins/optuna_sweeper/) 和 [Optuna](https://optuna.readthedocs.io/en/stable/)。
913799
800+
### 2.2 分布式训练
801+
802+
#### 2.2.1 数据并行
803+
804+
接下来以 `examples/pipe/poiseuille_flow.py` 为例,介绍如何正确使用 PaddleScience 的数据并行功能。分布式训练细节可以参考:[Paddle-使用指南-分布式训练-快速开始-数据并行](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/06_distributed_training/cluster_quick_start_collective_cn.html)。
805+
806+
1. 在 constraint 实例化完毕后,将 `ITERS_PER_EPOCH` 重新赋值为经过自动多卡数据切分后的 `dataloader` 的长度(一般情况下其长度等于单卡 dataloader 的长度除以卡数,向上取整),如代码中高亮行所示。
807+
808+
``` py linenums="146" title="examples/pipe/poiseuille_flow.py" hl_lines="22"
809+
ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE)
810+
811+
pde_constraint = ppsci.constraint.InteriorConstraint(
812+
equation["NavierStokes"].equations,
813+
{"continuity": 0, "momentum_x": 0, "momentum_y": 0},
814+
geom=interior_geom,
815+
dataloader_cfg={
816+
"dataset": "NamedArrayDataset",
817+
"num_workers": 1,
818+
"batch_size": BATCH_SIZE,
819+
"iters_per_epoch": ITERS_PER_EPOCH,
820+
"sampler": {
821+
"name": "BatchSampler",
822+
"shuffle": False,
823+
"drop_last": False,
824+
},
825+
},
826+
loss=ppsci.loss.MSELoss("mean"),
827+
evenly=True,
828+
name="EQ",
829+
)
830+
ITERS_PER_EPOCH = len(pde_constraint.data_loader) # re-assign to ITERS_PER_EPOCH
831+
832+
# wrap constraints together
833+
constraint = {pde_constraint.name: pde_constraint}
834+
835+
EPOCHS = 3000 if not args.epochs else args.epochs
836+
```
837+
838+
2. 使用分布式训练命令启动训练,以 4 卡数据并行训练为例
839+
840+
``` sh
841+
# 指定 0,1,2,3 张卡启动分布式数据并行训练
842+
export CUDA_VISIBLE_DEVICES=0,1,2,3
843+
python -m paddle.distributed.launch --gpus="0,1,2,3" poiseuille_flow.py
844+
```
845+
846+
<!-- #### 2.2.2 模型并行
847+
848+
TODO -->
849+
850+
### 2.3 自动混合精度训练
851+
852+
接下来介绍如何正确使用 PaddleScience 的自动混合精度功能。自动混合精度的原理可以参考:[Paddle-使用指南-性能调优-自动混合精度训练(AMP)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/performance_improving/amp_cn.html#amp)。
853+
854+
实例化 `Solver` 时加上 2 个参数: `use_amp=True`, `amp_level="O1"`(或`amp_level="O2"`)。如代码中高亮行所示,通过指定 `use_amp=True`,开启自动混合精度功能,接着再设置 `amp_level="O1"`,指定混合精度所用的模式,`O1` 为自动混合精度,`O2` 为更激进的纯 fp16 训练模式,一般推荐使用 `O1`。
855+
856+
``` py hl_lines="5 6"
857+
# initialize solver
858+
solver = ppsci.solver.Solver(
859+
...,
860+
...,
861+
use_amp=True,
862+
amp_level="O1", # or amp_level="O2"
863+
)
864+
```
865+
866+
### 2.4 梯度累加
867+
868+
接下来介绍如何正确使用 PaddleScience 的梯度累加功能。梯度累加的原理可以参考:[Paddle-使用指南-性能调优-自动混合精度训练(AMP)-动态图下使用梯度累加](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/performance_improving/amp_cn.html#dongtaituxiashiyongtiduleijia)。
869+
870+
实例化 `Solver` 时指定 `update_freq` 参数为大于 1 的正整数即可。如代码中高亮行所示,`update_freq` 可以设置为 2 或者更大的整数,推荐使用 248,此时对于训练任务来说,全局 `batch size` 等价于 `update_freq * batch size`。梯度累加方法在大多数场景中能够让间接地扩大每个 batch 内的样本数量,从而让每个 batch 分布更接近真实数据分布,提升训练任务的性能。
871+
872+
``` py hl_lines="5"
873+
# initialize solver
874+
solver = ppsci.solver.Solver(
875+
...,
876+
...,
877+
update_freq=2, # or 4, 8
878+
)
879+
```
880+
881+
### 2.5 多任务学习
882+
883+
在机理驱动、数理融合场景中,往往会同时优化多个损失项,如控制方程残差损失、(初)边值条件损失等。在训练过程中这些损失项对参数的梯度方向可能会互相冲突,阻碍训练精度收敛,而这正是多任务学习方法能解决的问题。因此 PaddleScience 在多任务学习模块中引入了几种常见的算法,其主要通过对不同任务的权重或产生的梯度进行调整,从而缓解该问题,最终提升模型收敛精度。下面以 [`Relobralo`](https://paddlescience-docs.readthedocs.io/zh/latest/zh/api/loss/mtl/#ppsci.loss.mtl.Relobralo) 算法进行举例,使用方式如下:
884+
885+
1. 实例化一个多任务学习方法的对象
886+
887+
``` py hl_lines="3"
888+
from ppsci.loss import mtl
889+
model = ...
890+
num_losses = 2 # number of losses to be optimized
891+
loss_aggregator = mtl.Relobralo(num_losses)
892+
```
893+
894+
2. 将该对象作为 `Solver` 的实例化参数之一传入
895+
896+
``` py hl_lines="4"
897+
solver = ppsci.solver.Solver(
898+
...,
899+
...,
900+
loss_aggregator=loss_aggregator,
901+
)
902+
```
903+
904+
3. 启动训练,训练过程中 `loss_aggregator` 会自动对获取到的多个损失项应用对应的多任务学习方法进行优化
905+
906+
``` py
907+
solver.train()
908+
```
909+
910+
!!! info "影响说明"
911+
912+
个别多任务学习方法(如weight based method)可能会改变**训练过程**中损失函数的计算方式,但仅限于影响训练过程,模型**评估过程**的损失计算方式保持不变。
913+
914914
## 3. 使用 Nsight 进行性能分析
915915
916916
Nsight是NVIDIA面相开发者提供的开发工具套件,能提供深入的跟踪、调试、评测和分析,以优化跨 NVIDIA GPU和CPU的复杂计算应用程序。详细文档可参考:[Nsight Systems Document](https://docs.nvidia.com/nsight-systems/index.html)

examples/fsi/viv.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ def evaluate(cfg: DictConfig):
168168
)
169169

170170
# evaluate
171-
l2_err_eval, _ = solver.eval()
172-
return l2_err_eval
171+
solver.eval()
173172
# visualize prediction
174173
solver.visualize()
175174

@@ -245,7 +244,7 @@ def inference(cfg: DictConfig):
245244
@hydra.main(version_base=None, config_path="./conf", config_name="viv.yaml")
246245
def main(cfg: DictConfig):
247246
if cfg.mode == "train":
248-
return train(cfg)
247+
train(cfg)
249248
elif cfg.mode == "eval":
250249
evaluate(cfg)
251250
elif cfg.mode == "export":

ppsci/arch/cuboid_transformer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ def __init__(
532532
("d", "d", "d"),
533533
],
534534
enc_shift_size: Tuple[Tuple[int, ...], ...] = [(0, 0, 0), (0, 0, 0)],
535-
enc_use_inter_ffn: str = True,
535+
enc_use_inter_ffn: bool = True,
536536
dec_depth: Tuple[int, ...] = [2, 2],
537537
dec_cross_start: int = 0,
538538
dec_self_attn_patterns: str = None,

ppsci/experimental/math_module.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def _resize_roots(
186186

187187
return points, h, n_per_dim
188188

189-
def _evaluate_integrand(fn, points, weights=None, fn_args=None) -> paddle.Tenosr:
189+
def _evaluate_integrand(fn, points, weights=None, fn_args=None) -> paddle.Tensor:
190190
"""Evaluate the integrand function at the passed points.
191191
192192
Args:
@@ -196,7 +196,7 @@ def _evaluate_integrand(fn, points, weights=None, fn_args=None) -> paddle.Tenosr
196196
fn_args (list or tuple, optional): Any arguments required by the function. Defaults to None.
197197
198198
Returns:
199-
paddle.Tenosr: Integral result.
199+
paddle.Tensor: Integral result.
200200
"""
201201
if fn_args is None:
202202
fn_args = ()

0 commit comments

Comments
 (0)