跳到主要内容

查找量化场景下的精度损失层

查找量化场景下的精度损失层

当前仅支持Caffe框架模型,使用精度比对工具查找量化场景下的精度损失层,主要包含以下两步的比对:

  1. 定位量化阶段的精度问题

    执行非量化原始模型(GPU/CPU) vs 量化原始模型(GPU/CPU)。

  2. 定位模型转换阶段产生的精度问题,即量化离线模型在NPU上运行时的精度问题。

    执行量化原始模型(GPU/CPU) vs 量化离线模型(关闭融合规则)(NPU)。

详细操作请参见精度比对工具使用指南》中的“GPU/CPU vs Ascend NPU精度比对(Caffe推理)”。

父主题: 使用AMCT工具压缩模型

配置skip_layers跳过量化损失大的层

使用精度比对工具比对原始模型、量化后模型各层的精度,查找精度损失大的层,在基于精度的自动量化时通过配置skip_layers跳过量化损失大的层。

  1. 修改基于精度的自动量化代码,增加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 = 1
    amct.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')
  2. 执行精度的自动量化。

  3. 重新执行推理。

    如果跳过不支持量化的层影响模型推理的结果数据,则需要用户自行调整模型,再重新量化模型。

父主题: 使用AMCT工具压缩模型

样例列表,Atlas 200/500 A2推理产品

本文中提及的样例如下表所示。单击GiteeGithub获取更多样例。

表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。

父主题: 实现矩阵-矩阵乘运算

在线提单