PaddleScience icon indicating copy to clipboard operation
PaddleScience copied to clipboard

【快乐开源】为 PaddleScience 案例添加 export 和 inference 功能

Open HydrogenSulfate opened this issue 1 year ago • 30 comments

This project will be mentored by @HydrogenSulfate and @xusuyong

以下是待添加模型导出和python推理功能的案例列表: 其中启航计划第5期可认领:1、8、10、19、28、34 题,共6题

序号 文档文件 案例文件 认领人/状态/PR号
1 deephpms.md deephpms/burgers.pydeephpms/korteweg_de_vries.pydeephpms/kuramoto_sivashinsky.pydeephpms/navier_stokes.pydeephpms/schrodinger.py  
2 deeponet.md operator_learning/deeponet.py  @liujun121533
@HydrogenSulfate #901
@essos-bot
3 euler_beam.md euler_beam/euler_beam.py  @GreatV #796
4 laplace2d.md laplace/laplace2d.py  @GreatV #797
5 lorenz.md lorenz/train_transformer.py  @GreatV #801
6 rossler.md rossler/train_transformer.py  @GreatV #803
7 volterra_ide.md ide/volterra_ide.py  @GreatV #807
8 amgnet.md amgnet/amgnet_airfoil.pyamgnet/amgnet_cylinder.py  @yangrongxinuser #1027
9 bubble.md bubble/bubble.py  @wufei2 #887
10 cfdgcn.md cfdgcn/cfdgcn.py  @yangrongxinuser #1026 #1037
11 cylinder2d_unsteady.md cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py  @wufei2 #883
12 cylinder2d_unsteady_transformer_physx.md cylinder/2d_unsteady/transformer_physx/train_transformer.py  @wufei2 #883
13 darcy2d.md darcy/darcy2d.py  @wufei2 #900
14 deepcfd.md deepcfd/deepcfd.py  @GoldenStain #994
15 ldc2d_steady.md ldc/ldc2d_steady_Re10.py  @wufei2 #875
16 ldc2d_unsteady.md ldc/ldc2d_unsteady_Re10.py  @wufei2 #875
17 labelfree_DNN_surrogate.md pipe/poiseuille_flow.py  @jincheng23
@yangrongxinuser
@PolaKuma #1030
18 ~~nsfnet.md~~ aneurysm/aneurysm_flow.py  
19 phycrnet.md phycrnet/main.py  @Sylence8 #1029
@fangfangssj
20 shock_wave.md shock_wave/shock_wave.py  @smallpoxscattered #890
21 tempoGAN.md tempoGAN/tempoGAN.py  @smallpoxscattered #884
22 nsfnet4.md nsfnet/VP_NSFNet4.py  @smallpoxscattered #864
23 viv.md fsi/viv.py  @smallpoxscattered #832
24 biharmonic2d.md biharmonic2d/biharmonic2d.py  @smallpoxscattered #858
25 bracket.md bracket/bracket.py  @1want2sleep #878
26 control_arm.md control_arm/forward_analysis.py  @smallpoxscattered #893
27 epnn.md control_arm/inverse_parameter.py  @smallpoxscattered #893
28 phylstm.md phylstm/phylstm2.pyphylstm/phylstm3.py  @jincheng23
@wwwuyan #1031
29 topopt.md topopt/topopt.py  @NKNaN #793
30 heat_exchanger.md heat_exchanger/heat_exchanger.py  @wufei2 #892
31 heat_pinn.md heat_pinn/heat_pinn.py  @1want2sleep #926
32 phygeonet.md phygeonet/heat_equation.pyphygeonet/heat_equation_with_bc.py  @yangrongxinuser
@ZHOU05030
@PolaKuma #1036
33 ~~hpinns.md~~ hpinns/holography.py  
34 fourcastnet.md fourcastnet/train_pretrain.pyfourcastnet/train_precip.pyfourcastnet/train_finetune.py  @mayiru1021
35 nowcastnet.md nowcastnet/nowcastnet.py @smallpoxscattered #895
@kineast

