选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-08-18
  • 更新:2020-09-15
  • 关键词: kmodel k210 模型 结构 数据结构 解析 maixpy
k210 kmodel 模型储存结构


K210 kmodel 简介

V3nncase v0.1.0 RC5 转换过来
V4nncase v0.2.0tflite转换过来

V4相比于V3, 支持了更多算子,但是运算速度更慢,部分算子使用了CPU运算, K210侧也使用了C++编写, 部分库会拉低速度,如果你需要移植或者优化可以注意这一点

kmodel V3 数据结构

输出层信息 各层的头 各个层数据内容
kpu_kmodel_header_t kpu_model_output_t * output_count kpu_model_layer_header_t * layers_length layers_body

这里有个注意点, kpu_kmodel_header_t 没有8字节对齐, 所以在第一层的数据实际是保存在8字节对齐处, 比如前面所有header 长度为 228 字节, 那么 第一层数据中, 头 kpu_model_conv_layer_argument_t 占用24个字节, 228+24 不是8的整数倍, 所以层数据保存在 228+24+4 处, 所以在 kpu_model_conv_layer_argument_t 中用了 layer_offset 这个来表示层数据相对于模型起始地址的偏移

  1. typedef struct
  2. {
  3. uint32_t version; // 固定 0x00000003, 0x03在低地址
  4. uint32_t flags; // 最低位 为1, 表示8bit模式
  5. uint32_t arch;
  6. uint32_t layers_length;
  7. uint32_t max_start_address;
  8. uint32_t main_mem_usage;
  9. uint32_t output_count;
  10. } kpu_kmodel_header_t;
  11. typedef struct
  12. {
  13. uint32_t address;
  14. uint32_t size;
  15. } kpu_model_output_t;
  16. typedef struct
  17. {
  18. uint32_t type;
  19. uint32_t body_size;
  20. } kpu_model_layer_header_t;

kmodel V4 数据结构

输入 输入形状 输出 常量 各层的头 各个层数据内容
struct modelv4_header memory_range*hdr.inputs runtime_shape_t*hdr.inputs memory_range*hdr.outputs hdr.constants hdr.nodes * struct node_header nodes content
  1. struct modelv4_header
  2. {
  3. uint32_t identifier; // 固定为 KMDL, L在低地址
  4. uint32_t version; // 固定为 0x00000004, 0x04 在低位
  5. uint32_t flags;
  6. uint32_t target; // CPU: 0, K210: 1
  7. uint32_t constants; // 多少个 uint_t 类型的常量
  8. uint32_t main_mem; // 主内存, 用于AI, 运行时会先把输入的数据拷贝到这里
  9. uint32_t nodes;
  10. uint32_t inputs; // input size
  11. uint32_t outputs; // output size
  12. uint32_t reserved0;
  13. };
  14. struct node_header
  15. {
  16. uint32_t opcode;
  17. uint32_t size;
  18. };
  19. struct memory_range
  20. {
  21. memory_type_t memory_type;
  22. datatype_t datatype;
  23. uint32_t start;
  24. uint32_t size;
  25. }; // 16 Bytes
  26. typedef enum _datatype
  27. {
  28. dt_float32,
  29. dt_uint8
  30. } datatype_t;
  31. typedef enum _memory_type
  32. {
  33. mem_const,
  34. mem_main,
  35. mem_k210_kpu
  36. } memory_type_t;
  37. using runtime_shape_t = std::array<int, 4>;
文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-96pk78.jpg