一、架构全景图

二、源码详细解读

1. Lite体系下似乎有多种 op_desc/program_desc 的定义,之间的关系是什么?这样设计的背景和好处是什么?

  • model_parser目录下,包含

    • flatbuffers——结构描述定义在 framework.fbs 文件中,命名空间为paddle.lite.fbs.proto

      • 它除了定义OpDesc,还定义了OpDescView(这个用来做什么的?)
    • 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
  • core/model 目录下,包含:
    • base公共API:

      • VarDesc相关:VarDescAPI多继承自VarDescReadAPIVarDescWriteAPI,分别约定了可读、可写的接口虚函数
      • OpDesc相关:OpDescAPI多继承自OpDescReadAPIOpDescWriteAPI,分别约定了可读、可写的接口虚函数
      • BlockDesc相关:BlockDescAPI多继承自BlockDescReadAPIBlockDescWriteAPI,分别约定了可读、可写的接口虚函数
      • ProgramDesc相关:ProgramDescAPI多继承自ProgramDescReadAPIProgramDescWriteAPI,分别约定了可读、可写的接口虚函数
      • ParamDesc相关:ParamDescAPI多继承自ParamDescReadAPIParamDescWriteAPI,分别约定了可读、可写的接口虚函数
        • 这里还有一个 CombinedParamDescAPI,和上面类似,父类不一样,多了ParamDesc的更新操作
    • general目录下,包含
      • VarDesc类:继承自VarDescAPI,不持有任何proto相关的成员,很简洁地描述VarDesc信息
      • OpDesc类:继承自OpDescAPI,不持有任何proto相关的成员,很简洁地描述OpDesc信息
        • attrs_ 是 std::map<string, Any>
      • BlockDesc类:继承自BlockDescAPI,不持有任何proto相关的成员,很简洁地描述BlockDesc信息
      • ProgramDesc类:继承自ProgramDescAPI,不持有任何proto相关的成员,很简洁地描述ProgramDesc信息

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架构研读的更多相关文章

  1. 树莓派4B安装 百度飞桨paddlelite 做视频检测 (一、环境安装)

    前言: 当前准备重新在树莓派4B8G 上面搭载训练模型进行识别检测,训练采用了百度飞桨的PaddleX再也不用为训练部署环境各种报错发愁了,推荐大家使用. 关于在树莓派4B上面paddlelite的文 ...

  2. 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?

    ​ 参考文章: 深度剖析知识增强语义表示模型--ERNIE_财神Childe的博客-CSDN博客_ernie模型 ERNIE_ERNIE开源开发套件_飞桨 https://github.com/Pad ...

  3. 我做的百度飞桨PaddleOCR .NET调用库

    我做的百度飞桨PaddleOCR .NET调用库 .NET Conf 2021中国我做了一次<.NET玩转计算机视觉OpenCV>的分享,其中提到了一个效果特别好的OCR识别引擎--百度飞 ...

  4. 提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件

    提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件 11月5日,在『WAVE Summit+』2019 深度学习开发者秋季峰会上,百度对外发布基于 ERNIE 的语义理解 ...

  5. 百度飞桨数据处理 API 数据格式 HWC CHW 和 PIL 图像处理之间的关系

    使用百度飞桨 API 例如:Resize Normalize,处理数据的时候. Resize:如果输入的图像是 PIL 读取的图像这个数据格式是 HWC ,Resize 就需要 HWC 格式的数据. ...

  6. Ubuntu 百度飞桨和 CUDA 的安装

    Ubuntu 百度飞桨 和 CUDA 的安装 1.简介 本文主要是 Ubuntu 百度飞桨 和 CUDA 的安装 系统:Ubuntu 20.04 百度飞桨:2.2 为例 2.百度飞桨安装 访问百度飞桨 ...

  7. 【百度飞桨】手写数字识别模型部署Paddle Inference

    从完成一个简单的『手写数字识别任务』开始,快速了解飞桨框架 API 的使用方法. 模型开发 『手写数字识别』是深度学习里的 Hello World 任务,用于对 0 ~ 9 的十类数字进行分类,即输入 ...

  8. 飞桨paddlespeech语音唤醒推理C实现

    上篇(飞桨paddlespeech 语音唤醒初探)初探了paddlespeech下的语音唤醒方案,通过调试也搞清楚了里面的细节.因为是python 下的,不能直接部署,要想在嵌入式上部署需要有C下的推 ...

  9. 飞桨AI 文本实体抽取 数据准备(excel 文本标注)

    网纸: https://ai.baidu.com/easydl/app/deploy/tee/public #!/usr/bin/env python3 # -*- coding: utf-8 -*- ...

  10. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力

    ​ 飞桨 (PaddlePaddle) 以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发.功能完备. 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架.基础模型库.端到端开发 ...

随机推荐

  1. 【已解决】MySQL5.x和MySQL8.x 密码验证的区别(修改MySQL数据库密码的验证方式)

    mysql5.x使用的是 mysql_native_password mysql8.x使用的是 caching_sha2_password 1. 进入mysql mysql -u root -p 2. ...

  2. #博弈论,贪心#AT2376 [AGC014D] Black and White Tree

    题目传送门 分析 考虑到先手放一个白点后手必将在相邻位置放一个黑点, 如果没有合适的位置放黑点先手必胜,也就是问是否存在完美匹配, 直接从叶子节点到根贪心匹配即可 代码 #include <cs ...

  3. #K-D Tree#洛谷 2093 [国家集训队]JZPFAR

    题目 平面上有 \(n\) 个点.现在有 \(m\) 次询问,每次给定一个点 \((px, py)\) 和一个整数 \(k\), 输出 \(n\) 个点中离 \((px, py)\) 的距离第 \(k ...

  4. Jetty的console-capture模块

    console-capture模块用于记录Jetty运行时向标准输出和标准错误写出的信息. Java的标准输出流,即System.out. Java的标准错误流,即System.err. consol ...

  5. el-table设置列属性fixed导致滚动条无法拖动-骨灰级

    一.前言说明 网上一搜索,千篇一律的设置el-table__fixed,如: .el-table__fixed { // 左固定列 height: auto !important; bottom: 1 ...

  6. 战码先锋直播预告丨参与文档贡献,开启OpenHarmony社区贡献之旅

    OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」(本期OpenHarmony开源贡献者计划以 ...

  7. 携手HMS Core统一扫码服务, 兴业证券优理宝App提升用户扫码体验

    兴业证券优理宝App联合华为HMS Core,集成HMS Core统一扫码服务,在提升扫码成功率的同时,还支持C端用户用手机端APP扫描手表端二维码,实现行情在手机与手表间跨终端流转,行情信息,抬腕可 ...

  8. 鸿蒙HarmonyOS实战-ArkUI组件(Popup)

    一.Popup Popup组件通常用于在屏幕上弹出一个对话框或者浮动窗口.这个组件通常和其他组件一起用于用户界面的交互和反馈. Popup组件可以包含任何类型的组件或内容,比如文本.按钮.输入框.图片 ...

  9. 1、android Studio 打Jar包

    1.创建一个AndroidStudio 工程 注意下面这个Package Name 2.进入Android Studio工程中 选择Project Flies 选项 然后找到 app->src- ...

  10. jenkins 持续集成和交付——gogs安装(外篇)

    前言 因为在jenkins 过程中一般需要去处理一些git的东西,为了完整性,填补一下git管理安装,这里使用gogs,因为gogs比较小,我运行的小机器能够承受,当然只适合个人,这里用来做实验,网上 ...