样例介绍
查找量化场景下的精度损失层
当前仅支持Caffe框架模型,使用精度比对工具查找量化场景下的精度损失层,主要包含以下两步的比对:
-
定位量化阶段的精度问题。
执行非量化原始模型(GPU/CPU) vs 量化原始模型(GPU/CPU)。
-
定位模型转换阶段产生的精度问题,即量化离线模型在NPU上运行时的精度问题。
执行量化原始模型(GPU/CPU) vs 量化离线模型(关闭融合规则)(NPU)。
详细操作请参见《精度比对工具使用指南》中的“GPU/CPU vs Ascend NPU精度比对(Caffe推理)”。
父主题: 使用AMCT工具压缩模型
配置skip_layers跳过量化损失大的层
使用精度比对工具比对原始模型、量化后模型各层的精度,查找精度损失大的层,在基于精度的自动量化时通过配置skip_layers跳过量化损失大的层。
-
修改基于精度的自动量化代码,增加skip_layers配置,跳过不支持量化的层。
代码示例如下,表示跳过某一层。如果涉及跳过多层,则每一层之间用逗号分隔,例如:skip_layers=['op1','op2','op3']
config_json_file = './config.json'skip_layers = ['Default/network-DeepLabV3/resnet-Resnet/layer4-SequentialCell/0-Bottleneck/downsample-SequentialCell/0-Conv2d/Conv2D-op311']batch_num = 1amct.create_quant_config(config_json_file, model, input_data,skip_layers, batch_num)scale_offset_record_file = os.path.join(TMP, 'scale_offset_record.txt')result_path = os.path.join(RESULT, 'model') -
执行精度的自动量化。
-
重新执行推理。
如果跳过不支持量化的层影响模型推理的结果数据,则需要用户自行调整模型,再重新量化模型。
父主题: 使用AMCT工具压缩模型
样例列表,Atlas 200/500 A2推理产品
本文中提及的样例如下表所示。单击Gitee或Github获取更多样例。
表1 Sample列表
| Sample名称 | Sample获取 | 基本功能 | 编译运行指导 |
|---|---|---|---|
| gemm | 单击gemm获取样例 | 实现矩阵-矩阵乘运算 | 请参见样例工程中的README |
| vpc_jpeg_resnet50_imagenet_classification | 单击vpc_jpeg_resnet50_imagenet_classification获取样例 | 基于Caffe ResNet-50网络实现图片分类(图片解码+抠图缩放+图片编码+同步推理) | 请参见样例工程中的README |
| vdec_resnet50_classification | 单击vdec_resnet50_classification获取样例 | 基于Caffe ResNet-50网络实现图片分类(视频解码+同步推理) | 请参见样例工程中的README |
| resnet50_imagenet_classification | 单击resnet50_imagenet_classification获取样例 | 基于Caffe ResNet-50网络实现图片分类(同步推理) | 请参见样例工程中的README |
| resnet50_async_imagenet_classification | 单击resnet50_async_imagenet_classification获取样例 | 基于Caffe ResNet-50网络实现图片分类(异步推理) | 请参见样例工程中的README |
| batchcrop | 单击batchcrop获取样例 | 媒体数据处理V1(抠图,一图多框) | 请参见样例工程中的README |
| venc_image | 单击venc_image获取样例 | 媒体数据处理V1(视频编码) | 请参见样例工程中的README |
| smallResolution_cropandpaste | 单击smallResolution_cropandpaste获取样例 | 媒体数据处理V1(抠图贴图) | 请参见样例工程中的README |
| YOLOV3_dynamic_batch_detection_picture | 单击YOLOV3_dynamic_batch_detection_picture获取样例 | 基于Caffe YOLOv3网络实现目标检测(动态Batch/动态分辨率) | 请参见样例工程中的README |
| vpc_sample | 单击vpc_sample获取样例 | 媒体数据处理V2(VPC抠图\贴图\缩放等) | 请参见样例工程中的README |
| jpegd_sample | 单击jpegd_sample获取样例 | 媒体数据处理V2(JPEG图片解码) | 请参见样例工程中的README |
| jpege_sample | 单击jpege_sample获取样例 | 媒体数据处理V2(JPEG图片编码) | 请参见样例工程中的README |
| vdec_sample | 单击vdec_sample获取样例 | 媒体数据处理V2(VDEC视频解码) | 请参见样例工程中的README |
| venc_sample | 单击venc_sample获取样例 | 媒体数据处理V2(VENC视频编码) | 请参见样例工程中的README |
| pngd_sample | 单击pngd_sample获取样例 | 媒体数据处理V2(PNGD图片解码) | 请参见样例工程中的README |
父主题: 应用样例参考
样例介绍
获取样例
单击gemm获取样例
功能描述
该样例主要实现矩阵-矩阵相乘的运算:C = αAB + βC,A、B、C都是16*16的矩阵,即:m=16,n=16,k=16。矩阵乘的结果是一个16*16的矩阵。
图1 Sample示例

