前言

概述

本文档详细描述了_图像分析引擎_2开发和_图像分析引擎_1的开发差异。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

SS928

V100

SS927

V100

读者对象

本文档主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

修订记录

修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。

文档版本

发布日期

修改说明

00B01

2025-09-15

第1次临时版本发布。

SDK接口差异

风格差异

图像分析引擎1为ACL接口,图像分析引擎2为SVP ACL接口。

为了避免编译时符号冲突,SVP ACL使用linux风格,宏定义和枚举采用SVP_ACL_前缀;ACL使用的驼峰风格,宏定义和枚举采用ACL_前缀。函数、宏定义、枚举以及结构体详细差异参见表1

表 1 风格差异示例

差异

ACL接口

SVP_ACL接口

函数

aclInit(const char *configPath)
svp_acl_init(const char *config_path)

宏定义

#define ACL_MAX_DIM_CNT          128
#define SVP_ACL_MAX_DIM_CNT          128

枚举

typedef enum aclrtRunMode {
    ACL_DEVICE,
    ACL_HOST,
} aclrtRunMode;
typedef enum svp_acl_rt_run_mode {
    SVP_ACL_DEVICE,
    SVP_ACL_HOST,
} svp_acl_rt_run_mode;

结构体

typedef struct aclmdlIODims {
    char name[ACL_MAX_TENSOR_NAME_LEN];
    size_t dimCount;
    int64_t dims[ACL_MAX_DIM_CNT];
} aclmdlIODims;
typedef struct svp_acl_mdl_io_dims {
    char name[SVP_ACL_MAX_TENSOR_NAME_LEN];
    size_t dim_count;
    int64_t dims[SVP_ACL_MAX_DIM_CNT];
} svp_acl_mdl_io_dims;

使用差异

创建databuffer函数

由于_图像分析引擎_2逻辑在执行的时候,输入输出数据需要传入stride,用于逻辑读/写操作时快速跳到下一行,因此在创建和更新data buffer的时候会增加一个stride入参。

表 1 创建data buffer函数差异

功能

ACL函数

SVP_ACL函数

创建

aclCreateDataBuffer(void *data, size_t size);
svp_acl_data_buffer *svp_acl_create_data_buffer(void *data, size_t size, size_t stride)

更新

aclUpdateDataBuffer(aclDataBuffer *dataBuffer, void *data, size_t size);
svp_acl_update_data_buffer(svp_acl_data_buffer *data_buffer, void *data, size_t size, size_t stride);

由于引入stride,所以SVP ACL接口返回的输入输出size是按照stride对齐后的内存大小,为了方便获取stride,SVP_ACL接口新增了与stride操作相关的函数,增加函数见下表:

表 2 新增stride相关函数

功能

SVP_ACL函数

备注

从data buffer中获取配置的stride

size_t svp_acl_get_data_buffer_stride(const svp_acl_data_buffer *data_buffer);

无。

获取模型输入数据的默认stride

size_t svp_acl_mdl_get_input_default_stride(const svp_acl_mdl_desc *model_desc, size_t index);

stride按照输入维度最后一维对齐。

获取模型输出数据的默认stride

size_t svp_acl_mdl_get_output_default_stride(const svp_acl_mdl_desc *model_desc, size_t index);

stride按照输出维度最后一维对齐。

模型加载函数

SVP_ACL模型加载函数为svp_acl_mdl_load_from_mem(),其实现与ACL对应接口的差异如下。

表 1 模型加载函数差异

说明

函数

差异

ACL模型加载函数

aclError aclmdlLoadFromMem(const void *model,  size_t modelSize, uint32_t *modelId);
  1. 会将model内存中存储的权重参数拷贝到内部开辟的一块内存,因此该接口调用完后,model内存可以被释放。
  2. task_buf和work_buf都是内部管理

SVP_ACL模型加载

svp_acl_error svp_acl_mdl_load_from_mem(const void *model, size_t model_size, uint32_t *model_id)
  1. 不会拷贝model内存中的权重到其他内存,因此在卸载模型之前,model内存不能被释放。
  2. task_buf和work_buf由用户管理。

获取模型输入个数函数

为了使模型独立于device,context以及stream,SVP ACL将task_buf和work_buf独立出来由用户管理,模型执行的时候作为输入传入,在保证task_buf和work_buf正确使用的情况下,使得模型可以同时被同步,异步,多线程或者多device执行,输入变化如图1所示。

