SOPHON SDK对于paddle模型转换的常见问题
静态图保存*.pdmodel和*.pdpot 与*.pdmodel和*.pdiparams的区别?
其主要差别在于保存结果的应用场景:
*.pdmodel,*.pdparams,*.pdopt 三种由save接口保存(2.0的paddle.static.save或者1.8的fluid.io.save)。
*.pdmodel 和 *.pdiparams 由 save_inference_model接口保存(2.0的paddle.static.save_inference_model或者1.8的fluid.io.save_inference_model)
save接口:
该接口用于保存训练过程中的模型和参数,一般包括*.pdmodel,.pdparams,.pdopt三个文件。其中*.pdmodel是训练使用的完整模型program描述,区别于推理模型,训练模型program包含完整的网络,包括前向网络,反向网络和优化器,而推理模型program仅包含前向网络,.pdparams是训练网络的参数dict,key为变量名,value为Tensor array数值,.pdopt是训练优化器的参数,结构与*.pdparams一致
save_inference_model接口:
该接口用于保存推理模型和参数,2.0的paddle.static.save_inference_model保存结果为*.pdmodel和*.pdiparams两个文件,其中*.pdmodel为推理使用的模型program描述,.pdiparams为推理用的参数,这里存储格式与.pdparams不同(注意两者后缀差个i),*.pdiparams为二进制Tensor存储格式,不含变量名。1.8的fluid.io.save_inference_model默认保存结果为__model__文件,和以参数名为文件名的多个分散参数文件,格式与2.0一致。
详情请参考: 模型保存与载入-使用文档-PaddlePaddle深度学习平台
如何生成*.pdmodel和*.pdiparams?
-
动态图存储模型结构和参数 根据训练模式不同,分为两种情况:
动转静训练 + 模型&参数存储:
动转静训练相比直接使用动态图训练具有更好的执行性能,训练完成后,直接将目标Layer传入 paddle.jit.save 存储即可。动态图训练 + 模型&参数存储:
动态图模式相比动转静模式更加便于调试,如果仍需要使用动态图直接训练,也可以在动态图训练完成后调用paddle.jit.save 直接存储模型和参数。 -
静态图推理模型&参数保存
保存/载入静态图推理模型,可以通过 paddle.static.save/load_inference_model实现。 静态图导出推理模型需要指定导出路径、输入、输出变量以及执行器。save_inference_model 会裁剪Program的冗余部分,并导出两个文件: path_prefix.pdmodel 、path_prefix.pdiparams。
注意事项请参考: 模型保存与载入-使用文档-PaddlePaddle深度学习平台 -
checkpoint(persistable 模型)转换为inference模型保存
在任务的训练阶段,通常我们会保存一些 checkpoint(persistable 模型),这些只是模型权重文件,不能直接被预测引擎直接加载预测,所以我们通常会在训练完之后,找到合适的 checkpoint 并将其转换为 inference 模型。需要构建训练引擎,之后保存 inference 模型即可。 在paddleclas模型库的 tools/export_model.py 中提供了完整的示例,只需执行下述命令即可完成转换:python tools/export_model.py \ -