跳转至

NPU 模型的 API 部署流程*

1. 使用 NPU*

通过NPU编译器生成模型文件后,需要把模型文件部署到板子上。 NPU编译器生成的模型文件为 C 文件,配合我们提供的 API 接口,可以实现模型在板子上的运行。

1.1 调用 API 流程*

  • 打开 SNPU
  • 加载模型和输入数据,运行模型,得到输出数据。
  • 关闭 SNPU
gx_snpu.h
    /**
     * @brief 初始化snpu
     *
     *
     * @return snpu 初始化成功与否
     * @retval 0 正常
     * @retval -1 失败
     */
    int gx_snpu_init(void);

    /**
     * @brief 关闭snpu
     *
     *
     * @return snpu 关闭成功与否
     * @retval 0 正常
     * @retval -1 失败
     */
    int gx_snpu_exit(void);

    /**
     * @brief snpu 输入和输出的数据格式
    */
    typedef short GX_SNPU_FLOAT;

    /**
     * @brief snpu工作状态
    */
    typedef enum {
        GX_SNPU_IDLE,    /**< 空闲状态*/
        GX_SNPU_BUSY,    /**< 工作忙状态*/
        GX_SNPU_STALL,   /**< 停滞状态*/
    } GX_SNPU_STATE;

    /**
     * @brief snpu 回调函数,任务处理完后,中断里面执行该函数
    */
    typedef int (*GX_SNPU_CALLBACK)(int module_id, GX_SNPU_STATE state, void *private_data);

    /**
     * @brief snpu 工作任务
    */
    typedef struct {
        int module_id;    /**< 模块标识号          module id defined by programmer*/
        void *data;       /**< 临时数据内容区域    data_content in model.h*/
        void *input;      /**< 模型输入数据        input in model.h*/
        void *output;     /**< 模型输出数据        output in model.h*/
        void *cmd;        /**< 指令内容区域        cmd_content in model.h*/
        void *weight;     /**< 权重内容区域        weight_content in model.h*/
        void *cache;      /**< 权重缓存区域        cache_content in model.h*/
    } GX_SNPU_TASK;

    /**
     * FFT 算子类型
     */
    typedef enum {
        GX_SNPU_REAL_FFT_256          = 0x00, /*!< 256点实数FFT   输入256个short,输出258个short */
        GX_SNPU_REAL_IFFT_256         = 0x01, /*!< 256点实数IFFT  输入258个short,输出256个int */
        GX_SNPU_CPLX_FFT_256          = 0x02, /*!< 256点复数FFT   输入512个short,输出512个short */
        GX_SNPU_CPLX_IFFT_256         = 0x03, /*!< 256点复数IFFT  输入512个short,输出512个short */
        GX_SNPU_REAL_FFT_512          = 0x04, /*!< 512点实数FFT   输入512个short,输出514个short */
        GX_SNPU_REAL_IFFT_512         = 0x05, /*!< 512点实数IFFT  输入514个short,输出512个int */
        GX_SNPU_CPLX_FFT_512          = 0x06, /*!< 512点复数FFT   输入1024个short,输出1024个short */
        GX_SNPU_CPLX_IFFT_512         = 0x07, /*!< 512点复数IFFT  输入1024个short,输出1024个short */
    } GX_SNPU_FFT_TYPE;

    /**
     * FFT 算子信息
     */
    typedef struct {
        int ifft_input_shift;              /*!< 外部配置的ifft数据偏移,有符号数,正数为右移,负数为左移*/
        unsigned int phy_fft_src_addr;     /*!< 计算数据输入地址, 4字节对齐 */
        unsigned int phy_fft_dst_addr;     /*!< 计算结果目的地址, 4字节对齐 */
        GX_SNPU_FFT_TYPE fft_type;         /*!< 算子类型 */
    } GX_SNPU_FFT_INFO;

    /**
     * @brief 异步方式运行一个工作任务
     *
     * @param task 工作任务, 详细说明请参考 gxdocref GX_SNPU_TASK
     * @param callback 回调函数,任务处理完后,中断里面执行该函数, 详细说明请参考 gxdocref GX_SNPU_CALLBACK
     * @param private_data 回调函数的参数
     *
     * @return snpu 任务工作状态
     * @retval 0  正常
     * @retval -1 失败
     */
    int gx_snpu_run_task(GX_SNPU_TASK *task, GX_SNPU_CALLBACK callback, void *private_data);

    /**
     * @brief 同步方式运行一个工作任务
     *
     * @param task 工作任务, 详细说明请参考 gxdocref GX_SNPU_TASK
     *
     * @return snpu 任务工作状态
     * @retval 0  正常
     * @retval -1 失败
     */
    int gx_snpu_run_task_sync(GX_SNPU_TASK *task);

    /**
     * @brief 同步方式运行FFT算子,运行该函数前需要先调用gx_snpu_pause,完成后需调用gx_snpu_resume才能恢复模型运行
     *
     * @param fft_info FFT算子的信息, 详细说明请参考 gxdocref GX_SNPU_FFT_INFO
     * @param out_shift FFT计算输出是short类型,若要得到float32,需做out_shift移位,shift为正,表示左移;shift为负,表示右移;
     *
     * @return snpu 任务工作状态
     * @retval 0  正常
     * @retval -1 失败
     */
    int gx_snpu_run_fft(GX_SNPU_FFT_INFO *fft_info, int *out_shift);

    /**
     * @brief snpu 获得工作状态
     *
     * @return snpu 任务工作状态
     * @retval GX_SNPU_IDLE    空闲状态
     * @retval GX_SNPU_BUSY    工作忙状态
     * @retval GX_SNPU_STALL   停滞状态
    */
    GX_SNPU_STATE gx_snpu_get_state(void);

    /**
     * @brief 暂停snpu运行
     *
     * @return snpu 任务工作状态
     * @retval 0  正常
     * @retval -1 失败
    */
    int gx_snpu_pause(void);

    /**
     * @brief 恢复snpu运行
     *
     * @return snpu 任务工作状态
     * @retval 0  正常
     * @retval -1 失败
    */
    int gx_snpu_resume(void);