图 1 模型输入/输出数据

因此SVP ACL修改了模型输入接口的特性,差异说明如表1所示。

表 1 获取输入个数接口差异

说明

函数

差异

ACL获取模型输入个数函数

size_t aclmdlGetNumInputs(aclmdlDesc *modelDesc);

获取的是实际模型输入个数M。

SVP_ACL获取模型输入个数函数

size_t svp_acl_mdl_get_num_inputs(const svp_acl_mdl_desc *model_desc)

获取的个数比模型实际输入个数多2个,为M+2。

依据数据类型获取数据大小

SVP ACL为了支持紧密排布的RAW数据,如输入为12bit或14bit紧密排布。这样数据bit长度就不是8bit的整数倍,无法用Byte为单位表示,因此SVP ACL依据数据类型获取数据大小的时候返回值为bit数,而不是Byte数,差异如表1所示。

表 1 获取数据大小接口差异

说明

函数

差异

ACL依据数据类型获取数据size

size_t aclDataTypeSize(aclDataType dataType);

返回值为Byte数

SVP_ACL依据数据类型获取数据size

size_t svp_acl_data_type_size(svp_acl_data_type data_type)

返回值为bit数。

板端环境安装差异

图像分析引擎1需要配置两个环境变量LD_LIBRARY_PATH以及ASCEND_AACPU_KERNEL_PATH,以SS928V100为例,相关库路径为/xxx(客户自定义)/smp/a55_linux/mpp/out/lib/nnn,其他解决方案类似,需要强调的是ASCEND_AACPU_KERNEL_PATH不支持路径拼接,因此在设定时需注意不能使用拼接路径。

图像分析引擎2只需要配置环境变量LD_LIBRARY_PATH,以SS928V100为例,相关库路径为/xxx(客户自定义)/smp/a55_linux/mpp/out/lib/svp_nnn,其他解决方案类似。

Recurrent网络执行

ACL不支持T可变,只支持N可变,也就是输入帧数一定是T的整数倍,SVP ACL支持Recurrent函数T可以变,N只能为1,因此增加接口用于用户配置每次执行中实际的总帧数的接口:

svp_acl_error svp_acl_mdl_set_total_t(uint32_t model_id, svp_acl_mdl_dataset *dataset, uint64_t total_t)

动态batch

SVP ACL支持配置任意batch值,只要不超过目前SDK的约束范围,图像最大batch为256,非图像最大batch是5000。在执行前模型前通过svp_acl_mdl_set_dynamic_batch_size()函数配置本次执行要处理的实际batch数。可以通过svp_acl_mdl_get_dynamic_batch()接口获取模型中配置的batch数(只支持一个档位),注意获取的不是svp_acl_mdl_set_dynamic_batch_size()函数配置的batch数。

获取模型中模式识别cpu任务个数

如果模型中含有_模式识别_CPU算子,模型执行异步推理的时候需要起一个线程调用_模式识别_CPU任务处理函数,为了对外能感知模型中是否函数_模式识别_CPU算子,从而决定是否要起_模式识别_CPU任务处理线程,SVP ACL增加函数来获取模型中_模式识别_CPU任务个数,如果为0,则不需要起线程,反之则要起_模式识别_CPU任务处理线程,新增接口如下。

svp_acl_error svp_acl_ext_get_mdl_aacpu_task_num(uint32_t model_id, uint32_t *num);

数据排布

  1. SVP_ACL统一输入输出数据格式如图1所示(YVU420SP/YUV420SP除外)。

    • 如果是RGB_PACKAGE格式,data_xx数据类型为U24,通道数为1。

    • 如果是XRGB_PACKAGE格式,data_xx数据类型为U32,通道数为1。

    图 1 模型输入/输出数据排布(2通道,batch为2示意图)

  2. YVU420SP/YUV420SP数据排布如图2所示。

    图 2 YVU420SP数据排布(2通道,frame为2示意图)

  3. 在SVP ACL为了让使用者软件开发人员不用感知检测网网络类型,将检测网输出框结果排布统一成如图3格式。

    图 3 检测网输出框结果数据排布(2通道,chn为2示意图)

  4. SVP ACL支持检测网阈值通过data层传入,阈值输入固定长度为4,分别nms_threshold,score_threshold,min_height,min_width,排布格式如图4所示。

    图 4 阈值输入数据排布

