位置:首页 > 新闻资讯 > Paddle2.0:使用动转静完成模型部署

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

时间:2025-07-21  |  作者:  |  阅读:0

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

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

引入

项目说明

动态图vs静态图

运行速度对比

动态图动转静(paddle.jit.load)动转静(PaddleInference)动转静(PaddleInference+mkldnn)2.1827 s1.9110 s1.8756 s0.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']登录后复制 ? ? ? ?

模型可视化

静态图模型加载

  • 加载这样的保存的模型也是非常简单的
  • 只需要使用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 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登录后复制 ? ? ? ?

<Figure size 432x288 with 1 Axes>登录后复制 ? ? ? ? ? ? ? ?

福利游戏

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多