0

0

Paddle2.0:使用动转静完成模型部署

P粉084495128

P粉084495128

发布时间:2025-07-21 10:41:28

|

892人浏览过

|

来源于php中文网

原创

本文介绍Paddle2.0动转静功能,能兼顾动态图调试方便与静态图部署高效的优势。通过实例展示动态图转静态图、导出推理模型及部署过程,并测试不同部署方式的效率。在CPU平台用U2Netp模型测试,动态图耗时2.1827s,而动转静结合PaddleInference与mkldnn仅需0.5750s,还含完整操作步骤。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

paddle2.0:使用动转静完成模型部署 - php中文网

引入

  • 动态图方便调试,静态图方便部署,各有各的优点,该选啥呢?
  • 你是不是还在纠结上面的问题,小孩子才做选择,大人表示我全都要
  • 通过Paddle2.0的动转静功能,就能比较完美的兼顾这两者的优势
  • 实现用动态图进行训练调试,训练完成后使用静态图模型进行部署
  • 这么好的功能,还不赶紧学起来!

项目说明

  • 本项目将通过一个实例来展示如何将一个动态图模型转换至静态图
  • 并且通过导出的推理模型来完成模型的部署
  • 并测试不同方式下的模型运行效率

动态图vs静态图

  • 首先介绍一下这两者的区别:
    • 静态图:计算之前先构建计算图,然后按照计算图进行计算,运行效率高,但调试比较麻烦
    • 动态图:计算的同时构建计算图,运行效率稍低,但是调试方便

运行速度对比

  • 通过实测,在AIStudio的CPU平台上,不同方式部署的速度如下表
  • 使用的模型为U2Netp
  • 测试使用的输入均为Batch size为1的320*320分辨率的三通道数据
  • 均测量第二次运行时的消耗时间
  • 通过内置计时测量,结果可能存在些许误差
动态图 动转静(paddle.jit.load) 动转静(PaddleInference) 动转静(PaddleInference+mkldnn)
2.1827 s 1.9110 s 1.8756 s 0.5750 s

动态图模型

  • 对于一个训练完成的动态图模型,一般由如下几个部分组成:
    • 模型代码——用于构建模型
    • 模型参数文件——用于保存模型参数
  • 所以加载一个动态图模型一般如下几步:
    • 实例化模型
    • 加载模型参数
    • 根据需要切换模型状态
  • 下面就通过实例讲解一下如何使用动态图模型实现模型预测
In [1]
# 模型预测import osimport timeimport paddle# 从模型代码中导入模型from u2net import U2NETP# 实例化模型model = U2NETP()# 加载预训练模型参数model.set_dict(paddle.load('data/data64051/u2netp.pdparams'))# 将模型设置为评估状态model.eval()

x = paddle.randn([1, 3, 320, 320])# 模型预测# 作为演示这里使用随机数作为输入d0, _, _, _, _, _, _ = model(x)# 打印输出的形状print(d0.shape)
       
[1, 1, 320, 320]
       
In [2]
# 计算预测时间start = time.time()
out = model(x)
end = time.time()print('predict time: %.04f s' % (end - start))
       
predict time: 2.3866 s
       

模型动转静

  • 在Paddle2.0中,通过paddle.jit.to_static即可快速的将模型转换为静态图模型
  • 只需要简单的加上几行代码,就能完成转换
  • 而且转换之后可以直接像使用动态图模型那样使用
  • 不仅非常方便,而且运行速度也会有一定的提升
  • 下面就通过实际的代码和速度测试感受一下吧
In [4]
# 定义输入数据input_spec = paddle.static.InputSpec([None, 3, 320, 320], 'float32', 'image')# 动态图转静态图model = paddle.jit.to_static(model, input_spec=[input_spec])# 模型预测# 作为演示这里使用随机数作为输入d0, _, _, _, _, _, _ = model(x)# 打印输出的形状print(d0.shape)
       
[1, 1, 320, 320]
       
In [5]
# 计算预测时间start = time.time()
out = model(x)
end = time.time()print('predict time: %.04f s' % (end - start))
       
predict time: 1.9833 s
       

