paddle模型转onnx介绍(以utc-mini为例)

1、paddle到onnx转换命令

python 复制代码
paddle2onnx --model_dir /opt/utc/models/checkpoint_utc-mini/ --model_filename model.pdmodel --params_filename model.pdiparams --save_file /opt/utc/models/checkpoint_utc-mini/onnx/model.onnx --enable_dev_version True --opset_version 13 --enable_onnx_checker True

2、测试验证

python 复制代码
# -*- coding: utf-8 -*-
"""
    paddle -> onnx
"""
import os

from paddle.static import InputSpec

import paddle2onnx


def func_onnx_test_valid(onnx_model_path):
    """ (1) 检查 ONNX 模型的有效性
        可以使用如下脚本验证导出的 ONNX 模型是否合理,包括检查模型的版本、图的结构、节点及其输入和输出。
        如下脚本的输出为 None 则表示模型转换正确。
    """
    # 导入 ONNX 库
    import onnx

    # 载入 ONNX 模型
    onnx_model = onnx.load(onnx_model_path)

    # 使用 ONNX 库检查 ONNX 模型是否合理
    check = onnx.checker.check_model(onnx_model)

    # 打印检查结果
    print('check: ', check)

    pass


def func_onnx_test_match(onnx_model_path, paddle_model_path):
    """ 验证模型是否匹配
        验证原始的飞桨模型和导出的 ONNX 模型是否有相同的计算结果。
    """
    # 导入所需的库
    import numpy as np
    import onnxruntime
    import paddle

    def input_generate():
        # 准备输入数据
        batch_size = 1
        max_seq_length = 128  # 假设最大序列长度为 128

        # 生成示例输入数据
        input_ids = np.random.randint(0, 10000, (batch_size, max_seq_length)).astype('int64')
        token_type_ids = np.zeros((batch_size, max_seq_length), dtype='int64')
        position_ids = np.arange(max_seq_length).reshape(1, -1).repeat(batch_size, axis=0).astype('int64')
        attention_mask = np.ones((batch_size, 1, max_seq_length, max_seq_length), dtype='float32')
        omask_positions = np.array([[10, 20]]).astype('int64')  # 假设 omask_positions 为 [10, 20]
        cls_positions = np.array([0]).astype('int64')  # 假设 cls_positions 为 [0]

        # 准备输入字典
        ort_inputs = {
            'input_ids': input_ids,
            'token_type_ids': token_type_ids,
            'position_ids': position_ids,
            'attention_mask': attention_mask,
            'omask_positions': omask_positions,
            'cls_positions': cls_positions
        }

        return ort_inputs

    print("------------------------ ONNX -----------------------------")
    # predict by ONNXRuntime
    ort_sess = onnxruntime.InferenceSession(onnx_model_path, providers=['CPUExecutionProvider'])

    # 获取输入和输出名称
    input_names = [input.name for input in ort_sess.get_inputs()]
    output_names = [output.name for output in ort_sess.get_outputs()]
    # 打印输入和输出名称
    print("Input names:", input_names)
    print("Output names:", output_names)

    # 获取输入数据
    ort_inputs = input_generate()

    # 运行模型
    ort_outs = ort_sess.run(None, ort_inputs)
    print("ONNX Outputs: \n", ort_outs)
    print("Exported model has been predicted by ONNXRuntime!")
    print("------------------------ ONNX -----------------------------")

    pass


if __name__ == '__main__':

    # paddle 模型保存目录及文件路径
    model_dir_paddle = '/opt/utc/models/checkpoint_utc-mini/'

    # onnx 保存目录及文件路径
    model_dir_onnx = model_dir_paddle + "onnx/"
    os.makedirs(model_dir_onnx, exist_ok=True)
    onnx_model_path = model_dir_onnx + 'model.onnx'

    # (1) 检查 ONNX 模型的有效性
    func_onnx_test_valid(onnx_model_path)
    # (2) 验证模型是否匹配
    func_onnx_test_match(onnx_model_path)

    print("done.")
    pass
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬5 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114245 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠5 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好6 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力6 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo6 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_6 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能