Skip to content

Commit 91dadab

Browse files
add export&infer 26-27 (#893)
1 parent 8d28e58 commit 91dadab

File tree

5 files changed

+244
-2
lines changed

5 files changed

+244
-2
lines changed

docs/zh/examples/control_arm.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,42 @@
4646
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
4747
```
4848

49+
=== "模型导出命令"
50+
51+
=== "正问题:受力分析求解"
52+
53+
``` sh
54+
python forward_analysis.py mode=export
55+
```
56+
57+
=== "逆问题:参数逆推求解"
58+
59+
``` sh
60+
python inverse_parameter.py mode=export
61+
```
62+
63+
=== "模型推理命令"
64+
65+
=== "正问题:受力分析求解"
66+
67+
``` sh
68+
# linux
69+
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl -P ./datasets/
70+
# windows
71+
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl --output ./datasets/control_arm.stl
72+
python forward_analysis.py mode=infer
73+
```
74+
75+
=== "逆问题:参数逆推求解"
76+
77+
``` sh
78+
# linux
79+
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl -P ./datasets/
80+
# windows
81+
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/control_arm/control_arm.stl --output ./datasets/control_arm.stl
82+
python inverse_parameter.py mode=infer
83+
```
84+
4985
| 预训练模型 | 指标 |
5086
|:--| :--|
5187
| [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<br>L2Rel.lambda_(geo_eval): 0.06025<br>L2Rel.mu(geo_eval): 0.07949 |

examples/control_arm/conf/forward_analysis.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ hydra:
1111
- TRAIN.checkpoint_path
1212
- TRAIN.pretrained_model_path
1313
- EVAL.pretrained_model_path
14+
- INFER.pretrained_model_path
15+
- INFER.export_path
1416
- mode
1517
- output_dir
1618
- log_freq
@@ -87,3 +89,21 @@ TRAIN:
8789
EVAL:
8890
eval_with_no_grad: true
8991
pretrained_model_path: null
92+
93+
94+
INFER:
95+
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/forward_x_axis_pretrained.pdparams
96+
export_path: ./inference/forward_analysis
97+
pdmodel_path: ${INFER.export_path}.pdmodel
98+
pdiparams_path: ${INFER.export_path}.pdiparams
99+
device: gpu
100+
engine: native
101+
precision: fp32
102+
onnx_path: ${INFER.export_path}.onnx
103+
ir_optim: true
104+
min_subgraph_size: 10
105+
gpu_mem: 4000
106+
gpu_id: 0
107+
max_batch_size: 128
108+
num_cpu_threads: 4
109+
batch_size: 64

examples/control_arm/conf/inverse_parameter.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ hydra:
1111
- TRAIN.checkpoint_path
1212
- TRAIN.pretrained_model_path
1313
- EVAL.pretrained_model_path
14+
- INFER.pretrained_model_path
15+
- INFER.export_path
1416
- mode
1517
- output_dir
1618
- log_freq
@@ -99,3 +101,20 @@ EVAL:
99101
batch_size:
100102
validator: 1024
101103
visualizer_vtu: 100000
104+
105+
INFER:
106+
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/control_arm/inverse_x_axis_pretrained.pdparams
107+
export_path: ./inference/inverse_parameter
108+
pdmodel_path: ${INFER.export_path}.pdmodel
109+
pdiparams_path: ${INFER.export_path}.pdiparams
110+
device: gpu
111+
engine: native
112+
precision: fp32
113+
onnx_path: ${INFER.export_path}.onnx
114+
ir_optim: true
115+
min_subgraph_size: 10
116+
gpu_mem: 4000
117+
gpu_id: 0
118+
max_batch_size: 128
119+
num_cpu_threads: 4
120+
batch_size: 64

examples/control_arm/forward_analysis.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,81 @@ def evaluate(cfg: DictConfig):
281281
solver.visualize()
282282

283283

284+
def export(cfg: DictConfig):
285+
from paddle.static import InputSpec
286+
287+
# set model
288+
disp_net = ppsci.arch.MLP(**cfg.MODEL.disp_net)
289+
stress_net = ppsci.arch.MLP(**cfg.MODEL.stress_net)
290+
# wrap to a model_list
291+
model_list = ppsci.arch.ModelList((disp_net, stress_net))
292+
293+
# load pretrained model
294+
solver = ppsci.solver.Solver(
295+
model=model_list, pretrained_model_path=cfg.INFER.pretrained_model_path
296+
)
297+
298+
# export models
299+
input_spec = [
300+
{
301+
key: InputSpec([None, 1], "float32", name=key)
302+
for key in cfg.MODEL.disp_net.input_keys
303+
},
304+
]
305+
solver.export(input_spec, cfg.INFER.export_path)
306+
307+
308+
def inference(cfg: DictConfig):
309+
from deploy.python_infer import pinn_predictor
310+
from ppsci.visualize import vtu
311+
312+
# set model predictor
313+
predictor = pinn_predictor.PINNPredictor(cfg)
314+
315+
# set geometry
316+
control_arm = ppsci.geometry.Mesh(cfg.GEOM_PATH)
317+
# geometry bool operation
318+
geo = control_arm
319+
geom = {"geo": geo}
320+
# set bounds
321+
BOUNDS_X, BOUNDS_Y, BOUNDS_Z = control_arm.bounds
322+
323+
# set visualizer(optional)
324+
# add inferencer data
325+
samples = geom["geo"].sample_interior(
326+
cfg.TRAIN.batch_size.visualizer_vtu,
327+
criteria=lambda x, y, z: (
328+
(BOUNDS_X[0] < x)
329+
& (x < BOUNDS_X[1])
330+
& (BOUNDS_Y[0] < y)
331+
& (y < BOUNDS_Y[1])
332+
& (BOUNDS_Z[0] < z)
333+
& (z < BOUNDS_Z[1])
334+
),
335+
)
336+
pred_input_dict = {
337+
k: v for k, v in samples.items() if k in cfg.MODEL.disp_net.input_keys
338+
}
339+
340+
output_dict = predictor.predict(pred_input_dict, cfg.INFER.batch_size)
341+
342+
# mapping data to output_keys
343+
output_keys = cfg.MODEL.disp_net.output_keys + cfg.MODEL.stress_net.output_keys
344+
output_dict = {
345+
store_key: output_dict[infer_key]
346+
for store_key, infer_key in zip(output_keys, output_dict.keys())
347+
}
348+
output_dict.update(pred_input_dict)
349+
350+
vtu.save_vtu_from_dict(
351+
osp.join(cfg.output_dir, "vis"),
352+
output_dict,
353+
cfg.MODEL.disp_net.input_keys,
354+
output_keys,
355+
1,
356+
)
357+
358+
284359
@hydra.main(
285360
version_base=None, config_path="./conf", config_name="forward_analysis.yaml"
286361
)
@@ -289,8 +364,14 @@ def main(cfg: DictConfig):
289364
train(cfg)
290365
elif cfg.mode == "eval":
291366
evaluate(cfg)
367+
elif cfg.mode == "export":
368+
export(cfg)
369+
elif cfg.mode == "infer":
370+
inference(cfg)
292371
else:
293-
raise ValueError(f"cfg.mode should in ['train', 'eval'], but got '{cfg.mode}'")
372+
raise ValueError(
373+
f"cfg.mode should in ['train', 'eval', 'export', 'infer'], but got '{cfg.mode}'"
374+
)
294375

295376

296377
if __name__ == "__main__":

examples/control_arm/inverse_parameter.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,86 @@ def evaluate(cfg: DictConfig):
265265
solver.visualize()
266266

267267

268+
def export(cfg: DictConfig):
269+
from paddle.static import InputSpec
270+
271+
# set model
272+
disp_net = ppsci.arch.MLP(**cfg.MODEL.disp_net)
273+
stress_net = ppsci.arch.MLP(**cfg.MODEL.stress_net)
274+
inverse_lambda_net = ppsci.arch.MLP(**cfg.MODEL.inverse_lambda_net)
275+
inverse_mu_net = ppsci.arch.MLP(**cfg.MODEL.inverse_mu_net)
276+
# wrap to a model_list
277+
model = ppsci.arch.ModelList(
278+
(disp_net, stress_net, inverse_lambda_net, inverse_mu_net)
279+
)
280+
281+
# load pretrained model
282+
solver = ppsci.solver.Solver(
283+
model=model, pretrained_model_path=cfg.INFER.pretrained_model_path
284+
)
285+
286+
# export models
287+
input_spec = [
288+
{
289+
key: InputSpec([None, 1], "float32", name=key)
290+
for key in cfg.MODEL.disp_net.input_keys
291+
},
292+
]
293+
solver.export(input_spec, cfg.INFER.export_path)
294+
295+
296+
def inference(cfg: DictConfig):
297+
from deploy.python_infer import pinn_predictor
298+
from ppsci.visualize import vtu
299+
300+
# set model predictor
301+
predictor = pinn_predictor.PINNPredictor(cfg)
302+
303+
# set geometry
304+
control_arm = ppsci.geometry.Mesh(cfg.GEOM_PATH)
305+
# geometry bool operation
306+
geo = control_arm
307+
geom = {"geo": geo}
308+
# set bounds
309+
BOUNDS_X, BOUNDS_Y, BOUNDS_Z = control_arm.bounds
310+
samples = geom["geo"].sample_interior(
311+
cfg.EVAL.batch_size.visualizer_vtu,
312+
criteria=lambda x, y, z: (
313+
(BOUNDS_X[0] < x)
314+
& (x < BOUNDS_X[1])
315+
& (BOUNDS_Y[0] < y)
316+
& (y < BOUNDS_Y[1])
317+
& (BOUNDS_Z[0] < z)
318+
& (z < BOUNDS_Z[1])
319+
),
320+
)
321+
pred_input_dict = {
322+
k: v for k, v in samples.items() if k in cfg.MODEL.disp_net.input_keys
323+
}
324+
325+
output_dict = predictor.predict(pred_input_dict, cfg.INFER.batch_size)
326+
327+
# mapping data to output_keys
328+
output_keys = (
329+
cfg.MODEL.disp_net.output_keys
330+
+ cfg.MODEL.stress_net.output_keys
331+
+ cfg.MODEL.inverse_lambda_net.output_keys
332+
+ cfg.MODEL.inverse_mu_net.output_keys
333+
)
334+
output_dict = {
335+
store_key: output_dict[infer_key]
336+
for store_key, infer_key in zip(output_keys, output_dict.keys())
337+
}
338+
output_dict.update(pred_input_dict)
339+
vtu.save_vtu_from_dict(
340+
osp.join(cfg.output_dir, "vis"),
341+
output_dict,
342+
cfg.MODEL.disp_net.input_keys,
343+
output_keys,
344+
1,
345+
)
346+
347+
268348
@hydra.main(
269349
version_base=None, config_path="./conf", config_name="inverse_parameter.yaml"
270350
)
@@ -273,8 +353,14 @@ def main(cfg: DictConfig):
273353
train(cfg)
274354
elif cfg.mode == "eval":
275355
evaluate(cfg)
356+
elif cfg.mode == "export":
357+
export(cfg)
358+
elif cfg.mode == "infer":
359+
inference(cfg)
276360
else:
277-
raise ValueError(f"cfg.mode should in ['train', 'eval'], but got '{cfg.mode}'")
361+
raise ValueError(
362+
f"cfg.mode should in ['train', 'eval', 'export', 'infer'], but got '{cfg.mode}'"
363+
)
278364

279365

280366
if __name__ == "__main__":

0 commit comments

Comments
 (0)