diff --git a/docs/zh/examples/control_arm.md b/docs/zh/examples/control_arm.md index da555b95d..530a91742 100644 --- a/docs/zh/examples/control_arm.md +++ b/docs/zh/examples/control_arm.md @@ -46,6 +46,42 @@ python inverse_parameter.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/inverse_x_axis_pretrained.pdparams ``` +=== "模型导出命令" + + === "正问题:受力分析求解" + + ``` sh + python forward_analysis.py mode=export + ``` + + === "逆问题:参数逆推求解" + + ``` sh + python inverse_parameter.py mode=export + ``` + +=== "模型推理命令" + + === "正问题:受力分析求解" + + ``` sh + # linux + wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl -P ./datasets/ + # windows + # curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl --output ./datasets/control_arm.stl + python forward_analysis.py mode=infer + ``` + + === "逆问题:参数逆推求解" + + ``` sh + # linux + wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl -P ./datasets/ + # windows + # curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl --output ./datasets/control_arm.stl + python inverse_parameter.py mode=infer + ``` + | 预训练模型 | 指标 | |:--| :--| | [inverse_x_axis_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/inverse_x_axis_pretrained.pdparams) | loss(geo_eval): 0.02505
L2Rel.lambda_(geo_eval): 0.06025
L2Rel.mu(geo_eval): 0.07949 | diff --git a/examples/control_arm/conf/forward_analysis.yaml b/examples/control_arm/conf/forward_analysis.yaml index 131644820..36af28f44 100644 --- a/examples/control_arm/conf/forward_analysis.yaml +++ b/examples/control_arm/conf/forward_analysis.yaml @@ -11,6 +11,8 @@ hydra: - TRAIN.checkpoint_path - TRAIN.pretrained_model_path - EVAL.pretrained_model_path + - INFER.pretrained_model_path + - INFER.export_path - mode - output_dir - log_freq @@ -87,3 +89,21 @@ TRAIN: EVAL: eval_with_no_grad: true pretrained_model_path: null + + +INFER: + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/forward_x_axis_pretrained.pdparams + export_path: ./inference/forward_analysis + pdmodel_path: ${INFER.export_path}.pdmodel + pdiparams_path: ${INFER.export_path}.pdiparams + device: gpu + engine: native + precision: fp32 + onnx_path: ${INFER.export_path}.onnx + ir_optim: true + min_subgraph_size: 10 + gpu_mem: 4000 + gpu_id: 0 + max_batch_size: 128 + num_cpu_threads: 4 + batch_size: 64 diff --git a/examples/control_arm/conf/inverse_parameter.yaml b/examples/control_arm/conf/inverse_parameter.yaml index 31ecebaa3..374492912 100644 --- a/examples/control_arm/conf/inverse_parameter.yaml +++ b/examples/control_arm/conf/inverse_parameter.yaml @@ -11,6 +11,8 @@ hydra: - TRAIN.checkpoint_path - TRAIN.pretrained_model_path - EVAL.pretrained_model_path + - INFER.pretrained_model_path + - INFER.export_path - mode - output_dir - log_freq @@ -99,3 +101,20 @@ EVAL: batch_size: validator: 1024 visualizer_vtu: 100000 + +INFER: + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/inverse_x_axis_pretrained.pdparams + export_path: ./inference/inverse_parameter + pdmodel_path: ${INFER.export_path}.pdmodel + pdiparams_path: ${INFER.export_path}.pdiparams + device: gpu + engine: native + precision: fp32 + onnx_path: ${INFER.export_path}.onnx + ir_optim: true + min_subgraph_size: 10 + gpu_mem: 4000 + gpu_id: 0 + max_batch_size: 128 + num_cpu_threads: 4 + batch_size: 64 diff --git a/examples/control_arm/forward_analysis.py b/examples/control_arm/forward_analysis.py index c8fe365be..31f138b6f 100644 --- a/examples/control_arm/forward_analysis.py +++ b/examples/control_arm/forward_analysis.py @@ -281,6 +281,81 @@ def evaluate(cfg: DictConfig): solver.visualize() +def export(cfg: DictConfig): + from paddle.static import InputSpec + + # set model + disp_net = ppsci.arch.MLP(**cfg.MODEL.disp_net) + stress_net = ppsci.arch.MLP(**cfg.MODEL.stress_net) + # wrap to a model_list + model_list = ppsci.arch.ModelList((disp_net, stress_net)) + + # load pretrained model + solver = ppsci.solver.Solver( + model=model_list, pretrained_model_path=cfg.INFER.pretrained_model_path + ) + + # export models + input_spec = [ + { + key: InputSpec([None, 1], "float32", name=key) + for key in cfg.MODEL.disp_net.input_keys + }, + ] + solver.export(input_spec, cfg.INFER.export_path) + + +def inference(cfg: DictConfig): + from deploy.python_infer import pinn_predictor + from ppsci.visualize import vtu + + # set model predictor + predictor = pinn_predictor.PINNPredictor(cfg) + + # set geometry + control_arm = ppsci.geometry.Mesh(cfg.GEOM_PATH) + # geometry bool operation + geo = control_arm + geom = {"geo": geo} + # set bounds + BOUNDS_X, BOUNDS_Y, BOUNDS_Z = control_arm.bounds + + # set visualizer(optional) + # add inferencer data + samples = geom["geo"].sample_interior( + cfg.TRAIN.batch_size.visualizer_vtu, + criteria=lambda x, y, z: ( + (BOUNDS_X[0] < x) + & (x < BOUNDS_X[1]) + & (BOUNDS_Y[0] < y) + & (y < BOUNDS_Y[1]) + & (BOUNDS_Z[0] < z) + & (z < BOUNDS_Z[1]) + ), + ) + pred_input_dict = { + k: v for k, v in samples.items() if k in cfg.MODEL.disp_net.input_keys + } + + output_dict = predictor.predict(pred_input_dict, cfg.INFER.batch_size) + + # mapping data to output_keys + output_keys = cfg.MODEL.disp_net.output_keys + cfg.MODEL.stress_net.output_keys + output_dict = { + store_key: output_dict[infer_key] + for store_key, infer_key in zip(output_keys, output_dict.keys()) + } + output_dict.update(pred_input_dict) + + vtu.save_vtu_from_dict( + osp.join(cfg.output_dir, "vis"), + output_dict, + cfg.MODEL.disp_net.input_keys, + output_keys, + 1, + ) + + @hydra.main( version_base=None, config_path="./conf", config_name="forward_analysis.yaml" ) @@ -289,8 +364,14 @@ def main(cfg: DictConfig): train(cfg) elif cfg.mode == "eval": evaluate(cfg) + elif cfg.mode == "export": + export(cfg) + elif cfg.mode == "infer": + inference(cfg) else: - raise ValueError(f"cfg.mode should in ['train', 'eval'], but got '{cfg.mode}'") + raise ValueError( + f"cfg.mode should in ['train', 'eval', 'export', 'infer'], but got '{cfg.mode}'" + ) if __name__ == "__main__": diff --git a/examples/control_arm/inverse_parameter.py b/examples/control_arm/inverse_parameter.py index 9e2a43be2..77f17c416 100644 --- a/examples/control_arm/inverse_parameter.py +++ b/examples/control_arm/inverse_parameter.py @@ -265,6 +265,86 @@ def evaluate(cfg: DictConfig): solver.visualize() +def export(cfg: DictConfig): + from paddle.static import InputSpec + + # set model + disp_net = ppsci.arch.MLP(**cfg.MODEL.disp_net) + stress_net = ppsci.arch.MLP(**cfg.MODEL.stress_net) + inverse_lambda_net = ppsci.arch.MLP(**cfg.MODEL.inverse_lambda_net) + inverse_mu_net = ppsci.arch.MLP(**cfg.MODEL.inverse_mu_net) + # wrap to a model_list + model = ppsci.arch.ModelList( + (disp_net, stress_net, inverse_lambda_net, inverse_mu_net) + ) + + # load pretrained model + solver = ppsci.solver.Solver( + model=model, pretrained_model_path=cfg.INFER.pretrained_model_path + ) + + # export models + input_spec = [ + { + key: InputSpec([None, 1], "float32", name=key) + for key in cfg.MODEL.disp_net.input_keys + }, + ] + solver.export(input_spec, cfg.INFER.export_path) + + +def inference(cfg: DictConfig): + from deploy.python_infer import pinn_predictor + from ppsci.visualize import vtu + + # set model predictor + predictor = pinn_predictor.PINNPredictor(cfg) + + # set geometry + control_arm = ppsci.geometry.Mesh(cfg.GEOM_PATH) + # geometry bool operation + geo = control_arm + geom = {"geo": geo} + # set bounds + BOUNDS_X, BOUNDS_Y, BOUNDS_Z = control_arm.bounds + samples = geom["geo"].sample_interior( + cfg.EVAL.batch_size.visualizer_vtu, + criteria=lambda x, y, z: ( + (BOUNDS_X[0] < x) + & (x < BOUNDS_X[1]) + & (BOUNDS_Y[0] < y) + & (y < BOUNDS_Y[1]) + & (BOUNDS_Z[0] < z) + & (z < BOUNDS_Z[1]) + ), + ) + pred_input_dict = { + k: v for k, v in samples.items() if k in cfg.MODEL.disp_net.input_keys + } + + output_dict = predictor.predict(pred_input_dict, cfg.INFER.batch_size) + + # mapping data to output_keys + output_keys = ( + cfg.MODEL.disp_net.output_keys + + cfg.MODEL.stress_net.output_keys + + cfg.MODEL.inverse_lambda_net.output_keys + + cfg.MODEL.inverse_mu_net.output_keys + ) + output_dict = { + store_key: output_dict[infer_key] + for store_key, infer_key in zip(output_keys, output_dict.keys()) + } + output_dict.update(pred_input_dict) + vtu.save_vtu_from_dict( + osp.join(cfg.output_dir, "vis"), + output_dict, + cfg.MODEL.disp_net.input_keys, + output_keys, + 1, + ) + + @hydra.main( version_base=None, config_path="./conf", config_name="inverse_parameter.yaml" ) @@ -273,8 +353,14 @@ def main(cfg: DictConfig): train(cfg) elif cfg.mode == "eval": evaluate(cfg) + elif cfg.mode == "export": + export(cfg) + elif cfg.mode == "infer": + inference(cfg) else: - raise ValueError(f"cfg.mode should in ['train', 'eval'], but got '{cfg.mode}'") + raise ValueError( + f"cfg.mode should in ['train', 'eval', 'export', 'infer'], but got '{cfg.mode}'" + ) if __name__ == "__main__":