裁剪预测库
说明:使用转化模型时,选择 --record_tailoring_info =true
会将优化后模型的OP和kernel信息保存到输出文件夹,这些信息将用于编译裁剪后的动态库。 例如:
效果:优化后模型使用的OP
和kernel
信息被保存在 mobilenet_v1NB
文件夹中的隐藏文件里了
说明:编译Paddle-Lite时选择--build_tailor=ON
,并且用 –-opt_model_dir=
指定优化后的模型的地址 例如:
release/v2.6.0以后版本或develop分支使用以下命令:
release/v2.3之前版本使用以下命令:
注意:上面命令中的../mobilenet_v1NB
是第1步得到的转化模型的输出路径
效果:编译出来的动态库文件变小,且可以运行优化后的模型。
编译出的C++预测库文件位于 :
build.lite.android.armv7.gcc/inference_lite_lib.android.armv7/cxx/lib/
编译出的Java预测库文件位于:
注意:基于某一模型裁剪出的预测库只能支持优化工具转化后的该模型,例如根据mobilenetV1裁剪出的 full_api预测库只能运行以protobuf格式转化出的模型mobilenetV1_opt_nb, 裁剪出的light_api预测库只能运行以naive_buffer格式转化出的模型mobilenetV1_opt_nb, 运行其他模型可能会出现segementation fault:undifined op or kernel
。 模型转化方法参考:使用opt转化模型)。
示例1:使用裁剪后的light_api预测库运行mobilenetv1
1、执行第二步编译后,light_api的C++ 示例位于
/Paddle-Lite/build.lite.android.armv7.gcc/inference_lite_lib.android.armv7/demo/cxx/mobile_light
输入make
命令执行编译可编译出可执行文件mobilenetv1_light_api
2、使用adb将mobilenetV1_NB模型和mobilenetv1_light_api传到手机后执行demo:
./mobilenetv1_light_api --model_dir=./mobilenetV1_NB
注意:mobilenetV1_NB
是用mobilenetV1
模型转化的naive_buffer格式模型(不需要设置 --record_tailoring_info =true
,转化流程参考:)。
示例2:使用裁剪后的full_api预测库运行mobilenetv1
1、执行第二步编译后,full_api的C++ 示例位于
替换mobilenetv1_full_api.cc代码内容:
2、使用adb将mobilenetV1_PB模型和mobilenetv1_full_api传到手机后执行demo:
注意:mobilenetV1_PB
是用mobilenetV1
模型转化的protobuf格式模型(不需要设置 --record_tailoring_info =true
,转化流程参考:使用opt转化模型)。
为了方便用户使用,我们同时提供了按模型集合进行预测库裁剪的功能。用户可以提供一个模型集合,opt 会根据用户所指定的模型集合分析其优化后的模型所需要的算子信息对预测库进行裁剪。使用此功能用户根据自己的需要使用模型集合来对预测库中的算子进行任意裁剪。
使用方法如下所示:
经过以上步骤后会在<output_model_set_dir>
中生成模型集合中各模型对应的NaiveBuffer
格式的优化模型。此步会对模型集合中所需算子信息进行搜集并存储到<output_model_set_dir>
中。下一步编译预测库的流程与使用单模型进行预测库裁剪步骤相同。
注意:
模型集合必须均为combined参数模型或均为非combined参数模型。
使用非combined参数模型时,模型拓扑文件名应为
__model__
,使用非combined参数模型时,集合中各模型的拓扑与参数名应相同,分别由--model_filename
和指定。需要使用Paddle-Lite
release/v2.1.0
之后版本代码编译出的模型优化工具。