犀牛鸟 2026 研究笔记 estelledc.github.io

Paddle-Lite 深度解读

“万能充电器——以异构后端覆盖数量取胜的国产 NPU 适配王”


一句话定位

Paddle-Lite 是百度飞桨生态的移动端/边缘端推理框架,以 NNAdapter HAL 统一硬件抽象层和 50+ MIR 优化 pass 为核心竞争力,支持 13+ 种异构硬件后端(华为昇腾/麒麟 NPU、瑞芯微、联发科 APU、高通 QNN 等),是国产 NPU 覆盖最广的推理引擎。

设计哲学上最精彩的地方

Paddle-Lite 最精彩的设计是 NNAdapter——一个借鉴 Android NNAPI 的统一硬件抽象层,但比 NNAPI 更彻底。NNAdapter 用仅 8 个函数指针定义了一个完整的硬件驱动接口:open_device / close_device / create_context / destroy_context / validate_program / create_program / destroy_program / execute_program

这像是定义了一个”万能充电接口标准”:不管你是华为的 NPU、瑞芯微的 NPU 还是联发科的 APU,只要实现这 8 个函数,就能接入 Paddle-Lite。每个硬件后端编译为独立的 .so,运行时 dlopen 加载。增加一个新硬件后端 = 实现 8 个函数 + 编译一个 .so,工程门槛极低。

NNAdapter 有自己独立的 IR(Operand/Operation/Model),与 Paddle-Lite 的 MIR 解耦。子图切分流程是:MIR 的 subgraph_pass 标记可 offload 的 Op -> 切分子图 -> 转换为 NNAdapter Model -> validate_program 确认硬件支持 -> create_program 编译 -> execute_program 执行。不支持的 Op 自动 fallback 到 CPU。一行代码不改就能在新硬件上跑起来(可能性能不佳),这是 NNAdapter 的杀手级特性

MIR 优化管线——六个框架中最重的

Paddle-Lite 的 MIR(Model Intermediate Representation)是六个框架中最重的图优化管线,包含 50+ 个优化 pass。SSAGraph 是 Arg 节点(数据)和 Stmt 节点(算子)交替相连的二部图,pass 分三种粒度:kProgramWise(改图拓扑)、kStmtWise(改语句不改拓扑)、kDebug(只观察不修改)。

核心 pass 包括:static_kernel_pick_pass(按得分选择最优 kernel)、三维 cast 自动插入(跨设备/精度/布局各一个 pass)、50+ 个算子融合 pass(conv+bn、fc fuse 等)、subgraph_pass(NPU 子图切分)、内存复用 pass。

优化管线越重,模型加载越慢但推理越快。这个取舍在部署场景下完全合理——模型只加载一次但推理千万次。ncnn 走的是相反方向:几乎不做图优化,模型加载极快。

三维 Kernel 派发——Place 坐标系

Paddle-Lite 用 (TargetType, PrecisionType, DataLayoutType) 三维坐标注册 kernel。同一个 mul 算子可以有 (kARM, kFloat, kNCHW)(kARM, kFP16, kNCHW)(kARM, kInt8, kNCHW) 三个不同 kernel。当相邻节点的 Place 不匹配时,MIR 自动插入 cast 算子:跨设备用 type_target_cast_pass,跨精度用 type_precision_cast_pass,跨布局用 type_layout_cast_pass

三维坐标系统天然支持庞大的组合空间——18+ 种 TargetType x 多种 PrecisionType x 多种 LayoutType,这是 Paddle-Lite 能覆盖如此多异构后端的架构基础。

局限性与场景边界

Paddle-Lite 与飞桨生态强绑定,原生格式(.nb)需要通过 opt 工具从 PaddlePaddle 模型转换,其他框架模型需额外经 ONNX 中转。代码量大(~3000 文件),MIR 优化管线的调试复杂度高。没有内置的 SIMD 友好布局优化(无 elempack 或 NC4HW4),CPU 纯推理性能不如 ncnn。没有端侧训练和 LLM 推理能力。社区活跃度相对较低(~7K star),项目维护节奏偶有波动。

本地代码结构

Paddle-Lite/
  lite/
    core/
      tensor.h/cc              # TensorLite 数据容器(Place 三元组)
      op_lite.h/cc             # OpLite 算子基类
      kernel.h/cc              # KernelLite 模板基类
      program.h/cc             # RuntimeProgram 执行
      optimizer/               # MIR 优化管线入口
        optimizer.h/cc
    model_parser/              # 模型解析
    kernels/
      arm/                     # ARM kernel 实现
      opencl/                  # OpenCL kernel
      x86/                     # x86 kernel
    operators/                 # Op 定义(与 Kernel 分离)
    backends/
      nnadapter/
        nnadapter_wrapper.h    # NNAdapter HAL 驱动接口
        nnadapter/
          driver/              # 各硬件驱动实现
            huawei_ascend/
            huawei_kirin_npu/
            rockchip_npu/
            mediatek_apu/
            qualcomm_qnn/
  lite/api/                    # Predictor 公共 API

本地关键文件

文件 用途
lite/core/tensor.h TensorLite 定义,内嵌 TargetType + PrecisionType
lite/core/kernel.h KernelLite 模板基类,三维 Place 坐标
lite/core/optimizer/optimizer.h MIR 优化管线入口,50+ pass 编排
lite/backends/nnadapter/nnadapter_wrapper.h NNAdapter 8 函数指针 HAL 接口
lite/kernels/arm/ ARM kernel 实现集合
lite/core/program.h RuntimeProgram,扁平化 Instruction 序列执行
lite/api/cxx_api.h Predictor 公共推理 API