315 lines
9.1 KiB
C
315 lines
9.1 KiB
C
/**
|
|
* @file kmdw_model.h
|
|
* @brief model manager APIs
|
|
*
|
|
* @copyright Copyright (c) 2019 Kneron Inc. All rights reserved.
|
|
*/
|
|
#ifndef __KMDW_MODEL_H__
|
|
#define __KMDW_MODEL_H__
|
|
|
|
#include "cmsis_os2.h"
|
|
#include "base.h"
|
|
#include "ipc.h" /* for MULTI_MODEL_MAX */
|
|
#include "model_type.h"
|
|
|
|
|
|
#define KMDW_MODEL_ALL_MODELS -1 /**< A term means ALL_MODELS */
|
|
#define KMDW_MODEL_MAX_MODEL_COUNT MULTI_MODEL_MAX /**< MAX model count for DME and flash */
|
|
|
|
/* These crc values will ONLY change if model is changed in FLASH */
|
|
#define MODEL_INFO_SUM32_VALUE 0x00eee074 /**< SUM32 value */
|
|
|
|
#define MODEL_IN_DDR 1 /**< - */
|
|
#define MODEL_IN_FLASH 0 /**< - */
|
|
|
|
/**
|
|
* @brief npu data format
|
|
*/
|
|
enum kmdw_model_data_layout {
|
|
DATA_FMT_UNKNOWN = -1,
|
|
DATA_FMT_4W4C8B = 16,
|
|
DATA_FMT_16W1C8B = 8
|
|
};
|
|
|
|
/**
|
|
* @brief return code of kmdw_model_run()
|
|
*/
|
|
enum kmdw_model_rc {
|
|
// 0 - 9 is reserved for ncpu return
|
|
// defined in ipc.h
|
|
// IMAGE_STATE_INACTIVE == 0
|
|
// IMAGE_STATE_ACTIVE == 1
|
|
// IMAGE_STATE_NPU_DONE == 2
|
|
// IMAGE_STATE_DONE == 3
|
|
KMDW_MODEL_RUN_RC_ABORT = 10, /**< return code: abort */
|
|
KMDW_MODEL_RUN_RC_ERROR = 11, /**< return code: error */
|
|
KMDW_MODEL_RUN_RC_END /**< dummy item for enum table end */
|
|
};
|
|
|
|
/**
|
|
* @brief data structure of model run time
|
|
*/
|
|
typedef struct kmdw_model_img_run_time_s {
|
|
uint32_t round_trip_time; /**< round trip time */
|
|
uint32_t pre_proc_time; /**< pre process time */
|
|
uint32_t npu_proc_time; /**< npu process time */
|
|
uint32_t post_proc_time; /**< post process time */
|
|
} kmdw_model_run_time_t;
|
|
|
|
/**
|
|
* @brief a mask for easy read fw_info data
|
|
*/
|
|
typedef struct kmdw_model_fw_info_s {
|
|
uint32_t model_count; /**< model count */
|
|
struct kdp_model_s models[1]; /**< the address of dynamical count of models */
|
|
} kmdw_model_fw_info_t;
|
|
|
|
/**
|
|
* @brief a mask for easy read fw_info_ext data
|
|
*/
|
|
typedef struct kmdw_model_fw_info_ext_s {
|
|
uint32_t model_dram_addr_end; /**< model end address */
|
|
uint32_t model_total_size; /**< model total size */
|
|
uint32_t model_checksum; /**< checksum */
|
|
} kmdw_model_fw_info_ext_t;
|
|
|
|
/**
|
|
* @brief a basic descriptor for a input/output node in model
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t index; /**< index of node */
|
|
uint32_t shape_npu_len; /**< length of npu shape */
|
|
uint32_t shape_npu[4]; /**< npu shape BxCxHxW (Compatable with KL720 NEFv1 4-dims shape interface) */
|
|
uint32_t data_layout; /**< npu memory layout */
|
|
float scale; /**< scale of node (KL520 only support layer wised quantization param) */
|
|
int32_t radix; /**< radix of node (KL520 only support layer wised quantization param) */
|
|
} kmdw_model_tensor_descriptor_t;
|
|
|
|
/* ############################
|
|
* ## Public Functions ##
|
|
* ############################ */
|
|
|
|
/**
|
|
* @brief Init model functionality
|
|
*/
|
|
void kmdw_model_init(void);
|
|
|
|
/**
|
|
* @brief A wrapper of load_model from flash
|
|
* @param model_index_p: model info index,
|
|
* 0-n: info_index of model to load
|
|
* -1 means to load all models
|
|
* @return 0: failes; 1: OK(means 1 model is loaded)
|
|
*/
|
|
int32_t kmdw_model_load_model(int8_t model_info_index_p);
|
|
|
|
|
|
/**
|
|
* @brief A wrapper of load_model_info
|
|
* @param [in] is_model_from_ddr: if model is from ddr/host command
|
|
* @return reloaded model count; 0 means failed
|
|
*/
|
|
int32_t kmdw_model_reload_model_info(bool from_ddr);
|
|
|
|
|
|
/**
|
|
* @brief Refresh all models
|
|
* @return refreshed model count; 0 means failed
|
|
*/
|
|
int32_t kmdw_model_refresh_models(void);
|
|
|
|
|
|
/**
|
|
* @brief Output model_info of specified index
|
|
* @param[in] idx_p the index of programmed models
|
|
* @return model_info defined in ipc.h
|
|
*/
|
|
struct kdp_model_s* kmdw_model_get_model_info(int idx_p);
|
|
|
|
|
|
/**
|
|
* @brief Output total number of models and all model IDs
|
|
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
|
|
* @return a list of model count, id0, id1, id2
|
|
* @note only obtain data from ddr space
|
|
* model must be loaded from file or flash to ddr first
|
|
*/
|
|
uint32_t *kmdw_model_get_all_model_info(bool trust_ddr_data);
|
|
|
|
/**
|
|
* @brief Output model end address defined in model file
|
|
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
|
|
* @return model end address when loaded
|
|
* @note only obtain data from ddr space
|
|
* model must be loaded from file or flash to ddr first
|
|
*/
|
|
uint32_t kmdw_model_get_model_end_addr(bool trust_ddr_data);
|
|
|
|
/**
|
|
* @brief Output crc value
|
|
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
|
|
* @return crc value
|
|
* @note only obtain data from ddr space
|
|
* model must be loaded from file or flash to ddr first
|
|
*/
|
|
uint32_t kmdw_model_get_crc(bool trust_ddr_data);
|
|
|
|
/**
|
|
* @brief Get the buffer address of fw_info
|
|
* @param[in] trust_ddr_data if true, no need to check validness of ddr data
|
|
* @return the buffer address of fw_info or NULL when model is not loaded
|
|
*/
|
|
kmdw_model_fw_info_t* kmdw_model_get_fw_info(bool trust_ddr_data);
|
|
|
|
|
|
/**
|
|
* @brief Check if a model is in flash
|
|
* @param[in] model_type model type
|
|
* @return 1 - the model is in flash; 0 - not in flash
|
|
*/
|
|
int kmdw_model_is_model_in_flash(uint32_t model_type);
|
|
|
|
|
|
/**
|
|
* @brief Specify output address for model run in ncpu/npu
|
|
* @return always 0
|
|
* @note must be called after kmdw_model_config_model()
|
|
*/
|
|
int32_t kmdw_model_config_result(osEventFlagsId_t result_evt, uint32_t result_evt_flag);
|
|
|
|
|
|
/**
|
|
* @brief Config model image
|
|
* @param img_cfg image config
|
|
* @param ext_param extra param
|
|
*/
|
|
void kmdw_model_config_img(struct kdp_img_cfg *img_cfg, void *ext_param);
|
|
|
|
|
|
/**
|
|
* @brief Get raw image config
|
|
* @param idx image index
|
|
* @return raw image config
|
|
*/
|
|
struct kdp_img_raw_s* kmdw_model_get_raw_img(int idx);
|
|
|
|
|
|
/**
|
|
* @brief Run model
|
|
* @param tag model tag
|
|
* @param output model output
|
|
* @param model_type model type
|
|
* @param dme DME mode
|
|
* @return kmdw_model_rc
|
|
*/
|
|
int kmdw_model_run(const char *tag, void *output, uint32_t model_type, bool dme);
|
|
|
|
|
|
/**
|
|
* @brief Abort model execution
|
|
*/
|
|
void kmdw_model_abort(void);
|
|
|
|
|
|
/**
|
|
* @brief Get round-trip/pre/npu/post times
|
|
* @param [in] img_idx raw image index
|
|
* @param [out] run_time run time of pre/npu/post/
|
|
* @return void
|
|
*/
|
|
void kmdw_model_get_run_time(int img_idx, kmdw_model_run_time_t *run_time);
|
|
|
|
|
|
/**
|
|
* @brief Check if a model is loaded in memory
|
|
* @param[in] model_type model type
|
|
* @return 1 - loaded in memory; 0 - not loaded
|
|
*/
|
|
int kmdw_model_is_model_loaded(uint32_t model_type);
|
|
|
|
|
|
/**
|
|
* @brief Set model storage location
|
|
* @param[in] model_inddr // model is from flash : false, ddr : true
|
|
*/
|
|
void kmdw_model_set_location(bool model_inddr);
|
|
|
|
|
|
/**
|
|
* @brief Get model storage location
|
|
* @return 1 - DDR; 0 - Flash
|
|
*/
|
|
bool kmdw_model_get_location(void);
|
|
|
|
|
|
/**
|
|
* @brief Get model input tensor/node number
|
|
* @param[in] model_type model type
|
|
* @return input tensor/node number, 0 means failed
|
|
*/
|
|
int kmdw_model_get_input_tensor_num(uint32_t model_type);
|
|
|
|
|
|
/**
|
|
* @brief Get model input tensor/node information
|
|
* @param[in] model_type model type
|
|
* @param[in] tensor_idx input tensor index
|
|
* @param[out] tensor_info input tensor information
|
|
* @return 1: success; 0: fail
|
|
*/
|
|
int kmdw_model_get_input_tensor_info(uint32_t model_type, uint32_t tensor_idx, kmdw_model_tensor_descriptor_t *tensor_info);
|
|
|
|
|
|
/**
|
|
* @brief Get model output tensor/node number
|
|
* @param[in] model_type model type
|
|
* @return output tensor/node number, 0 means failed
|
|
*/
|
|
int kmdw_model_get_output_tensor_num(uint32_t model_type);
|
|
|
|
|
|
/**
|
|
* @brief Check if a model is loaded in memory
|
|
* @param[in] model_type model type
|
|
* @param[in] tensor_idx output tensor index
|
|
* @param[out] tensor_info output tensor information
|
|
* @return 1: success; 0: fail
|
|
*/
|
|
int kmdw_model_get_output_tensor_info(uint32_t model_type, uint32_t tensor_idx, kmdw_model_tensor_descriptor_t *tensor_info);
|
|
|
|
#ifdef EMBED_CMP_NPU
|
|
/**
|
|
* @brief A wrapper of adding or update specific model configuration
|
|
* @param model_type model type
|
|
* @param cmd_len model command length
|
|
* @param wt_len model weight length
|
|
* @param input_len input data length
|
|
* @param output_len output data length
|
|
* @param setup_len setup data length
|
|
* @param cmd_mem_addr model command memory address
|
|
* @param wt_mem_addr model weight memory address
|
|
* @param input_mem_addr input data memory address
|
|
* @param output_mem_addr output data memory address
|
|
* @param setup_mem_addr setup data memory address
|
|
* @return int8_t 0: config ok
|
|
* -1: model not found
|
|
*/
|
|
int8_t kmdw_model_add_update_model(uint32_t model_type,
|
|
int cmd_len, int wt_len, int input_len, int output_len, int setup_len,
|
|
uint32_t cmd_mem_addr, uint32_t wt_mem_addr,
|
|
uint32_t input_mem_addr, uint32_t output_mem_addr, uint32_t setup_mem_addr);
|
|
|
|
#endif // EMBED_CMP_NPU
|
|
|
|
#if DEBUG
|
|
|
|
/**
|
|
* @brief Dump model debug info
|
|
*/
|
|
void kmdw_model_dump_model_info(void);
|
|
|
|
#endif
|
|
|
|
#endif
|