docs/introduction/architecture.md
Paddle Lite 架构侧重多硬件、高性能的支持,其主要设计思想如下
架构图如下
<p align="center"></p>Lite设计了两套 API 及对应的预测库,满足不同场景需求:
CxxPredictor 同时包含 Analysis Phase 和 Execution Phase,支持一站式的预测任务,同时支持模型进行分析优化与预测执行任务,适用于对预测库大小不敏感的硬件场景。MobilePredictor 只包含 Execution Phase,保持预测部署和执行的轻量级和高性能,支持从内存或者文件中加载优化后的模型,并进行预测执行。OpLite.InferShape 基于输入推断得到输出的维度Kernel.Run,Kernel 相关参数均使用指针提前确定,后续无查找或传参消耗Op 及 Kernel 设计,避免框架额外消耗
Op 只有 CreateKernels 和 InferShape 两个重要职能Kernel 只有 Run 职能TargetWrapper 模块做适配器适配,对上层框架提供一致界面TensorTy 用来表示 Tensor 类型
struct TensorTy {
TargetType target;
PrecisionType precision;
DataLayout layout;
int deviceid;
};
enum class TargetType { kARM, kX86, kCUDA, kOpenCL };
enum class PrecisionType { kFP32, kFP16, kInt8, kInt16 };
enum class DataLayout { kNCHW, kNHWC };
注册 Kernel,确定特定 Kernel 的输入输出特征
REGISTER_LITE_KERNEL(
mul, kARM, kFloat, kNCHW, arm::MulCompute, def)
.BindInput("X", {LiteType::GetTensorTy(kARM, kFloat, kNCHW)})
.BindInput("Y", {LiteType::GetTensorTy(kARM, kFloat, kNCHW))})
.BindOutput("Out", {LiteType::GetTensorTy(kARM, kFloat, kNCHW)})
.Finalize();
同一个 Op 的不同 Kernel 类似函数重载
用于支持任意的混合调度:
全局做类型推断,当发现 tensor 传递中有类型冲突,采用 type cast 操作,通过插入特定功能 Op 来实现正确的传导
基于 Type System 的 SSA,通过 IR Pass 对计算图进行分析和优化: