极智AI | 再谈昇腾CANN量化

本文涉及的产品
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,图像通用资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化。

大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化

在上一篇已经介绍了昇腾CANN量化的原理,对于原理或公式推导有兴趣的同学可以去看一看:《谈谈昇腾CANN量化》。这篇咱们继续,来谈谈昇腾CANN量化的命令行操作。

要进行量化操作,首先要安装好量化环境,这里先简单介绍一下量化环境的安装:

# (1) Anacona3安装,用conda管理python环境,略过
# (2) conda创建amct环境,python版本3.7.5
conda create -n amct_py375 python=3.7.5
# (3) 激活conda环境
conda activate amct_py375
# (4) 安装onnx=1.8.0,onnxruntime=1.6.0,protobuf=3.11.3
pip install -i https://pypi.douban.com/simple onnx=1.8.0 onnxruntime=1.6.0 protobuf=3.11.3
# (5) 下载Ascend-cann-amct_{software version}_{arch}.tar.gz并解压
tar -zxvf Ascend-cann-amct_{software version}_{arch}.tar.gz
# (6) 安装amct_onnx-{version}-py3-none-linux_{arch}.whl ==> 以onnx为例
pip install amct_onnx-{version}-py3-none-linux_{arch}.whl
# (7) 编译并安装自定义算子包
tar -zxvf amct_onnx_op.tar.gz
## 解压后目录
## amct_onnx_op
## |--inc
## |--src
## |--setup.py
cd amct_onnx_op
python setup.py build
# (8) 验证amct_onnx是否安装成功
amct_onnx

需要注意的是:在编译自定义算子包前,在amct_onnx_op/inc里面还需要手动下载四个头放进去,下载路径:https://github.com/microsoft/onnxruntime/tree/v1.6.0/include/onnxruntime/core/session (注意版本的对应,否则在执行amct_onnx时会出现segmentation fault)。

四个头包括:

  • onnxruntime_cxx_api.h
  • onnxruntime_cxx_inline.h
  • onnxruntime_c_api.h
  • onnxruntime_session_options_config_keys.h

这样就完成了CANN量化工具的安装,接着来看命令行的方式怎么使用。主要包括两个方面:(1) 量化数据集的制作;(2) 命令行量化。

首先来说量化数据集的制作,先把量化图片放在一个叫images的文件夹里面,然后使用如下脚本生成calibration.bin

import os
import numpy as np
import cv2
PATH = os.path.realpath('./')
IMAGE_PATH = os.path.join(PATH, './images')
BIN_PATH = os.path.join(PATH, './calibration')
BIN_FILE = os.path.join(BIN_PATH, 'calibration.bin')
# 前处理参数
MEAN = [0.485, 0.456, 0.406] 
STD = [0.229, 0.224, 0.225]
CALIBRATION_SIZE = 16
def get_labels_from_txt(label_file):
    """Read all images' name and label from label_file"""
    image_names = []
    labels = []
    label_file = os.path.realpath(label_file)
    with open(label_file, 'r') as fid:
        lines = fid.readlines()
        for line in lines:
            image_names.append(line.split(' ')[0])
            labels.append(int(line.split(' ')[1]))
    return image_names, labels
# h、w可自定义
def prepare_image_input(images, height=256, width=256, crop_size=224):
    """Read image files to blobs [batch_size, 3, 224, 224]"""
    input_array = np.zeros((len(images), 3, crop_size, crop_size), np.float32)
    mean = MEAN
    std = STD
    imgs = np.zeros((len(images), 3, height, width), np.float32)
    for index, im_file in enumerate(images):
        im_data = cv2.imread(im_file)
        im_data = cv2.resize(
            im_data, (256, 256), interpolation=cv2.INTER_CUBIC)
        cv2.cvtColor(im_data, cv2.COLOR_BGR2RGB)
        imgs[index] = im_data.transpose(2, 0, 1).astype(np.float32)
    h_off = int((height - crop_size) / 2)
    w_off = int((width - crop_size) / 2)
    input_array = imgs[:, :, h_off:(h_off + crop_size),
                        w_off:(w_off + crop_size)]
    # trans uint8 image data to float
    input_array /= 255
    # do channel-wise reduce mean value
    for channel in range(input_array.shape[1]):
        input_array[:, channel, :, :] -= mean[channel]
    # do channel-wise divide std
    for channel in range(input_array.shape[1]):
        input_array[:, channel, :, :] /= std[channel]
    return input_array
def process_data():
    """process data"""
    # prepare cur batch data
    image_names, labels = get_labels_from_txt(
        os.path.join(IMAGE_PATH, 'image_label.txt'))
    if len(labels) < CALIBRATION_SIZE:
        raise RuntimeError(
            'num of image in {} is less than total_num{}'
            .format(IMAGE_PATH, CALIBRATION_SIZE))
    labels = labels[0:CALIBRATION_SIZE]
    image_names = image_names[0:CALIBRATION_SIZE]
    image_names = [
        os.path.join(IMAGE_PATH, image_name) for image_name in image_names
    ]
    input_array = prepare_image_input(image_names)
    return input_array
def main():
    """process image and save it to bin"""
    input_array = process_data()
    if not os.path.exists(BIN_PATH):
        os.mkdir(BIN_PATH)
    input_array.tofile(BIN_FILE)
if __name__ == '__main__':
    main()

在执行完上述量化脚本后,会生成一个输入数据calibration.bin,然后可以使用命令行进行量化。基本量化命令如下:

amct_onnx calibration --model {model}.onnx --input_shape "input:1,3,224,224" --data_type "float32" --data_dir ./calibration/ --save_path ./results

