Skip to content

  • 体验新版
    • 正在加载...
  • 登录
  • PaddlePaddle
  • Paddle
  • 合并请求
  • !24989

P
Paddle
  • 项目概览

PaddlePaddle / Paddle
接近 2 年 前同步成功

通知 2323
Star 20933
Fork 5424
  • 代码
    • 文件
    • 提交
    • 分支
    • Tags
    • 贡献者
    • 分支图
    • Diff
  • Issue 1423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
  • Wiki 0
    • Wiki
  • 分析
    • 仓库
    • DevOps
  • 项目成员
  • Pages
P
Paddle
  • 项目概览
    • 项目概览
    • 详情
    • 发布
  • 仓库
    • 仓库
    • 文件
    • 提交
    • 分支
    • 标签
    • 贡献者
    • 分支图
    • 比较
  • Issue 1,423
    • Issue 1,423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
    • 合并请求 543
  • Pages
  • 分析
    • 分析
    • 仓库分析
    • DevOps
  • Wiki 0
    • Wiki
  • 成员
    • 成员
  • 收起侧边栏
  • 动态
  • 分支图
  • 创建新Issue
  • 提交
  • Issue看板

[Dy2static] Refactor ProgramTranslator save_inference_model API !24989

  • Report abuse
!24989 已合并 6月 09, 2020 由 saxon_zh@saxon_zh 创建
#<User:0x00007f2c01407c00>
  • 概览 39
  • 提交 22
  • 变更 11

Created by: chenwhql

PR types

Function optimization

PR changes

APIs

Describe

主要修改内容

  1. 将动转静存储部署API由fluid.ProgramTranslator.save_inference_model改为fluid.dygraph.jit.save,改为全局接口,去除使用局限,优化参数
  2. fluid.dygraph.jit.save默认所有参数存储到一个文件,简化存储目录
  3. 补充存储variable信息,兼容静态图load_inference_model的基础上,补全丢失的信息
  4. save对象统称为TranslatedLayer,对应Layer,载入后仍以此概念管理
  5. 添加动态图对应load方法fluid.dygraph.jit.load,load之后以TranslatedLayer的概念继续使用
  6. 将fluid.dygraph.static_runner.StaticModelRunner改为用TranslatedLayer实现,避免维护相似代码,后续将废弃StaticModelRunner

功能耦合比较紧密,前后依赖性较强,拆分为小PR将导致开发等待时长成倍增加,故未拆分

问题背景

目前动转静save部署接口save_inference_model存在一些局限性,列举如下:

  1. 动转静ProgramTranslator.save_inference_model接口要求用户必须在最外层的Layer的forward方法添加declarative,否则无法存储整个模型

  2. 动转静ProgramTranslator.save_inference_model接口要求用户传入的feed, fetch list成员必须是int索引,而不是变量名,int索引不够直观,因此易用性欠缺

  3. 动转静ProgramTranslator.save_inference_model接口并没有预留配置model_filename,params_filename等参数的能力,对于超大模型,用户想要将模型参数存储为一个文件的需求,目前不能满足

  4. 动转静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. 新增接口位置

image

2. 新增接口后Paddle Save/Load体系

image

image

文档预览

FluidDoc 中英文文档 PR: https://github.com/PaddlePaddle/FluidDoc/pull/2253

文档预览链接:http://180.76.141.178/documentation/docs/en/api/imperative/jit/save.html

文档预览图片:

image

image

image

image

指派人
分配到
审核者
Request review from
无
里程碑
无
分配里程碑
工时统计
标识: paddlepaddle/Paddle!24989
Source branch: github/fork/chenwhql/dy2static/refactor_jit_save_load
渝ICP备2023009037号

京公网安备11010502055752号

网络110报警服务 Powered by GitLab CE v13.7
开源知识
Git 入门 Pro Git 电子书 在线学 Git
Markdown 基础入门 IT 技术知识开源图谱
帮助
使用手册 反馈建议 博客
《GitCode 隐私声明》 《GitCode 服务条款》 关于GitCode
Powered by GitLab CE v13.7