支持的接口

表 1 支持的接口差异

目录

目录或ACL接口或ACL数据类型

目录或ACL接口

SVP_ACL是否有对应接口或数据类型

系统配置

aclInit

-

aclFinalize

-

aclrtGetVersion

-

aclrtGetSocVersion

-

aclGetRecentErrMsg

-

Device管理

aclrtSetDevice

-

aclrtResetDevice

-

aclrtGetDevice

-

aclrtGetRunMode

-

aclrtSetTsDevice

-

aclrtGetDeviceCount

-

Context管理

aclrtCreateContext

-

aclrtDestroyContext

-

aclrtSetCurrentContext

-

aclrtGetCurrentContext

-

算力Group查询与设置

aclrtSetGroup

-

aclrtGetGroupCount

-

aclrtCreateGroupInfo

-

aclrtDestroyGroupInfo

-

aclrtGetAllGroupInfo

-

aclrtGetGroupInfoDetail

-

Stream管理

aclrtCreateStream

-

aclrtDestroyStream

-

同步等待

aclrtCreateEvent

-

aclrtCreateEventWithFlag

-

aclrtDestroyEvent

-

aclrtRecordEvent

-

aclrtResetEvent

-

aclrtQueryEvent

-

aclrtSynchronizeEvent

-

aclrtEventElapsedTime

-

aclrtStreamWaitEvent

-

aclrtSynchronizeDevice

-

aclrtSynchronizeStream

-

aclrtSubscribeReport

-

aclrtLaunchCallback

-

aclrtProcessReport

-

aclrtUnSubscribeReport

-

aclrtSetExceptionInfoCallback

-

aclrtGetTaskIdFromExceptionInfo

-

aclrtGetStreamIdFromExceptionInfo

-

aclrtGetThreadIdFromExceptionInfo

-

aclrtGetDeviceIdFromExceptionInfo

-

aclrtSetOpWaitTimeout

-

内存管理

aclrtMalloc

-

aclrtMallocCached

-

aclrtMemFlush

-

aclrtMemInvalidate

-

aclrtFree

-

aclrtMallocHost

-

aclrtFreeHost

-

aclrtMemset

-

aclrtMemsetAsync

-

aclrtMemcpy

-

aclrtMemcpyAsync

-

aclrtGetMemInfo

-

aclrtDeviceCanAccessPeer

-

aclrtDeviceEnablePeerAccess

-

aclrtDeviceDisablePeerAccess

-

模型加载与执行

aclmdlLoadFromFile

-

aclmdlLoadFromMem

-

aclmdlLoadFromFileWithMem

-

aclmdlLoadFromMemWithMem

-

aclmdlLoadFromFileWithQ

-

aclmdlLoadFromMemWithQ

-

aclmdlExecute

-

aclmdlExecuteAsync

-

aclmdlUnload

-

aclmdlQuerySize

-

aclmdlQuerySizeFromMem

-

aclmdlSetDynamicBatchSize

-

aclmdlSetDynamicHWSize

-

aclmdlSetInputAAPP

-

aclmdlGetFirstAappInfo

-

aclmdlGetAappType

-

aclmdlSetAAPPByInputIndex

-

aclmdlSetInputDynamicDims

-

aclmdlCreateAndGetOpDesc

-

aclmdlInitDump

-

aclmdlSetDump

-

aclmdlFinalizeDump

-

aclmdlSetConfigOpt

-

aclmdlLoadWithConfig

-

算子编译

aclopRegisterCompileFunc

-

aclopUnregisterCompileFunc

-

aclopCreateKernel

-

aclopSetKernelArgs

-

aclopSetKernelWorkspaceSizes

-

aclopUpdateParams

-

算子加载与执行

aclopSetModelDir

-

aclopLoad

-

aclopExecute

-

aclopExecuteV2

-

aclopExecWithHandle

-

aclopInferShape

-

CBLAS接口

aclblasGemvEx

-

aclblasCreateHandleForGemvEx

-

aclblasHgemv

-

aclblasCreateHandleForHgemv

-

aclblasS8gemv

-

aclblasCreateHandleForS8gemv

-

aclblasGemmEx

-

aclblasCreateHandleForGemmEx

-

aclblasHgemm

-

aclblasCreateHandleForHgemm

-

aclblasS8gemm

-

aclblasCreateHandleForS8gemm

-

aclopCast