认领方式

请大家以 comment 的形式认领任务,如:

【报名】:1、3、12-13

多个任务之间需要使用中文顿号分隔,报名多个连续任务可用横线表示,如 2-5 PR 提交格式:在 PR 的标题中以 【PPSCI Export&Infer No.】 开头,注明任务编号

看板信息

任务方向 任务数量 提交作品 / 任务认领 提交率 完成 完成率
快乐开源 35 31 / 32 88.57% 27 77.14%

统计信息

排名不分先后 @HydrogenSulfate (1) @GreatV (5) @wufei2 (7) @GoldenStain (1) @PolaKuma (2) @smallpoxscattered (8) @1want2sleep (2) @NKNaN (1)

1. 背景

PaddleScience 套件为现有的 30+ 模型支持了一键训练、一键测试功能,但通过模型导出和python推理功能才能使得每个案例可以快速部署在各种设备上。

2. 收益

学习模型导出和python推理的基本流程,为案例代码添加模型导出和python推理功能

3. 开发流程

3.1 安装 PaddleScience

  1. 安装 Paddle:https://paddlescience-docs.readthedocs.io/zh/latest/zh/install_setup/#13-paddlepaddle
  2. 安装 PaddleScience(git 源码安装):https://paddlescience-docs.readthedocs.io/zh/latest/zh/install_setup/#__tabbed_1_1

3.2 代码开发

以为 aneurysm 案例添加模型导出和 python 推理函数为例

def export(cfg: DictConfig):
    # set model
    model = ppsci.arch.MLP(**cfg.MODEL)

    # initialize solver
    solver = ppsci.solver.Solver(
        model,
        pretrained_model_path=cfg.INFER.pretrained_model_path,
    )
    # export model
    from paddle.static import InputSpec

    input_spec = [
        {key: InputSpec([None, 1], "float32", name=key) for key in model.input_keys},
    ]
    solver.export(input_spec, cfg.INFER.export_path)
  1. 参考train/eval函数,以同样的方式实例化一个网络模型model,如果

  2. 实例化一个solver,传入model、预训练模型路径变量cfg.INFER.pretrained_model_path(该路径设置为案例文档开头“模型评估命令”的EVAL.pretrained_model_path后的url值即可,如下所示) image

  3. 根据modelforwrad函数接受的输入格式,构造同样格式的input_spec。aneurysm 的输入格式为{"x": Tensor, "y": Tensor, "z": Tensor},因此构造的input_spec为:{"x": InputSpec([None, 1], "float32", name="x"), "y": InputSpec([None, 1], "float32", name="y"), "z": InputSpec([None, 1], "float32", name="z")}

  4. 调用solver.export导出模型至cfg.INFER.export_path路径下,导出成功后会打印:Inference model has been exported to: ./inference/aneurysm, including *.pdmodel, *.pdiparams and *.pdiparams.info files. 至此模型导出函数export就完成了。接下来介绍如何撰写 python 推理代码inference函数

