openvinotoolkit/openvino
Ver no GitHub[Good First Issue]: enable PIR format for PDPD FE
Open
#29.325 aberto em 7 de mar. de 2025
category: PDPD FEgood first issueno_stale
Métricas do repositório
- Stars
- (10.286 stars)
- Métricas de merge de PR
- (Mesclagem média 14d 3h) (305 fundiu PRs em 30d)
Description
Context
PaddlePaddle has enabled a new MLIR based format named PIR since 3.0 version. It is a new feature published on https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/paddle_v3_features/paddle_ir_cn.html [Chinese only].
Currently, OpenVINO has supported PDPD model by protobuf format models. New PIR format models should also be enabled in OpenVINO PDPD FE.
What needs to be done?
- read new PIR model(json)
- deserialize PIR model
- map the model description with weights
- translate the PIR model into node_context.
- add PIR tests
Example Pull Requests
Maybe you can refer to the draft PR https://github.com/openvinotoolkit/openvino/pull/29323.
- register the json for paddle
- import json.hpp header
- search
TODO PIRstring and try to implement or modify the relate functions.
Resources
- save PIR model from PDPD
currently, PIR feature needs PaddlePaddle 3.0 and beyond. You can install by
pip install paddlepaddle==3.0.0b2. You can turn on the PIR byexport FLAGS_enable_pir_api=1. This is a sample.
import paddle
import os
from paddle.vision.models import ResNet
from paddle.vision.models.resnet import BottleneckBlock
net = ResNet(BottleneckBlock, 50)
net = paddle.jit.to_static(net, full_graph=True)
# Check if FLAGS_enable_pir_api environment variable is set to 1
if os.getenv('FLAGS_enable_pir_api') == '1':
save_json = "./irs/resnet"
else:
save_json = "./pds/resnet"
input_spec = [paddle.static.InputSpec(shape=[1,3,224,224], dtype='float32')]
paddle.jit.save(net, save_json, input_spec)
loaded_model = paddle.jit.load(save_json)
program = loaded_model.program()
print("program is like:\n", program)
for block in program.keys:
for op in block.ops:
print("op type is {}.".format(op.name()))
- infer by OpenVINO.
import os
from openvino.runtime import Core
import pdb
if os.getenv('FLAGS_enable_pir_api') == '1':
paddle_model = "./irs/resnet.json"
else:
paddle_model = "./pds/resnet.pdmodel"
ie = Core()
print("paddle_model: {}".format(paddle_model))
pdb.set_trace()
ov_model = ie.read_model(paddle_model)
compiled_model = ie.compile_model(ov_model)
- PDPD reference
- deserialize json: https://github.com/PaddlePaddle/Paddle/blob/336a4ad0f5946ae602ea78eb2e3bc6e5d031591a/paddle/fluid/jit/serializer.cc#L49
- pir::Program class: https://github.com/PaddlePaddle/Paddle/blob/b51bef23ae3651e8c412822c55f3c54cacf3aab4/paddle/pir/include/core/program.h#L40
- info_map for deserialized results: https://github.com/PaddlePaddle/Paddle/blob/336a4ad0f5946ae602ea78eb2e3bc6e5d031591a/paddle/fluid/jit/serializer.cc#L66-L67
- design docs: https://github.com/PaddlePaddle/community/tree/master/pfcc/paddle-code-reading/IR_Dialect
- OpenVINO PDPD FE reference
- register format for frontend: https://github.com/openvinotoolkit/openvino/blob/master/src/frontends/common/src/manager.cpp#L139-L208
- read model api: https://github.com/openvinotoolkit/openvino/blob/06c3f20150439ef8eb5eeafa5b7f76521e8b911b/src/inference/src/model_reader.cpp#L110-L161
- pdmodel=>OpPlace=>node_context: https://github.com/openvinotoolkit/openvino/blob/master/src/frontends/paddle/src/input_model.cpp#L392-L422
- convert model: https://github.com/openvinotoolkit/openvino/blob/06c3f20150439ef8eb5eeafa5b7f76521e8b911b/src/frontends/paddle/src/frontend.cpp#L464
- make_ng_node: op_place => node_context: https://github.com/openvinotoolkit/openvino/blob/06c3f20150439ef8eb5eeafa5b7f76521e8b911b/src/frontends/paddle/src/frontend.cpp#L79
Contact points
@xczhai @liubo-intel @yuxu42
Ticket
No response