Created by: chenwhql
PR types
Function optimization
PR changes
APIs
Describe
主要修改内容
- 将动转静存储部署API由
fluid.ProgramTranslator.save_inference_model
改为fluid.dygraph.jit.save
,改为全局接口,去除使用局限,优化参数 -
fluid.dygraph.jit.save
默认所有参数存储到一个文件,简化存储目录 - 补充存储
variable
信息,兼容静态图load_inference_model
的基础上,补全丢失的信息 -
save
对象统称为TranslatedLayer
,对应Layer
,载入后仍以此概念管理 - 添加动态图对应
load
方法fluid.dygraph.jit.load
,load
之后以TranslatedLayer
的概念继续使用 - 将
fluid.dygraph.static_runner.StaticModelRunner
改为用TranslatedLayer
实现,避免维护相似代码,后续将废弃StaticModelRunner
功能耦合比较紧密,前后依赖性较强,拆分为小PR将导致开发等待时长成倍增加,故未拆分
问题背景
目前动转静save部署接口save_inference_model
存在一些局限性,列举如下:
-
动转静
ProgramTranslator.save_inference_model
接口要求用户必须在最外层的Layer的forward方法添加declarative
,否则无法存储整个模型 -
动转静
ProgramTranslator.save_inference_model
接口要求用户传入的feed, fetch list成员必须是int索引,而不是变量名,int索引不够直观,因此易用性欠缺 -
动转静
ProgramTranslator.save_inference_model
接口并没有预留配置model_filename
,params_filename
等参数的能力,对于超大模型,用户想要将模型参数存储为一个文件的需求,目前不能满足 -
动转静
ProgramTranslator.save_inference_model
接口在动态图下没有对应的load
接口,对于以动态图为默认模式的Paddle 2.0的新用户来说,他们可能会疑惑,为什么我在动态图模式下训练存储的模型,一定要在关掉动态图模式的前提下才能load使用?为什么我还要了解Program,Executor这些动态图模式下没有的概念,才能load我存储的模型?
动转静还有之前的TracedLayer机制,目前
TracedLayer.save_inference_model
也使用list[int]作为输入,但考虑到TracedLayer将来不作为主推接口,以及它的输入输出格式和标准Layer不统一,对它的适配可能需要先修改这个接口本身,本方案暂不讨论
重构接口简介
fluid.dygraph.jit.save(layer, model_path, input_spec=None, configs=None)
别名:
paddle.imperative.jit.save(layer, model_path, input_spec=None, configs=None)
:
- 改为全局外部接口,与paddle 2.0动态图模式的
paddle.imperative.save
风格保持一致 - 由用户传入需要存储的Layer,要求用户传入的Layer必须是经过
declarative
转换的 - feed参数更名为input_spec,使概念更简单
- fetch参数隐藏至configs中,更名为output_spec,且不再推荐用户使用
- input_spec, output_spec输入类型改为
list[VarBase]
,用户直接传入变量即可 - 简化函数名
save_inference_model
,jit.save
表达的信息简洁准确,引入inference_model
的概念反而增加用户的理解成本 - 添加configs参数保留功能上的灵活性与扩展性,configs是一个SaveLoadConfig类,可配置多个不常用的参数
兼容性解释
def save_inference_model(dirname,
feeded_var_names, # 对应input_spec
target_vars, # 对应SaveLoadConfig.output_spec
executor, # 临时申请即可,内部填充
main_program=None, # 动转静结果,内部填充
model_filename=None, # 对应SaveLoadConfig.model_filename
params_filename=None, # 对应SaveLoadConfig.params_filename, 对应SaveLoadConfig.separate_params
export_for_deployment=True, # 对应SaveLoadConfig._export_for_deployment
program_only=False): # 对应SaveLoadConfig._program_only
fluid.dygraph.jit.load(model_path, configs=None)
别名:
paddle.imperative.jit.load(model_path, configs=None)
:
- 动态图模式下动转静训练存储的模型,从设计上来讲,同样在动态图模式下能load进行使用才是完备的(竞品都能做到),所以增加
jit.load
接口,设计更完备 - 在静态图模式下,使用
io.load_inference_model
即可,完全兼容(或者后续可能还有封装更好的高阶API) - 在脱离框架的其他部署场景,使用其他语言API载入,例如C++接口载入
重构接口后Save/Load体系
1. 新增接口位置
2. 新增接口后Paddle Save/Load体系
文档预览
FluidDoc 中英文文档 PR: https://github.com/PaddlePaddle/FluidDoc/pull/2253
文档预览链接:http://180.76.141.178/documentation/docs/en/api/imperative/jit/save.html
文档预览图片: