飞桨PaddleLite架构研读
一、架构全景图

二、源码详细解读
1. Lite体系下似乎有多种 op_desc/program_desc 的定义,之间的关系是什么?这样设计的背景和好处是什么?
- model_parser目录下,包含
- flatbuffers——结构描述定义在
framework.fbs文件中,命名空间为paddle.lite.fbs.proto- 它除了定义OpDesc,还定义了
OpDescView(这个用来做什么的?)
- 它除了定义OpDesc,还定义了
- naive_buffer——结构描述定义在
proto/framework.nb.h中,其中Attr为继承StructBuilder,内含一个map结构- BinaryTable、FieldBuider、PrimaryBuilder、PrimaryListBuilder、EnumBuilder、StringBuilder、ListBuilder
- pb——结构描述定义在
core/framework.pb.h中,对应于主框架Paddle中的proto描述,二者为同一个(似乎会延迟更新) - ssa——结构描述定义在
ssa/op_proto.h,有别于前三个,这里仅仅定义了BlockOpProto- 从头文件包含来看,是复用的
core/model/general/op_desc.h的定义 - 个人觉得ssa是为了转graph,因此直接依赖genernal模块的IR表示即可,无需额外定义新的结构描述
- 从头文件包含来看,是复用的
- 注意:除了ssa以外,其他三个目录下的IR表示都是继承自core/model/base下的xxDescAPI
- cpp_desc定义:
- 通过一个宏来切换,LITE_ON_FLATBUFFERS_DESC_VIEW
- 若开启了此宏,则cpp命名空间里的Desc表示使用类似
fbs::ProgramDescView - 若关闭了此宏,则cpp命名空间里的Desc表示使用类似
general::ProgrMode
- 若开启了此宏,则cpp命名空间里的Desc表示使用类似
- 通过一个宏来切换,LITE_ON_FLATBUFFERS_DESC_VIEW
- flatbuffers——结构描述定义在
- core/model 目录下,包含:
- base公共API:
- VarDesc相关:VarDescAPI多继承自
VarDescReadAPI和VarDescWriteAPI,分别约定了可读、可写的接口虚函数 - OpDesc相关:OpDescAPI多继承自
OpDescReadAPI和OpDescWriteAPI,分别约定了可读、可写的接口虚函数 - BlockDesc相关:BlockDescAPI多继承自
BlockDescReadAPI和BlockDescWriteAPI,分别约定了可读、可写的接口虚函数 - ProgramDesc相关:ProgramDescAPI多继承自
ProgramDescReadAPI和ProgramDescWriteAPI,分别约定了可读、可写的接口虚函数 - ParamDesc相关:ParamDescAPI多继承自
ParamDescReadAPI和ParamDescWriteAPI,分别约定了可读、可写的接口虚函数- 这里还有一个
CombinedParamDescAPI,和上面类似,父类不一样,多了ParamDesc的更新操作
- 这里还有一个
- VarDesc相关:VarDescAPI多继承自
- general目录下,包含
- VarDesc类:继承自VarDescAPI,不持有任何proto相关的成员,很简洁地描述VarDesc信息
- OpDesc类:继承自OpDescAPI,不持有任何proto相关的成员,很简洁地描述OpDesc信息
- attrs_ 是
std::map<string, Any>
- attrs_ 是
- BlockDesc类:继承自BlockDescAPI,不持有任何proto相关的成员,很简洁地描述BlockDesc信息
- ProgramDesc类:继承自ProgramDescAPI,不持有任何proto相关的成员,很简洁地描述ProgramDesc信息
- base公共API:
core/mode/base/traits.h目录下的OpDataTypeTrait似乎是与OpAttrType一一对应关系,不允许重复?
如下是OpAttrType的定义:
// The AttrType is used to make the proto::AttrType portable.
enum class OpAttrType {
INT = 0,
FLOAT = 1,
STRING = 2,
INTS = 3,
FLOATS = 4,
STRINGS = 5,
BOOLEAN = 6,
BOOLEANS = 7,
BLOCK = 8,
LONG = 9,
BLOCKS = 10,
LONGS = 11,
UNK,
};
如下是OpDataTypeTrait机制实现:
#define ATTR_TYPE_TRAIT_IMPL(T, type__) \
template <typename U> \
struct OpDataTypeTrait<type__, U> { \
typedef type__ ET; \
typedef type__ RT; \
static constexpr OpAttrType AT{OpAttrType::T}; \
static constexpr const char* ATN{#T}; \
}; \
template <typename U> \
constexpr OpAttrType OpDataTypeTrait<type__, U>::AT; \
template <typename U> \
constexpr const char* OpDataTypeTrait<type__, U>::ATN;
ATTR_TYPE_TRAIT_IMPL(BLOCK, int16_t);
ATTR_TYPE_TRAIT_IMPL(INT, int32_t);
ATTR_TYPE_TRAIT_IMPL(FLOAT, float);
ATTR_TYPE_TRAIT_IMPL(STRING, std::string);
ATTR_TYPE_TRAIT_IMPL(BOOLEAN, bool);
ATTR_TYPE_TRAIT_IMPL(LONG, int64_t);
// general/op_desc.h 中的接口调用:
template <typename T>
void SetAttr(const std::string& name, const T& v) {
attr_types_[name] = OpDataTypeTrait<T>::AT; // <----- 如T为int16_t,则attr_type记录为BLOCK
attrs_[name].set(v);
}
飞桨PaddleLite架构研读的更多相关文章
- 树莓派4B安装 百度飞桨paddlelite 做视频检测 (一、环境安装)
前言: 当前准备重新在树莓派4B8G 上面搭载训练模型进行识别检测,训练采用了百度飞桨的PaddleX再也不用为训练部署环境各种报错发愁了,推荐大家使用. 关于在树莓派4B上面paddlelite的文 ...
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
参考文章: 深度剖析知识增强语义表示模型--ERNIE_财神Childe的博客-CSDN博客_ernie模型 ERNIE_ERNIE开源开发套件_飞桨 https://github.com/Pad ...
- 我做的百度飞桨PaddleOCR .NET调用库
我做的百度飞桨PaddleOCR .NET调用库 .NET Conf 2021中国我做了一次<.NET玩转计算机视觉OpenCV>的分享,其中提到了一个效果特别好的OCR识别引擎--百度飞 ...
- 提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件
提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件 11月5日,在『WAVE Summit+』2019 深度学习开发者秋季峰会上,百度对外发布基于 ERNIE 的语义理解 ...
- 百度飞桨数据处理 API 数据格式 HWC CHW 和 PIL 图像处理之间的关系
使用百度飞桨 API 例如:Resize Normalize,处理数据的时候. Resize:如果输入的图像是 PIL 读取的图像这个数据格式是 HWC ,Resize 就需要 HWC 格式的数据. ...
- Ubuntu 百度飞桨和 CUDA 的安装
Ubuntu 百度飞桨 和 CUDA 的安装 1.简介 本文主要是 Ubuntu 百度飞桨 和 CUDA 的安装 系统:Ubuntu 20.04 百度飞桨:2.2 为例 2.百度飞桨安装 访问百度飞桨 ...
- 【百度飞桨】手写数字识别模型部署Paddle Inference
从完成一个简单的『手写数字识别任务』开始,快速了解飞桨框架 API 的使用方法. 模型开发 『手写数字识别』是深度学习里的 Hello World 任务,用于对 0 ~ 9 的十类数字进行分类,即输入 ...
- 飞桨paddlespeech语音唤醒推理C实现
上篇(飞桨paddlespeech 语音唤醒初探)初探了paddlespeech下的语音唤醒方案,通过调试也搞清楚了里面的细节.因为是python 下的,不能直接部署,要想在嵌入式上部署需要有C下的推 ...
- 飞桨AI 文本实体抽取 数据准备(excel 文本标注)
网纸: https://ai.baidu.com/easydl/app/deploy/tee/public #!/usr/bin/env python3 # -*- coding: utf-8 -*- ...
- PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
飞桨 (PaddlePaddle) 以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发.功能完备. 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架.基础模型库.端到端开发 ...
随机推荐
- Android为按钮Button添加事件
匿名内部类 1 <!--匿名内部类方式--> 2 <Button 3 android:id="@+id/btn2" 4 android:layout_width= ...
- 应对 DevOps 中的技术债务:创新与稳定性的微妙平衡
技术性债务在DevOps到底意味着什么?从本质上讲,这是小的开发缺陷的积累,需要不断地返工.它可能由多种原因引起,例如快速交付新功能的压力,这可能会导致团队不得不牺牲代码的整洁和完善.但这些不完整的小 ...
- Zookeeper解决了什么问题?
在公司中用到了zookeeper协调分布式系统,在这里记录下. (一). 首先是什么? 是一种适用于分布式应用程序的高性能协调服务.它在一个简单的界面中公开常见服务(如命名.配置管理.同步和组服务), ...
- #Dijkstra,二进制拆位#洛谷 5304 [GXOI/GZOI2019]旅行者
题目 分析(\(logk\)次Dijkstra) 首先为什么\(O(nklogn)\)的多次\(dijkstra\)为什么会TLE, 因为中间有许多的冗余状态,即使两点求出的路径是最短的,它也不一定是 ...
- K8s技术全景:架构、应用与优化
本文深入探讨了Kubernetes(K8s)的关键方面,包括其架构.容器编排.网络与存储管理.安全与合规.高可用性.灾难恢复以及监控与日志系统. 关注[TechLeadCloud],分享互联网架构.云 ...
- 如何通过 Makefile 优化加速编译过程提高开发效率
在软件开发中,编译是一个必不可少的过程.但是,当代码规模变得越来越大时,编译时间也会变得越来越长,这会严重影响开发效率.在这种情况下,优化Makefile可以帮助我们加速编译过程,以下是一些Makef ...
- 【FAQ】推送前台应用的通知处理功能没生效,如何进行排查?
一.前台应用的通知处理简介 在调用推送接口时可以设置"foreground_show"字段控制前台应用的通知栏消息是否通过NC展示."foreground_show&qu ...
- HarmonyOS如何使用异步并发能力进行开发
一.并发概述 并发是指在同一时间段内,能够处理多个任务的能力.为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS系统提供了异步并发和多线程并发两种处理策略. ● 异步 ...
- HarmonyOS Codelab样例—弹窗基本使用
一.介绍 本篇 Codelab 主要基于 dialog 和 button 组件,实现弹窗的几种自定义效果,具体效果有: 1. 警告弹窗,点击确认按钮弹窗关闭. 2. 确认弹窗,点击取消按钮或确认按 ...
- JS解混淆
JS解混淆 最近在整理之前和一些同伴的分享资料,发现时间已经过了好久,特此整理一些有价值的分享记录. JS混淆 学习js混淆可以逆向分析混淆和加密过程,实战可用于爬虫和渗透信息获取 本文档用于初步介绍 ...