静态图模型保存

  • 除了直接使用转换完成的静态图模型之外
  • 当然也是可以将转换后的模型进行保存的
  • 保存的方法也非常简单,只需要调用Paddle.jit.save()即可
  • 存储的模型结构如下:
    • .pdmodel:Program 文件
    • .pdiparams:存储的持久参数变量文件
    • .pdiparams.info 存储一些变量描述信息至文件,这些额外的信息将在fine-tune训练中使用
  • 接下来还是看代码实际演示一下吧
In [6]
# 保存推理模型paddle.jit.save(model, 'inference_models/u2netp')# 打印保存的模型文件名print(os.listdir('inference_models'))
       
['u2netp.pdiparams.info', 'u2netp.pdiparams', 'u2netp.pdmodel']
       

模型可视化

  • 通过VisualDL工具可以轻松的进行模型结构的可视化查看

  • 在AIStudio平台上使用就更加方便了,点击右侧可视化

  • 选择刚才保存后缀为.pdmodel的模型文件

    小羊标书
    小羊标书

    一键生成百页标书,让投标更简单高效

    下载
  • 然后启动服务即可查看模型的计算图结构了

  • 具体的可视化图像就像下图所示的那样:

    Paddle2.0:使用动转静完成模型部署 - php中文网                

静态图模型加载

  • 加载这样的保存的模型也是非常简单的
  • 只需要使用Paddle.jit.load()即可进行模型加载
  • 代码如下:
In [7]
model = paddle.jit.load('inference_models/u2netp')
model.eval()# 模型预测# 作为演示这里使用随机数作为输入d0, _, _, _, _, _, _ = model(x)# 打印输出的形状print(d0.shape)
       
[1, 1, 320, 320]
       
In [8]
# 计算预测时间start = time.time()
out = model(x)
end = time.time()print('predict time: %.04f s' % (end - start))
       
predict time: 1.9530 s
       

PaddleInference预测部署

  • 导出的推理模型也可以使用PaddleInference高性能推理引擎来进行预测部署
  • 在CPU平台下还可以手动开启MKLDNN进行加速,效率将进一步提高
  • 下面就通过PaddleInference来进行模型推理
  • 更多详情请参考我的另一个项目:PaddleQuickInference
In [ ]
# 安装PaddleQuickInference!pip install ppqi -i https://pypi.python.org/simple
   
In [9]
# 不启用MKLDNN加速import numpy as npfrom ppqi import InferenceModel

model = InferenceModel(
    modelpath='inference_models/u2netp', 
    use_gpu=False, 
    use_mkldnn=False)
model.eval()

x = np.random.randn(1, 3, 320, 320).astype('float32')

d0, _, _, _, _ ,_, _ = model(x)# 打印输出的形状print(d0.shape)
       
(1, 1, 320, 320)
       
In [10]
# 计算预测时间start = time.time()
out = model(x)
end = time.time()print('predict time: %.04f s' % (end - start))
       
predict time: 1.8739 s
       
In [11]
# 启用MKLDNN加速model = InferenceModel(
    modelpath='inference_models/u2netp', 
    use_gpu=False, 
    use_mkldnn=True)
model.eval()

d0, _, _, _, _ ,_, _ = model(x)# 打印输出的形状print(d0.shape)
       
(1, 1, 320, 320)
       
In [12]
# 计算预测时间start = time.time()
out = model(x)
end = time.time()print('predict time: %.04f s' % (end - start))
       
predict time: 0.5673 s
       

部署实例

  • 接下来通过加入数据预处理和后处理来完成完整的模型推理部署
In [2]
%matplotlib inlineimport cv2import timeimport numpy as npimport matplotlib.pyplot as pltfrom ppqi import InferenceModelfrom processor import preprocess, postprocess# 输入输出设置img_path = 'test.bmp'output_dir = 'output'# 数据预处理img = preprocess(img_path)# 加载模型model = InferenceModel(
    modelpath='inference_models/u2netp', 
    use_gpu=False, 
    use_mkldnn=True)
model.eval()# 模型推理start = time.time()
d0, _, _, _, _ ,_, _ = model(img)
end = time.time()print('predict time: %.04f s' % (end - start))# 结果后处理mask_path, result_path = postprocess(d0, img_path, output_dir)# 图像显示img = np.concatenate([
    cv2.imread(img_path),
    cv2.imread(mask_path),
    cv2.imread(result_path)
], 1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
       
predict time: 0.7955 s
       
<Figure size 432x288 with 1 Axes>
               

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

76

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

117

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

350

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

63

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

109

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

108

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

243

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

684

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

179

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号