飛槳PaddleLite架構研讀

一、架構全景圖

二、源碼詳細解讀

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);
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章