量化执行成功后,会在results目录下生成可用的量化模型results_deploy_model.onnx,并附有一些量化监督文件、仿真文件和量化日志。下面是量化模型的局部节点截图,可以看到包含了量化节点和解量化节点。

关于amct_onnx命令行的参数,我也进行了整理,如下:

当生成了deploy model后,就可以进一步使用atc工具进行om模型的转换和部署了。

下篇咱们再来说说CANN的量化的python API。


好了,以上分享再谈昇腾CANN量化,希望我的分享能对你的学习有一点帮助。


logo_show.gif

相关文章
|
5月前
|
存储 人工智能 运维
MoE大模型迎来“原生战友”:昇腾超节点重构AI基础设施
大模型训练中,MoE架构逐渐成为主流,但也面临资源利用率低、系统稳定性差、通信带宽瓶颈三大挑战。传统AI集群难以满足其需求,而“昇腾超节点”通过自研高速互联协议、软硬件协同调度、全局内存统一编址及系统稳定性提升等创新,实现384张卡协同工作,大幅提升训练效率与推理性能。相比传统方案,昇腾超节点将训练效率提升3倍,推理吞吐提升6倍,助力MoE模型在工业、能源等领域的规模化应用。5月19日的鲲鹏昇腾创享周直播将深度解析相关技术细节。
260 15
|
6月前
|
机器学习/深度学习 存储 人工智能
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
Qlib是微软亚洲研究院推出的开源AI量化投资平台,提供从数据处理、模型训练到组合管理的全流程支持,内置高性能数据基础设施和多种机器学习模型。
1919 87
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
|
8月前
|
存储 人工智能
Scaling Law或将终结?哈佛MIT预警:低精度量化已无路可走,重磅研究掀翻AI圈
哈佛大学和麻省理工学院的研究人员最近发布了一项重磅研究,对Scaling Law在低精度量化中的应用提出严重质疑。研究表明,随着训练数据增加,低精度量化带来的性能损失也增大,且与模型大小无关。这挑战了通过增加规模提升性能的传统观点,提醒我们在追求效率时不能忽视性能损失。该研究结果在AI圈内引发广泛讨论,提示未来需探索其他方法来提高模型效率,如混合精度训练、模型压缩及新型硬件架构。论文地址:https://arxiv.org/pdf/2411.04330。
196 11
|
7月前
|
人工智能 编解码 算法
解码元翌智能:昇腾AI创新大赛金奖得主的技术拼图
过去两年,大模型成为热议话题,其价值逐渐在生成式AI的广泛应用中显现。昇腾AI创新大赛展示了大模型在各行业的深度融合,如元翌智能通过大模型实现遥感影像解译,解决了人工解译耗时费力的问题,推动了商业遥感市场的发展。元翌智能的解决方案在农业、生态和灾害应急管理等方面发挥了重要作用,提升了行业生产力。未来,随着技术的不断迭代,大模型将在更多领域释放新质生产力,助力行业发展。
|
9月前
|
机器学习/深度学习 数据采集 人工智能
昇腾AI行业案例(七):基于 Conformer 和 Transformer 模型的中文语音识别
欢迎学习《基于 Conformer 和 Transformer 模型的中文语音识别》实验。本案例旨在帮助你深入了解如何运用深度学习模型搭建一个高效精准的语音识别系统,将中文语音信号转换成文字,并利用开源数据集对模型效果加以验证。
262 12
|
9月前
|
机器学习/深度学习 人工智能 算法
昇腾AI行业案例(一):基于AI图像处理的疲劳驾驶检测
在本实验中,您将学习如何使用利用CV(Computer Vision)领域的AI模型来构建一个端到端的疲劳驾驶检测系统,并使用开源数据集进行效果验证。为此,我们将使用昇腾的AI硬件以及CANN等软件产品。
402 3
|
9月前
|
存储 机器学习/深度学习 人工智能
昇腾AI行业案例(六):基于 PraNet 的医疗影像分割
欢迎学习《基于 PraNet 的医疗影像分割》实验。在本实验中,你将深入了解如何运用计算机视觉(CV)领域的 AI 模型,搭建一个高效精准的医疗影像分割系统,专注于息肉分割任务,并利用开源数据集对模型效果加以验证。
228 1
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
昇腾AI行业案例(四):基于 Bert 模型实现文本分类
欢迎学习《昇腾行业应用案例》的“基于 Bert 模型实现文本分类”实验。在本实验中,您将学习如何使用利用 NLP (natural language processing) 领域的AI模型来构建一个端到端的文本系统,并使用开源数据集进行效果验证。为此,我们将使用昇腾的AI硬件以及CANN等软件产品。
567 0
|
9月前
|
存储 人工智能 数据可视化
昇腾AI行业案例(五):基于 DANet 和 Deeplabv3 模型的遥感图像分割
欢迎学习《基于 DANet 和 Deeplabv3 模型的遥感图像分割》实验。在本实验中,你将深入了解如何运用计算机视觉(CV)领域的 AI 模型,搭建一个高效精准的遥感地图区域分割系统,并利用开源数据集和昇腾 AI 芯片对模型效果加以验证。
158 0
昇腾AI行业案例(五):基于 DANet 和 Deeplabv3 模型的遥感图像分割
|
9月前
|
人工智能 算法 计算机视觉
昇腾AI行业案例(三):基于 AI 图像处理的铝板缺陷检测
欢迎学习《基于 AI 图像处理的铝板缺陷检测》实验。在本实验中,你将深入了解如何运用计算机视觉(CV)领域的 AI 模型,搭建一个高效精准的铝板缺陷检测系统,并利用开源数据集和昇腾 AI 芯片对模型效果加以验证。
325 0

热门文章

最新文章