-

aclopCreateHandleForCast

-

媒体数据处理

内存申请与释放

acldvppMalloc

acldvppFree

通道创建与释放

acldvppCreateChannel

acldvppDestroyChannel

aclvdecCreateChannel

aclvdecDestroyChannel

aclvencCreateChannel

aclvencDestroyChannel

VPC功能

acldvppVpcResizeAsync

acldvppVpcCropAsync

acldvppVpcBatchCropAsync

acldvppVpcCropAndPasteAsync

acldvppVpcBatchCropAndPasteAsync

acldvppVpcBatchCropAndMakeBorder

acldvppVpcConvertColorAsync

acldvppVpcPyrDownAsync

acldvppVpcEqualizeHistAsync

acldvppVpcMakeBorderAsync

acldvppVpcCalcHistAsync

JPEGD功能

acldvppJpegDecodeAsync

acldvppJpegGetImageInfo

acldvppJpegGetImageInfoV2

acldvppJpegPredictDecSize

JPEGE功能

acldvppJpegEncodeAsync

acldvppJpegPredictEncSize

PNGD功能

acldvppPngDecodeAsync

acldvppPngGetImageInfo

acldvppPngPredictDecSize

VDEC功能

aclvdecSendFrame

aclvdecSendSkippedFrame

aclvdecCallback

VENC功能

aclvencSendFrame

aclvencCallback

日志管理

aclAppLog

-

特征向量检索

aclfvInit

-

aclfvRelease

-

aclfvRepoAdd

-

aclfvRepoDel

-

aclfvDel

-

aclfvModify

-

aclfvSearch

-

Profiling配置

aclprofInit

-

aclprofStart

-

aclprofStop

-

aclprofFinalize

-

aclprofModelSubscribe

-

aclprofModelUnSubscribe

-

aclprofGetOpDescSize

-

aclprofGetOpNum

-

aclprofGetOpTypeLen

-

aclprofGetOpType

-

aclprofGetOpNameLen

-

aclprofGetOpName

-

aclprofGetOpStart

-

aclprofGetOpEnd

-

aclprofGetOpDuration

-

aclprofGetModelId

-

数据类型转换及获取数据大小

aclDataTypeSize

-

aclFloat16ToFloat

-

aclFloatToFloat16

-

SoC扩展接口

aclextProcessAacpuTask

-

数据类型及其操作接口

aclError

-

aclDataType

-

aclFloat16

-

aclFormat

-

acldvppPixelFormat

-

acldvppStreamFormat

-

acldvppJpegFormat

-

aclrtContext

-

aclrtStream

-

aclrtEvent

-

aclrtEventStatus

-

aclrtRunMode

-

aclTransType

-

aclComputeType

-

aclfvSearchType

-

aclAappInputFormat

-

aclAappInfo

-

aclAappDims

-

aclmdlIODims

-

aclrtGroupAttr

-

aclprofAacoreMetrics

-

acldvppBorderType

-

aclmdlInputAappType

-

aclvencChannelDescParamType

-

aclmdlConfigAttr

-

aclMemType

-

aclmdlAAPP

-

-

aclmdlCreateAAPP

-

aclmdlSetAAPPCscParams

-

aclmdlSetAAPPInputFormat

-

aclmdlSetAAPPRbuvSwapSwitch

-

aclmdlSetAAPPAxSwapSwitch

-

aclmdlSetAAPPSrcImageSize

-

aclmdlSetAAPPScfParams

-

aclmdlSetAAPPCropParams

-

aclmdlSetAAPPPaddingParams

-

aclmdlSetAAPPDtcPixelMean

-

aclmdlSetAAPPDtcPixelMin

-

aclmdlSetAAPPPixelVarReci

-

aclmdlDestroyAAPP

aclopHandle

aclopCreateHandle

aclopDestroyHandle

aclDataBuffer

aclCreateDataBuffer

aclDestroyDataBuffer

aclGetDataBufferAddr

aclGetDataBufferSize

aclGetDataBufferSizeV2

aclUpdateDataBuffer

aclmdlDataset

aclmdlCreateDataset

aclmdlDestroyDataset

aclmdlAddDatasetBuffer

aclmdlGetDatasetNumBuffers

aclmdlGetDatasetBuffer

aclmdlSetDatasetTensorDesc

aclmdlDesc

aclmdlCreateDesc

aclmdlDestroyDesc