原理介绍
在该样例中,涉及的关键功能点,如下表所示。
表1 关键功能点
| 初始化 | - 调用aclInit接口初始化AscendCL配置。 - 调用aclFinalize接口实现AscendCL去初始化。 |
|---|---|
| Device管理 | - 调用aclrtSetDevice接口指定用于运算的Device。 - 调用aclrtGetRunMode接口获取软件栈的运行模式,根据运行模式的不同,内部处理流程不同。 - 调用aclrtResetDevice接口复位当前运算的Device,回收Device上的资源。 |
| Stream管理 | - 调用aclrtCreateStream接口创建Stream。 - 调用aclrtDestroyStream接口销毁Stream。 - 调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。 |
| 内存管理 | - 调用aclrtMallocHost接口申请Host上内存。 - 调用aclrtFreeHost释放Host上的内存。 - 调用aclrtMalloc接口申请Device上的内存。 - 调用aclrtFree接口释放Device上的内存。 |
| 数据传输 | 如果在板端环境上运行应用,则无需进行数据传输。 |
| 单算子调用 | - 调用aclblasGemmEx接口实现矩阵-矩阵相乘的运算,由用户指定矩阵中元素的数据类型。在aclblasGemmEx接口内部封装了系统内置的矩阵乘算子GEMM。 - 使用ATC(Ascend Tensor Compiler)工具将内置的矩阵乘算子GEMM的算子描述信息(包括输入输出Tensor描述、算子属性等)编译成适配昇腾AI处理器的离线模型(*.om文件),用于验证矩阵乘算子GEMM的运行结果。 |
目录结构
样例代码结构如下所示。
├── inc
│ ├── common.h //定义公共函数(例如:文件读取函数)的头文件
│ ├── gemm_runner.h //定义矩阵乘运算相关函数的头文件
├── run
│ ├── out
│ │ ├──test_data
│ │ │ ├── config
│ │ │ │ ├── acl.json //系统初始化的配置文件
│ │ │ │ ├── gemm.json //矩阵乘算子的算子描述信息
│ │ │ ├── data
│ │ │ │ ├── generate_data.py //用于生成矩阵A、矩阵B的数据
├── src
│ ├── CMakeLists.txt //编译脚本
│ ├── common.cpp //公共函数(例如:文件读取函数)的实现文件
│ ├── gemm_main.cpp //主函数的实现文件
│ ├── gemm_runner.cpp //执行矩阵乘运算相关函数的实现文件
父主题: 实现矩阵-矩阵乘运算
编译及运行应用
单击gemm获取样例,查看该样例下的README。
父主题: 实现矩阵-矩阵乘运算
样例介绍
获取样例
单击vpc_jpeg_resnet50_imagenet_classification获取样例
功能描述
该样例主要是基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。
根据运行应用的入参,该样例可实现以下功能:
- 将一张YUV420SP格式的图片编码为*.jpg格式的图片。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,缩放,再进行模型推理,分别得到两张图片的推理结果后,处理推理结果,输出最大置信度的类别标识以及top5置信度的总和。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,抠图,再进行模型推理,分别得到两张图片的推理结果后,处理推理结果,输出最大置信度的类别标识以及top5置信度的总和。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,抠图贴图,再进行模型推理,分别得到两张图片的推理结果后,处理推理结果,输出最大置信度的类别标识以及top5置信度的总和。
该样例中用于推理的模型文件是*.om文件(适配昇腾AI处理器的离线模型),转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片,才能符合模型的输入要求。
原理介绍
在该样例中,涉及的关键功能点,如下表所示。
| 初始化 | - 调用aclInit接口初始化AscendCL配置。 - 调用aclFinalize接口实现AscendCL去初始化。 |
|---|---|
| Device管理 | - 调用aclrtSetDevice接口指定用于运算的Device。 - 调用aclrtGetRunMode接口获取软件栈的运行模式,根据运行模式的不同,内部处理流程不同。 - 调用aclrtResetDevice接口复位当前运算的Device,回收Device上的资源。 |
| Context管理 | - 调用aclrtCreateContext接口创建Context。 - 调用aclrtDestroyContext接口销毁Context。 |
| Stream管理 | - 调用aclrtCreateStream接口创建Stream。 - 调用aclrtDestroyStream接口销毁Stream。 - 调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。 |
| 内存管理 | - 调用aclrtMallocHost接口申请Host上内存。 - 调用aclrtFreeHost释放Host上的内存。 - 调用aclrtMalloc接口申请Device上的内存。 - 调用aclrtFree接口释放Device上的内存。 执行媒体数据处理时,若需要申请Device上的内存存放输入或输出数据,需调用acldvppMalloc申请内存、调用acldvppFree接口释放内存。 |
| 数据传输 | 如果在板端环境上运行应用,则无需进行数据传输。 |
| 媒体数据处理V1 | - 图片编码 调用acldvppJpegEncodeAsync接口将YUV420SP格式的图片编码为*.jpg格式的图片。 - 图片解码 调用acldvppJpegDecodeAsync接口将*.jpg图片解码成YUV420SP格式图片。 - 缩放 调用acldvppVpcResizeAsync接口对YUV420SP格式的输入图片进行缩放。 - 抠图 调用acldvppVpcCropResizeAsync接口按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。 - 抠图贴图 调用acldvppVpcCropResizePasteAsync接口按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。 |
| 模型推理 | - 调用aclmdlLoadFromFileWithMem接口从*.om文件加载模型。 - 调用aclmdlExecute接口执行模型推理。 推理前,通过*.om文件中的色域转换参数将YUV420SP格式的图片转换为RGB格式的图片。 - 调用aclmdlUnload接口卸载模型。 |
目录结构
样例代码结构如下所示。
├── caffe_model
│ ├── aipp.cfg //带色域转换参数的配置文件,模型转换时使用
├── data
│ ├── persian_cat_1024_1536_283.jpg //测试数据,需要按指导获取测试图片,放到data目录下
│ ├── wood_rabbit_1024_1061_330.jpg //测试数据,需要按指导获取测试图片,放到data目录下
│ ├── wood_rabbit_1024_1068_nv12.yuv //测试数据,需要按指导获取测试图片,放到data目录下
│ ├── dvpp_vpc_8192x8192_nv12.yuv //测试数据,需要按指导获取测试图片,放到data目录下
├── inc
│ ├── dvpp_process.h //声明媒体数据处理相关函数的头文件
│ ├── model_process.h //声明模型处理相关函数的头文件
│ ├── sample_process.h //声明资源初始化/销毁相关函数的头文件
│ ├── utils.h //声明公共函数(例如:文件读取函数)的头文件
├── src
│ ├── acl.json //系统初始化的配置文件
│ ├── CMakeLists.txt //编译脚本
│ ├── dvpp_process.cpp //媒体数据处理相关函数的实现文件
│ ├── main.cpp //主函数,图片分类功能的实现文件
│ ├── model_process.cpp //模型处理相关函数的实现文件
│ ├── sample_process.cpp //资源初始化/销毁相关函数的实现文件
│ ├── utils.cpp //公共函数(例如:文件读取函数)的实现文件
├── .project //工程信息文件,包含工程类型、工程描述、运行目标设备类型等
├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
父主题: 基于Caffe ResNet-50网络实现图片分类(图片解码+抠图缩放+图片编码+同步推理)
编译及运行应用
单击vpc_jpeg_resnet50_imagenet_classification获取样例,查看该样例下的README。
父主题: 基于Caffe ResNet-50网络实现图片分类(图片解码+抠图缩放+图片编码+同步推理)
在线提单