def inference(cfg: DictConfig):
    from deploy.python_infer import pinn_predictor

    predictor = pinn_predictor.PINNPredictor(cfg)
    eval_data_dict = reader.load_csv_file(
        cfg.EVAL_CSV_PATH,
        ("x", "y", "z", "u", "v", "w", "p"),
        {
            "x": "Points:0",
            "y": "Points:1",
            "z": "Points:2",
            "u": "U:0",
            "v": "U:1",
            "w": "U:2",
            "p": "p",
        },
    )
    input_dict = {
        "x": (eval_data_dict["x"] - cfg.CENTER[0]) * cfg.SCALE,
        "y": (eval_data_dict["y"] - cfg.CENTER[1]) * cfg.SCALE,
        "z": (eval_data_dict["z"] - cfg.CENTER[2]) * cfg.SCALE,
    }
    output_dict = predictor.predict(input_dict, cfg.INFER.batch_size)

    # mapping data to cfg.INFER.output_keys
    output_dict = {
        store_key: output_dict[infer_key]
        for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
    }

    ppsci.visualize.save_vtu_from_dict(
        "./aneurysm_pred.vtu",
        {**input_dict, **output_dict},
        input_dict.keys(),
        cfg.MODEL.output_keys,
    )
  1. 导入本模型对应的predictor,因为 aneurysm 的输入都是形状为[batch_size, channels]的Tensor,因此使用导入pinn_predictor即可;如果输入形状语义或者组织结构与之不同,则需要参照deploy/python_infer/pinn_predictor.pyPINNPredictor,写一个对应的XXXPredictor,再导入使用
  2. cfg为参数,实例化predictor
  3. 参考eval函数,构造输入数据input_dict
  4. 调用predictor.predict接受输入数据并推理得到输出output_dict
  5. 由于 python 推理的输出名字与原model的输出名字不同,因此需要将输出output_dict的键重新映射回正确的键上
  6. 参照eval函数,用保存/打印等方式记录推理输出output_dict 运行结果如下所示 image

如果在模型导出/推理时需要额外的超参数,则可以将这些超参数添加到案例对应 YAML 文件的 INFER 字段下,参考:https://github.com/PaddlePaddle/PaddleScience/pull/786/files#diff-1c33a8b95e9d0c72395763d5c906936652654533714e23211e2e2bb204d379f3R50-R55

3.3 文档添加 export&inference 运行命令

按照 3. 编写文档教程,安装文档渲染插件并渲染文档,用网页打开文档预览链接。

aneurysm.md文档为例,添加红框内两处文本即可 image

添加后文档渲染结果如下所示

image image

3.4 整理代码并提交PR

参考 PaddleScience文档-贡献指南-整理代码并提交

4. 参考资料

  • https://github.com/PaddlePaddle/PaddleScience/pull/773
  • https://github.com/PaddlePaddle/PaddleScience/pull/786

HydrogenSulfate avatar Feb 26 '24 09:02 HydrogenSulfate

【报名】:2

essos-bot avatar Feb 27 '24 03:02 essos-bot

【报名】:29

NKNaN avatar Feb 28 '24 08:02 NKNaN

【报名】:3

GreatV avatar Mar 04 '24 06:03 GreatV

【报名】:4

GreatV avatar Mar 05 '24 02:03 GreatV

【报名】:5

GreatV avatar Mar 07 '24 15:03 GreatV

【报名】:6

GreatV avatar Mar 11 '24 05:03 GreatV

【报名】:7

GreatV avatar Mar 15 '24 04:03 GreatV

【报名】:23

smallpoxscattered avatar Apr 01 '24 05:04 smallpoxscattered

【报名】:25

1want2sleep avatar Apr 12 '24 07:04 1want2sleep

【报名】:24

smallpoxscattered avatar Apr 21 '24 12:04 smallpoxscattered

【报名】:22

smallpoxscattered avatar Apr 22 '24 14:04 smallpoxscattered

【报名】:33

WoWYoYLoL avatar Apr 28 '24 04:04 WoWYoYLoL

【报名】:15-16

wufei2 avatar May 02 '24 08:05 wufei2

【报名】:31

1want2sleep avatar May 08 '24 06:05 1want2sleep

【报名】:11-12

wufei2 avatar May 08 '24 07:05 wufei2

【报名】:21

smallpoxscattered avatar May 08 '24 11:05 smallpoxscattered

【报名】:9

wufei2 avatar May 11 '24 09:05 wufei2

【报名】:20

smallpoxscattered avatar May 11 '24 14:05 smallpoxscattered

【报名】:30

wufei2 avatar May 12 '24 11:05 wufei2

【报名】:26-27

smallpoxscattered avatar May 12 '24 13:05 smallpoxscattered

【报名】:13

wufei2 avatar May 15 '24 09:05 wufei2

【报名】:1、14

GoldenStain avatar Sep 15 '24 08:09 GoldenStain