aclmdlGetDesc

aclmdlGetNumInputs

aclmdlGetNumOutputs

aclmdlGetInputSizeByIndex

aclmdlGetOutputSizeByIndex

aclmdlGetInputDims

aclmdlGetInputDimsV2

aclmdlGetOutputDims

aclmdlGetInputNameByIndex

aclmdlGetOutputNameByIndex

aclmdlGetInputFormat

aclmdlGetOutputFormat

aclmdlGetInputDataType

aclmdlGetOutputDataType

aclmdlGetInputIndexByName

aclmdlGetOutputIndexByName

aclmdlGetDynamicBatch

aclmdlGetDynamicHW

aclmdlGetCurOutputDims

aclmdlGetInputDynamicGearCount

aclmdlGetInputDynamicDims

aclmdlGetTensorRealName

aclTensorDesc

aclCreateTensorDesc

aclDestroyTensorDesc

aclGetTensorDescType

aclGetTensorDescFormat

aclGetTensorDescSize

aclGetTensorDescElementCount

aclGetTensorDescNumDims

aclGetTensorDescDim

aclGetTensorDescDimV2

aclGetTensorDescDimRange

aclSetTensorDescName

aclGetTensorDescName

aclTransTensorDescFormat

aclSetTensorStorageShape

aclSetTensorStorageFormat

aclSetTensorOriginFormat

aclSetTensorOriginShape

aclSetTensorShape

aclSetTensorFormat

aclSetTensorShapeRange

aclSetTensorDynamicInput

aclGetTensorDescByIndex

aclGetTensorDescAddress

aclSetTensorConst

aclSetTensorPlaceMent

aclopAttr

aclopCreateAttr

aclopDestroyAttr

aclopSetAttrBool

aclopSetAttrInt

clopSetAttrFloat

aclopSetAttrString

aclopSetAttrListBool

aclopSetAttrListInt

aclopSetAttrListFloat

aclopSetAttrListString

aclopSetAttrListListInt

acldvppChannelDesc

acldvppCreateChannelDesc

acldvppDestroyChannelDesc

acldvppGetChannelDescChannelId

acldvppSetChannelDescMode

acldvppPicDesc

acldvppCreatePicDesc

acldvppSetPicDesc系列接口

acldvppGetPicDesc系列接口

acldvppDestroyPicDesc

acldvppRoiConfig

acldvppCreateRoiConfig

acldvppSetRoiConfig系列接口

acldvppDestroyRoiConfig

acldvppResizeConfig

acldvppCreateResizeConfig

acldvppSetResizeConfigInterpolation

acldvppGetResizeConfigInterpolation

acldvppDestroyResizeConfig

acldvppJpegeConfig

acldvppCreateJpegeConfig

acldvppSetJpegeConfigLevel

acldvppGetJpegeConfigLevel

acldvppDestroyJpegeConfig

aclvdecChannelDesc

aclvdecCreateChannelDesc

aclvdecSetChannelDesc系列接口

aclvdecGetChannelDesc系列接口

aclvdecDestroyChannelDesc

acldvppStreamDesc

acldvppCreateStreamDesc

acldvppSetStreamDesc系列接口

acldvppGetStreamDesc系列接口

acldvppDestroyStreamDesc

aclvdecFrameConfig

aclvdecCreateFrameConfig

aclvdecDestroyFrameConfig

acldvppBatchPicDesc

acldvppCreateBatchPicDesc

acldvppGetPicDesc

acldvppDestroyBatchPicDesc

aclvencChannelDesc

aclvencCreateChannelDesc

aclvencSetChannelDesc系列接口

aclvencGetChannelDesc系列接口

aclvencSetChannelDescParam

aclvencGetChannelDescParam

aclvencDestroyChannelDesc

aclvencFrameConfig

aclvencCreateFrameConfig

aclvencSetFrameConfig系列接口

aclvencGetFrameConfig系列接口

aclvencDestroyFrameConfig

acldvppLutMap

acldvppCreateLutMap

acldvppDestroyLutMap

acldvppGetLutMapDims

acldvppGetLutMapData

acldvppBorderConfig

acldvppCreateBorderConfig

acldvppSetBorderConfig系列接口

acldvppGetBorderConfig系列接口

acldvppDestroyBorderConfig

acldvppHist

acldvppCreateHist

acldvppDestroyHist

acldvppGetHistDims

