@@ -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 或者更大的整数,推荐使用 2 、4 、8 ,此时对于训练任务来说,全局 `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
801687hydra 的自动化实验功能可以与 [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 或者更大的整数,推荐使用 2 、4 、8 ,此时对于训练任务来说,全局 `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
916916Nsight是NVIDIA面相开发者提供的开发工具套件,能提供深入的跟踪、调试、评测和分析,以优化跨 NVIDIA GPU和CPU的复杂计算应用程序。详细文档可参考:[Nsight Systems Document](https://docs.nvidia.com/nsight-systems/index.html)
0 commit comments