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

引入
动态图方便调试,静态图方便部署,各有各的优点,该选啥呢?你是不是还在纠结上面的问题,小孩子才做选择,大人表示我全都要通过Paddle2.0的动转静功能,就能比较完美的兼顾这两者的优势实现用动态图进行训练调试,训练完成后使用静态图模型进行部署这么好的功能,还不赶紧学起来!项目说明
本项目将通过一个实例来展示如何将一个动态图模型转换至静态图并且通过导出的推理模型来完成模型的部署并测试不同方式下的模型运行效率动态图vs静态图
首先介绍一下这两者的区别:静态图:计算之前先构建计算图,然后按照计算图进行计算,运行效率高,但调试比较麻烦动态图:计算的同时构建计算图,运行效率稍低,但是调试方便运行速度对比
通过实测,在AIStudio的CPU平台上,不同方式部署的速度如下表使用的模型为U2Netp测试使用的输入均为Batch size为1的320*320分辨率的三通道数据均测量第二次运行时的消耗时间通过内置计时测量,结果可能存在些许误差动态图模型
对于一个训练完成的动态图模型,一般由如下几个部分组成:模型代码——用于构建模型模型参数文件——用于保存模型参数所以加载一个动态图模型一般如下几步:实例化模型加载模型参数根据需要切换模型状态下面就通过实例讲解一下如何使用动态图模型实现模型预测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的模型文件
然后启动服务即可查看模型的计算图结构了
具体的可视化图像就像下图所示的那样:
静态图模型加载
加载这样的保存的模型也是非常简单的只需要使用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来进行模型推理更多详情请参考我的另一个项目:PaddleQuickInferenceIn [ ]# 安装PaddleQuickInference!pip install ppqi -i https://pypi.python.org/simple登录后复制 In [9]
# 不启用MKLDNN加速import numpy as npfrom ppqi import InferenceModelmodel = 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登录后复制
登录后复制
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
说一下WorkBuddy 的 Plan 模式
如何切换到 Plan 模式 想体验这种更可控的方式?操作很简单。在 WorkBuddy 主界面的右下角,你会看到一个“安全模式切换”的下拉菜单,从中选择“Plan”选项即可完成切换。 核心使用流程 光说概念可能有点抽象,咱们直接看个例子。假设你手头有个任务:“把桌面上‘项目报告’文件夹里所有Exce
滴滴出行开放打车 Skill,“龙虾”叫车全程不需要切换 App
滴滴出行全网首发语音打车Skill,一句话智能叫车全攻略 近日,滴滴出行正式上线了一项创新的语音交互功能:全面开放打车Skill。这意味着,用户只需通过语音指令,即可完成从叫车到行程追踪的全流程,真正实现“动口不动手”的便捷出行体验。 整个操作过程,包括目的地搜索、车型比价、下单确认、查看订单状态等
阿里千问 AI 眼镜接入蚂蚁 GPASS:语音解锁共享单车、停车缴费
当AI眼镜学会“跑腿”:语音解锁单车,无感支付停车费 近来,智能穿戴领域的一个新动向值得关注:阿里旗下的千问AI眼镜,正式接入了蚂蚁集团的GPASS平台。这可不是一次简单的功能叠加,它意味着,诸如共享单车骑行、停车缴费这一系列高频的“AI办事”功能,开始从手机屏幕转移到了你的眼前。 简单说,借助GP
Workbuddy注册额外积分
角色定位与核心任务目标 明确了基本定位后,我们直接切入核心:作为一名专业的文章优化师,我的核心职责在于,将那些带有明显AI生成特征的文本,深度重塑为拥有个人特色与行业洞见的优质内容。 换句话说,这项任务的关键在于实施一次“精准的换血手术”。你必须严格保证原文所有的事实依据、核心观点、逻辑框架,以及每
我把 Anthropic 的 Harness 工程思想做成了一个 Skill
用AI写代码,难在哪儿? 用AI生成代码本身并不难,真正的挑战在于让它稳定地交付一个真正可用的东西。这篇文章,我们就来聊聊Anthropic工程团队是如何破解这个难题的,以及我如何将这套方法论落地成了一个可以复用的实战工具。 用 AI 写代码有多难?不是写不出来难,是让它稳定交付可用的东西很难。这篇
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