acldvppGetHistData

acldvppGetHistRetCode

acldvppClearHist

aclfvRepoRange

aclfvCreateRepoRange

aclfvDestroyRepoRange

aclfvFeatureInfo

aclfvCreateFeatureInfo

aclfvDestroyFeatureInfo

aclfvQueryTable

aclfvCreateQueryTable

aclfvDestroyQueryTable

aclfvSearchInput

aclfvCreateSearchInput

aclfvDestroySearchInput

aclfvSearchResult

aclfvCreateSearchResult

aclfvDestroySearchResult

aclfvInitPara

aclfvCreateInitPara

aclfvDestroyInitPara

aclfvSet1NTopNum

aclfvSetNMTopNum

aclprofConfig

aclprofCreateConfig

aclprofDestroyConfig

aclprofSubscribeConfig

aclprofCreateSubscribeConfig

aclprofDestroySubscribeConfig

aclmdlConfigHandle

aclmdlCreateConfigHandle

aclmdlDestroyConfigHandle

小型化工具使用差异

Caffe小型化工具差异

支持量化的算子不同

为了实现更低的带宽成本,_图像分析引擎_2小型化工具除了支持带权重层的量化,还支持对不带权重的层做激活量化。

  • 当前支持的带权重量化层为:全连接层(InnerProduct)、卷积层(Convolution和DepthwiseConv)、反卷积层(Deconvolution)。

  • 当前支持的不带权重的量化层为:PassThrough, Pooling, PSROIPooling, ROIPooling, SPP, Upsample, Eltwise, Slice, Concat, Softmax, ROIAlign, AbsVal, BNLL, CReLU, ELU, Exp, Interp, Log, LRN, Mvm, Nms, Normalize, Power, PReLU, Reduction, ReLU, Sigmoid, Sort, Threshold, Scale, BatchNorm, Bias, Reshape, ShuffleChannel, Crop, Axpy, Flatten, Permute, Tile, Split, ArgMax, Clip, Hswish, MVN, Reorg, TanH, MatMul, RReLU, ReLU6

支持量化的位宽不同

_图像分析引擎_2小型化工具支持更灵活的量化位宽控制。

  • 激活量化在Calibration和Retrain时可以配置8~16之间任意位宽,配置8时最终使用8bit部署,配置大于8时为高精度模式,最终使用16bit部署(一般推荐8或者12)

  • 权重量化在Calibration时可以配置4和8两种位宽量化,在Retrain时可以配置8一种量化位宽

对外接口和功能差异

_图像分析引擎_2小型化工具的接口和功能都和_图像分析引擎_1存在差异:

  • _图像分析引擎_2的Calibration把权重量化和激活量化分离为weights_quantize_model和activation_quantize_model两个接口;

  • _图像分析引擎_2的Calibration支持权重压缩成4bit,并且支持在权重量化后对BN层的参数进行更新;

  • 新增了对推理图的uninplace功能,在Sample中新增中间结果打印脚本,方便中间结果导出和精度比对;

  • _图像分析引擎_2小型化工具不支持auto_nuq和accuracy_based_auto_calibration功能。

量化生成件差异

_图像分析引擎_2小型化工具生成的量化参数单独储存在名为quant_param_record.txt或者quant_param_record.bin的文件中,deploy模型中仅储存不含量化层的INT定点模型。

Pytorch小型化工具差异

支持量化的算子不同

为了实现更低的带宽成本,_图像分析引擎_2小型化工具除了支持带权重层的量化,还支持对不带权重的层做激活量化。

类型

层名

约束

备注

支持权重及数据量化的层

torch.nn.Linear:全连接层

-

复用层(共用weight和bias参数)不支持量化。

torch.nn.Conv2d:卷积层

-

torch.nn.ConvTranspose2d:反卷积层

groups为1

支持数据量化的层

torch.nn.MaxPool2d, torch.nn.functional.max_pool2d

-

-

torch.nn.AdaptiveMaxPool2d,

torch.nn.functional.adaptive_max_pool2d

-

-

torch.nn.AvgPool2d, torch.nn.functional.avg_pool2d

-

-

torch.nn.AdaptiveAvgPool2d, torch.nn.functional.adaptive_avg_pool2d

-

-

+, torch.add

至少有一路输入类型是Tensor

