Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LITE][NPU][XPU] Refine subgraph pass, and support NPU/XPU model generation at execution time #2576

Merged

Conversation

hong19860320
Copy link
Collaborator

@hong19860320 hong19860320 commented Dec 6, 2019

背景问题:

  1. NPU和XPU的模型是在离线的子图分析阶段生成的,与输入尺寸强相关,在部署阶段,当输入尺寸发生变化时无法重新生成NPU和XPU模型。
  2. 华为NPU型号较多、软件版本不一,离线生成的NPU模型不一定适用于每个机型,在发生兼容性问题时,Paddle Lite会出现crash,严重影响用户体验。
  3. 目前NPU的模型生成依赖于NPU子图pass,而该子图pass依赖于华为HiAI API,即依赖于华为手机环境,即无法在server端使用model_optimize_tool生成NPU/XPU模型。
  4. 子图分析、检测算法存在问题,对于复杂模型,子图划分结果错误。

解决办法:

  1. 拆分子图pass代码,只保留子图检测和融合功能(去掉所有与设备有关的代码)可以解决问题3,具体实现是,为每个子图新建一个subgraph op替换原始的ops,并创建一个新的block_desc保存子图原始的ops,同时在新建的subgraph op设置sub_block属性存储新建的block_desc在program的block_descs的索引。
  2. 将模型生成(paddle ops转NPU IR graph)代码从子图pass中剥离,放到执行阶段,可以解决问题1和2,具体实现是,在执行阶段,当运行到subgraph op时,会根据其保存的sub_block属性找到该子图对应的block_desc(即保存了该子图的原始ops),逐个转换每个op生成NPU/XPU的IR Graph,进而生成并执行NPU/XPU模型,完成子图的执行,如果NPU/XPU模型生成失败或存在兼容性问题,将依次调用原始ops中的每个op的kernel实现子图的执行。当输入尺寸发生变化时,判断NPU/XPU模型是否支持可变尺寸,如果不支持则重新生成NPU/XPU模型。
  3. 移植paddle inference的子图检测的相关实现以解决问题4。

其它改动:

  1. 去掉了之前由于需要支持NPU/XPU而导致的框架方面的修改,例如mir::Node里面增加subgraph_id和相关接口,program.cc中强制要求运行NPU/XPU子图pass前需要设置输入tensor的shape信息。
  2. op converter(bridge)提供了实用工具类函数,op converter(bridge)代码更加简洁。
  3. arena framework支持op converter的unit test,不再使用独立的unit test,减少重复代码。

@hong19860320 hong19860320 changed the title [LITE][ALL] Refine subgraph pass, and support NPU/XPU model generation on execution time [LITE][ALL] Refine subgraph pass, and support NPU/XPU model generation at execution time Dec 6, 2019
@hong19860320 hong19860320 changed the title [LITE][ALL] Refine subgraph pass, and support NPU/XPU model generation at execution time [LITE][NPU][XPU] Refine subgraph pass, and support NPU/XPU model generation at execution time Dec 7, 2019
@hong19860320 hong19860320 requested review from zhupengyang, Superjomn and sangoly and removed request for zhupengyang December 10, 2019 14:33
Superjomn
Superjomn previously approved these changes Dec 11, 2019
Copy link
Collaborator

@Superjomn Superjomn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

执行时做图优化,总体上与lite的设计不一致,因为会带来未知的动态性

但npu接口不一致的话也没有办法,也算是npu sdk本身的设计问题

需要注意部署库的大小

@hong19860320
Copy link
Collaborator Author

hong19860320 commented Dec 11, 2019

执行时做图优化,总体上与lite的设计不一致,因为会带来未知的动态性

但npu接口不一致的话也没有办法,也算是npu sdk本身的设计问题

需要注意部署库的大小

目前这个方案取了平衡,图优化(即子图生成)仍然在分析阶段做,只是将子图转为目标设备的模型这个步骤放在执行阶段,目的是根据设备特点动态生成目标设备的模型以保证兼容性,同时由于目标设备模型的生成和输入尺寸强绑定,因此执行阶段生成目标设备的模型是合理的。

对于不支持NPU/XPU的部署库libpaddle_lite_jni.so大小无影响。针对支持NPU的部署库libpaddle_lite_jni.so增量约为60KB。

…npu to fix the compiling error on tiny publish mode

test=develop
@hong19860320
Copy link
Collaborator Author

执行时做图优化,总体上与lite的设计不一致,因为会带来未知的动态性
但npu接口不一致的话也没有办法,也算是npu sdk本身的设计问题
需要注意部署库的大小

目前这个方案取了平衡,图优化(即子图生成)仍然在分析阶段做,只是将子图转为目标设备的模型这个步骤放在执行阶段,目的是根据设备特点动态生成目标设备的模型以保证兼容性,同时由于目标设备模型的生成和输入尺寸强绑定,因此执行阶段生成目标设备的模型是合理的。

Superjomn
Superjomn previously approved these changes Dec 11, 2019
Copy link
Collaborator

@Superjomn Superjomn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

lite/operators/op_params.h Outdated Show resolved Hide resolved
sangoly
sangoly previously approved these changes Dec 12, 2019
Copy link
Collaborator

@sangoly sangoly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Collaborator

@sangoly sangoly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@hong19860320 hong19860320 merged commit d5434aa into PaddlePaddle:develop Dec 13, 2019
@hong19860320 hong19860320 deleted the hongming/support_runtime branch December 13, 2019 06:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants