Paddle mobile 结构设计
Created by: codeWorm2015
Paddle mobile 代码结构前期设计
鉴于我们跑的模型为 ProgramDesc 结构, 所以paddle mobile 将保留paddle fluid 的一部分设计结构和概念, 并对各个模块进行重写, 使代码更轻量, 去掉一些在移动端不需要的概念, 针对速度和体积进行优化.
message BlockDesc {
required int32 parent = 1;
repeated VarDesc vars = 2;
repeated OpDesc ops = 3;
}
message ProgramDesc {
repeated BlockDesc blocks = 1;
}
对比paddle fluid的一些改变:
-
load 流程依旧使用 load op 的形式, 需要更换 protobuf 库;
-
ops 结构保留, 对ops 和 kernel 里的代码要进行速度上的优化(针对ARM进行优化);
-
place 相关概念去掉;
-
op 注册这块将改变, paddle fluid 提前将可以所有 生成 op 的闭包存好, 需要用到哪些op再将其生成, paddle mobile 为了控制包大小将在编译时去掉一部分用不到的op, 所以这块将有所改变;
-
其他模块要进行重写, 去掉移动端预测不需要的逻辑, 轻量化代码;
-
调整内存分配释放策略;
可分模块:
-
整体结构: program block operator variable scope
-
矩阵等数据类型以及内存分配管理: Tensor LodTensor Dim DDim
-
executor 流程, 执行流程: 依赖以上两个模块
-
Load流程: 依赖以上三个模块, 需要集成轻量版 protobuf 库
-
op注册修改: 需要在编译期加控制
-
op 和 kernel 内代码进行速度优化(针对ARM 进行优化)
待讨论点:
-
内存分配:
- load 时提前计算分配好;
- 运算到哪个op分配到哪个op
两种方案各有利弊, 待讨论