需要手动引入amct_pytorch.custom_op.eltwise.eltwise模块中的EltwiseAdd算子,并将+或者torch.add替换为EltwiseAdd,详细参考《AMCT使用指南(PyTorch)》

*, torch.mul

至少有一路输入类型是Tensor

需要手动引入amct_pytorch.custom_op.eltwise.eltwise模块中的EltwiseMul算子,并将*或者torch.mul替换为EltwiseMul,方法同EltwiseAdd

/, torch.div

至少有一路输入类型是Tensor

需要手动引入amct_pytorch.custom_op.eltwise.eltwise模块中的EltwiseDiv算子,并将/或者torch.div替换为EltwiseDiv,方法同EltwiseAdd

torch.chunk

-

需要手动引入amct_pytorch.custom_op.split.split中的Split算子

torch.view

-

需要手动引入amct_pytorch.custom_op.reshape.reshape中的Reshape算子

torch.transpose

-

需要手动引入amct_pytorch.custom_op.transpose.transpose中的Transpose算子

torch.cat

-

需要手动引入amct_pytorch.custom_op.concat.concat模块中的Concat算子,并将torch.cat替换为Concat,详细参考《AMCT使用指南(PyTorch)》

torch.max(input)

-

需要手动引入hotwheels.amct_pytorch.custom_op.max.max中的Max算子

torch.max(input, other, *, out=None)

-

需要手动引入hotwheels.amct_pytorch.custom_op.max.max中的ReduceMax算子

torch.mean(input)

-

需要手动引入hotwheels.amct_pytorch.custom_op.mean.mean中的Mean算子

torch.mean(input, other, *, out=None)

-

需要手动引入hotwheels.amct_pytorch.custom_op.mean.mean中的ReduceMean算子

支持量化的位宽不同

_图像分析引擎_2小型化工具支持更灵活的量化位宽控制。

  • 激活量化在Calibration和Retrain时可以配置8~16之间任意位宽,配置8时最终使用8bit部署,配置大于8时为高精度模式,最终使用16bit部署(一般推荐8或者12)。

  • 权重量化在Calibration时可以配置4和8两种位宽量化,在Retrain时可以配置4和8两种量化位宽。

对外接口和功能差异

_图像分析引擎_2小型化工具的接口和功能都和_图像分析引擎_1存在差异:

  • _图像分析引擎_2的Calibration支持权重压缩成4bit,并且支持在权重量化后对BN层的参数进行更新;

    4bit量化需要用到更新BN的接口:

    update_bn_status(calibration_model, training=True)

  • _图像分析引擎_2在Calibration场景save_model接口函数原型为:

    save_model(modfied_onnx_file, record_file, save_path, calibration_torch_model)

    _图像分析引擎_1在Calibration场景save_model接口函数原型为:

    save_model(modfied_onnx_file, record_file, save_path)

  • _图像分析引擎_2小型化工具不支持nuq算法和accuracy_based_auto_calibration功能

量化生成件差异

_图像分析引擎_2小型化工具生成的量化参数单独储存在名为quant_param_record.txt的文件中,deploy模型中仅储存不含量化层的INT定点模型。

ATC使用差异

SVP ATC特性差异

表 1 SVP ATC特性差异

差异项

图像分析引擎1(NNN)

图像分析引擎2(SVP_NNN)

开源网络模型

Caffe、Onnx、Tensorflow, --framework

Caffe、Onnx

解析浮点模型

不支持

支持, --weight

支持量化校准

不支持

支持, --image_list

自定义算子

支持

支持

动态AAPP

支持

不支持

静态AAPP

支持改变图像尺寸(Crop/Resize/Padding)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素值)

--insert_op_conf

不支持改变图像尺寸(Crop、Resize、Padding),支持色域转换(转换图像格式)、减均值/乘系数(改变图像像素值)

--insert_op_conf

动态分辨率

支持, --dynamic_image_size

不支持

动态Batch

支持,--dynamic_batch_size

支持, --batch_num

数据排布格式

支持NCHW、NHWC,--input_format

只支持NCHW

权重压缩

支持,--enable_compress_weight

不支持

权重量化位宽

支持8bit

支持4bit、8bit

指定网络节点输出

支持,配置层名,板端ACL接口返回层名,--out_nodes

支持,配置层名,板端ACL接口返回输出名,--out_nodes

算子自动调优

支持,--auto_tune_mode

不支持,离线编译生成*.om时默认性能优先。

Caffe扩展算子

支持

