Paddle Lite 预测库构建详解:基础预测库与全量预测库(build_extra)的选型与编译
【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite
Paddle Lite 的预测库按算子(OP)覆盖范围分为基础预测库与全量预测库两种形态:前者体积小、启动快,只收录常用 CV 算子;后者收录全部算子,可支撑 OCR、NLP 等序列模型,但产物更大。本文以 docs/source_compile/library.md 为骨架,结合编译脚本 lite/tools/build.sh、构建函数 cmake/functions.cmake 与算子清单 docs/quick_start/support_operation_list.md,完整讲解build_extra编译选项的作用、两种库的差异、各自的编译命令以及底层源码实现机制,帮助你根据部署场景选对预测库形态。
一、为什么要有"基础"与"全量"两种预测库
端侧推理引擎面对的是两类截然不同的需求:
- 追求极致体积:移动 App 集成预测库时,库体积直接进入安装包。只部署图像分类、检测等常规模型的场景,不需要为用不到的算子付体积代价;
- 追求模型覆盖面:OCR(文字检测/识别)、NLP(翻译、语义理解)等模型依赖序列相关算子(如
sequence_*、search_*系列),这些算子只有在开启全量编译时才会被打包。
因此在 Paddle Lite 中:
- 基础预测库只包含基础 CV 算子(OP),体积较小,支持的模型相对固定;
- **全量预测库(with_extra)**包含所有 Lite 算子(基础算子 + 附加算子),体积较大,支持模型更多。
二者的切换完全由编译选项build_extra控制:
| 编译形态 | build_extra | 产物特点 | 适用场景 |
|---|---|---|---|
| 基础预测库 | OFF | 体积小、支持常用模型 | 移动端部署、安装包体积敏感 |
| 全量预测库 | ON | 算子全、模型覆盖广 | OCR / NLP / 序列模型、调试测试 |
二、build_extra编译选项:默认值与生效机制
2.1 默认值
原文档 docs/source_compile/library.md 明确指出:编译时由编译选项build_extra(默认为OFF)控制,--build_extra=OFF时编译基础预测库,--build_extra=ON时编译全量预测库。
对应的 CMake 配置项为LITE_BUILD_EXTRA,其在 docs/source_compile/compile_options.md 中的定义如下:
| 编译选项 | 说明 | 默认值 |
|---|---|---|
| LITE_BUILD_EXTRA | 编译全量预测库,包含更多算子和模型支持 | OFF |
一个需要注意的细节:虽然 CMake 层面LITE_BUILD_EXTRA默认为OFF,但 lite/tools/build.sh 脚本内部声明的BUILD_EXTRA=ON默认值为ON。也就是说,如果通过build.sh构建且不显式传入--build_extra,脚本会默认产出全量库。因此,当你的目标是基础预测库时,务必显式加上--build_extra=OFF,不要依赖"默认值"。
2.2 源码层面如何生效
从源码结构看,build_extra对算子/内核的"收录"控制发生在 CMake 配置阶段,核心机制在 cmake/functions.cmake 的两个函数中:
add_operator(TARGET level):算子注册入口,level取值为basic、extra、train之一;add_kernel(TARGET device level):内核注册入口,level取值basic、extra。
关键逻辑(cmake/functions.cmake):
if ("${level}" STREQUAL "extra" AND (NOT LITE_BUILD_EXTRA)) return() endif()即:当某个算子/内核被标记为extra级别,而构建时未开启LITE_BUILD_EXTRA,该源文件会被直接跳过,不会进入ops_src_list/kernels_src_list参与编译。与此配套,cmake/configure.cmake 在开启该选项时会向编译器注入宏定义:
if (LITE_BUILD_EXTRA) add_definitions("-DLITE_BUILD_EXTRA") endif(LITE_BUILD_EXTRA)因此,基础预测库与全量预测库的差异,本质上是编译期通过level=extra标记将附加算子/内核排除或纳入,而不是运行时行为差异。
三、基础预测库(--build_extra=OFF)
3.1 支持功能
- 基础算子(默认编译的算子)。原文档给出的是78 个基础算子;以当前仓库的算子清单 docs/quick_start/support_operation_list.md 为准,当前统计为91 个基础算子(后续版本持续扩充,具体以所拉取分支的清单文档为准);
- 9 个基础模型;
- 3 个 int8 量化模型。
3.2 支持的模型
- Fluid 基础模型(来源为 PaddlePaddle/models 系列模型库):
mobilenetV1 mnasnet yolov3 ssd_mobilenetv1 shufflenet_v2 mobilenetV2 resnet50 unet squeezenet_v11- int8 量化模型:
mobilenet_v1 mobilenet_v2 resnet503.3 特点
轻量级预测库,体积更小,支持常用模型。适合对安装包大小敏感的移动端常规 CV 推理场景。
3.4 编译方法
编译时设置--build_extra=OFF(CMake 层面的默认值)即可编译出基础预测库。例如为 Android armv8 架构、gcc 编译器、C++ 静态链接 STL 构建:
./lite/tools/build.sh --arm_os=android --arm_abi=armv8 --arm_lang=gcc --android_stl=c++_static tiny_publish四、全量预测库(--build_extra=ON)
4.1 支持功能
全量预测库包含 Paddle Lite 的全部算子,即"基础算子 + 附加算子"。按当前仓库 docs/quick_start/support_operation_list.md 的统计,当前共计支持算子 278 个,其中基础算子 91 个、附加算子 187 个,附加算子需开启build_extra才会参与编译。
以 docs/images/all_ops.png 的算子-硬件支持矩阵为例,每个算子在 ARM、OpenCL、Metal、昆仑芯 XPU、X86、寒武纪 MLU、昇腾 NPU、联发科 APU、麒麟 NPU、TIM-VX、Android NNAPI、OpenVINO 等硬件上的支持情况各不相同,全量库能最大化保证"模型里出现的算子都能找到可执行的内核"。
4.2 特点
包含更多算子、支持更多模型(尤其序列相关模型,如 OCR、NLP),但体量更大。
4.3 编译方法
设置--build_extra=ON即可编译出全量预测库,其余参数与基础库保持一致:
./lite/tools/build.sh --arm_os=android --arm_abi=armv8 --arm_lang=gcc --android_stl=c++_static --build_extra=ON tiny_publish需要说明的是,由于 lite/tools/build.sh 中BUILD_EXTRA的脚本默认值即为ON,显式写出--build_extra=ON更多是出于可读性和确定性考虑。
五、附加算子是什么?何时必须开启
附加算子指level=extra级别的算子。按照构建脚本 lite/tools/build.sh 中--build_extra参数的官方说明:
--build_extra: (OFF|ON); controls whether to publish extra operators and kernels for (sequence-related model such as OCR or NLP)
即:附加算子与内核主要面向序列相关模型(如 OCR、NLP)。典型代表包括:
- 序列类:
sequence_conv、sequence_pool、sequence_expand、sequence_softmax、sequence_reverse、sequence_topk_avg_pooling等; - 搜索/匹配类:
search_fc、search_grnn、search_seq_fc、match_matrix_tensor等; - OCR/NLP 常用:
crf_decoding、beam_search、beam_search_decode、lstm、gru、gru_unit、rnn等。
这些算子在 docs/quick_start/support_operation_list.md 的"附加算子"表格中均被列为需要开启--build_extra=ON(该文档中写作--with_extra=ON,与build_extra是同一开关,仅命名表述不同)才会编译。
命名说明:
build_extra(build.sh 参数)、LITE_BUILD_EXTRA(CMake 选项)与部分历史文档中的with_extra指向同一个开关。文档 docs/quick_start/support_operation_list.md 使用--with_extra=ON表述,实际传入build.sh时请使用--build_extra=ON。
六、build.sh常用参数与任务速查
tiny_publish只是 lite/tools/build.sh 支持的任务之一。完整的脚本用法(含参数解析、合法性校验,见 lite/tools/build.sh)如下:
6.1 常用参数
| 参数 | 取值 | 说明 |
|---|---|---|
--arm_os | android/ios/ios64/armlinux | 目标操作系统 |
--arm_abi | armv8/armv7 | 目标 ABI 架构 |
--arm_lang | gcc(当前仅支持 gcc,clang 预留) | ARM 编译工具链 |
--android_stl | c++_static/c++_shared | Android 下 STL 链接方式 |
--build_extra | OFF/ON | 是否编译附加算子与内核(序列模型如 OCR/NLP 需要) |
--with_log | OFF/ON(默认 ON) | 是否输出日志信息 |
--with_exception | OFF/ON(默认 OFF) | 出错时是否抛出异常 |
--with_profile | OFF/ON(默认 OFF) | 是否支持耗时性能统计 |
--with_precision_profile | OFF/ON(默认 OFF) | 是否支持精度分析 |
--build_train | OFF/ON | 是否发布训练算子与内核(仅 full_publish 支持) |
--build_python | OFF/ON | 是否发布 Python API 库(不支持 Android / iOS) |
--build_java | OFF/ON(默认 ON) | 是否发布 Java API 库(仅 Android 支持) |
--build_cv | OFF/ON | 是否编译 CV 图像加速库 |
--android_api_level | 数字或Default | Android API Level,ARMv7 最低 16,ARMv8 最低 21 |
--ios_deployment_target | 默认 9.0 | iOS 最低兼容系统版本 |
6.2 常用任务
| 任务 | 说明 |
|---|---|
tiny_publish | 编译移动端轻量部署库(基础库 / 全量库由--build_extra决定) |
full_publish | 编译全功能库(含测试与调试能力) |
test | 编译全部单元测试 |
benchmark | 编译 Android benchmark 程序 |
ios | 编译 iOS 预测库 |
x86/test_x86/x86_benchmark | 编译 X86 平台预测库、测试或基准 |
参数与任务的关系在 lite/tools/build.sh 的main函数中完成解析,tiny_publish任务最终调用make_tiny_publish_so,并将-DLITE_BUILD_EXTRA=$BUILD_EXTRA传入 CMake(见 lite/tools/build.sh),从而与add_operator/add_kernel的level=extra过滤逻辑衔接。
七、选型建议与注意事项
- 安装包体积敏感、模型为常规 CV 分类/检测/分割:选择基础预测库,显式传
--build_extra=OFF; - 模型包含序列类算子(OCR、NLP、搜索推荐等):必须使用全量预测库,
--build_extra=ON,否则推理阶段会因缺少算子内核而失败; - 调试与测试阶段:使用
full_publish任务或全量库,便于覆盖全部算子路径; - 体积仍有富余时:还可以配合按模型裁剪的
LITE_BUILD_TAILOR选项进一步压缩库体积,详见 docs/source_compile/library_tailoring.rst; - 具体某个算子在各类硬件上是否有内核实现,可在 docs/quick_start/support_operation_list.md 的算子-硬件矩阵中逐一核对;更多编译选项的完整说明见 docs/source_compile/compile_options.md。
相关文档导航
- 本文主体依据:docs/source_compile/library.md
- 支持算子清单(基础算子/附加算子与硬件支持矩阵):docs/quick_start/support_operation_list.md
- 编译选项总表:docs/source_compile/compile_options.md
- 按模型裁剪预测库:docs/source_compile/library_tailoring.rst
- 编译脚本实现:lite/tools/build.sh
- 算子/内核收集机制:cmake/functions.cmake 与 cmake/configure.cmake
【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考