支持,算子类型和参数有差异。

SVP ATC 命令行差异

图像分析引擎1(NNN)

图像分析引擎2(SVP_NNN)

-

batch_num

auto_tune_mode

-

buffer_optimize

-

check_report

check_report

-

compile_mode

compress_weight_conf

-

core_type

-

-

cutoff_layer

-

custom_ops_lib

debug_dir

-

-

detection_out_accuracy

disable_reuse_memory

-

display_model_info

-

-

dump_data

dump_mode

dump_mode

dynamic_batch_size

-

dynamic_dims

-

dynamic_image_size

-

enable_compress_weight

-

enable_scope_fusion_passes

-

enable_single_stream

-

enable_small_channel

-

-

forward_quantization_option

framework

framework

fusion_switch_file

fusion_switch_file

h/help

help

-

generate_anchors_file

-

gfpq_param_file

-

image_data_bits

-

image_dcmp_mode

-

image_height

-

image_list

-

image_report_bit

-

image_report_name

-

image_report_type

-

image_width

input_format

input_format

input_fp16_nodes

-

input_shape

input_shape

input_shape_range

-

-

input_type

insert_op_conf

insert_op_conf

-

internal_stride

is_input_adjust_hw_layout

-

-

is_precheck

is_output_adjust_hw_layout

-

json

json

-

layer_fusion_enable

-

layer_m2m_enable

keep_dtype

-

log

-

-

log_level

-

low_score_threshold

-

max_roi_frame_cnt

mdl_bank_path

-

-

min_height

-

min_width

mode

mode

model

model

modify_mixlist

-

-

net_optimize_enable

-

nms_threshold

-

num_recurrent_sentences

om

om

-

online_model_type

op_bank_path

-

op_compiler_cache_dir

-

op_compiler_cache_mode

-

op_debug_level

-

op_name_map

-

op_precision_mode

-

op_select_implmode

-

optypelist_for_implmode

-

out_nodes

out_nodes

output

output

-

output_shape

output_type

output_type

precision_mode

-

-

recurrent_cont

-

recurrent_max_total_t

-

recurrent_tmax

save_original_model

save_original_model

shape_generalized_build_mode

-

singleop

-

soc_version

soc_version

-

use_class_id

-

version

weight

weight

-

weight_quant_per_channel

SVP ATC支持的算子规格差异

表 1 Caffe扩展算子差异

扩展算子

图像分析引擎1(NNN)

图像分析引擎2(SVP_NNN)

Reverse

支持

不支持

ROIPooling

支持

支持

PSROIPooling

支持

支持

Upsample(Yolo,NEAREST)

支持,可配置scale、stride

支持,可配置scale(等同于stride),默认值为2。

Normalize

支持

支持

Reorg

支持

支持

Proposal

支持

支持,参数有差异,参考RPN自定义算子配置。

ROIAlign

支持

不支持

ShuffleChannel

支持

支持

Yolo(Yolo/Detection/Region)

支持

不支持

PriorBox

支持

不支持

SpatialTransformer

支持

不支持

YoloV3DetectionOutput

支持

支持,层类型为DetectionOutput,参考RPN自定义算子配置。

YoloV2DetectionOutput

支持

支持,层类型为DetectionOutput,参考RPN自定义算子配置。

SSDDetectionOutput

支持

支持,层类型为DetectionOutput,参考RPN自定义算子配置。

FSRDetectionOutput

支持

支持,层类型为DetectionOutput,参考RPN自定义算子配置。

详细见《ATC工具使用指南》的“5 算子规格说明”。

仿真器差异

SVP ACL仿真器说明

在图像分析引擎2 SVP ACL中,提供仿真器Simulator,供用户在非上板的PC/服务器环境执行仿真任务。

仿真器与SVP ACL的SDK共用一套头文件定义,即一套相同的SVP ACL调用实现代码,通过链接仿真库的方法,可在仿真环境中使用编译器编译可执行程序或库,在仿真环境中执行_图像分析引擎_2仿真。

  • Simulator(Function)表示功能仿真,从功能一致性的角度去模拟硬件,速度较快;

  • Simulator(Instruction)表示指令仿真,从指令一致性的角度去模拟硬件,速度较慢。

功能仿真、指令仿真、板端环境三者的推理输出buffer内容保持完全一致。

仿真器的使用,请参考《MindCmd使用指南》“应用工程”章节。