赞
踩
目录
想象一下,你有一个非常聪明的机器人朋友,它可以帮你做很多事情,比如预测天气。但是,这个机器人的大脑(我们可以把它想象成一个神经网络模型)需要很多能量和空间来思考(也就是进行计算和存储数据)。现在,如果我们想让这个机器人更小巧,更省电,还能快速做出预测,我们就需要采用一些特殂的技巧。
这时,Vitis AI 量化器就像一个魔法工具,它可以帮助机器人的大脑变得更高效。原来,机器人的大脑用一种非常详细(32位浮点)的方式来记住信息,这种方式虽然精确,但是需要很多空间和能量。Vitis AI 量化器通过一种叫做“量化”的魔法,把这些详细的信息转换成更简单(8位整数)的形式。这样做虽然会让信息变得不那么精确,但是我们可以通过一些技巧,让机器人的预测能力几乎不受影响。
这个魔法包括几个步骤:
通过这个过程,机器人的大脑变得更小,更省电,而且还能快速做出准确的预测。这样,我们就可以把这个聪明的机器人带到更多的地方去,让它帮助更多的人。
这个过程包括:
从原始的训练数据中挑选出一个子集,包含100到1000个样本即可,而且不需要样本的标签(也就是说,我们不需要知道这些数据的正确答案是什么)。这个子集的目的是帮助我们理解模型在处理不同数据时的行为模式。
将这个数据子集通过神经网络进行前向传播。
前向传播简单来说,就是让数据通过网络的每一层,从输入层开始,一直到输出层。在这个过程中,网络的每一层都会对数据进行一些计算和转换,这些转换是由该层的权重(即该层学习到的参数)和激活函数(一种特定的数学函数,用于决定神经元是否应该被激活)控制的。
当数据通过网络前向传播时,我们会分析网络中每一层的“激活分布”。激活分布基本上是指,在数据通过网络层时,神经元输出值的分布情况。这是非常重要的信息,因为它可以帮助我们了解数据是如何在网络中流动的,以及每一层是如何对数据进行处理的。
一旦我们有了关于激活分布的信息,我们就可以开始将权重和激活值从32位浮点数转换为8位整数值。这个过程称为量化。通过量化,我们可以显著减小模型的大小和计算需求,同时尽量保持模型的预测准确性不变。
QAT(Quantization-Aware Training,量化感知训练)是一种特殊的神经网络训练方法,它在训练过程中就考虑到了模型最终会被量化(即权重和激活值会被转换成较低精度格式,如8位整数)的事实。通过这种方式,QAT旨在训练出一个在量化后仍能保持高性能的模型。
QAT的工作原理
QAT的优势
量化校准配置文件的目录在 config_file = "./configs/mix_precision_config.json"
配置名 | 解释 | 选项 |
convert_relu6_to_relu | 是否将ReLU6转换为ReLU | true、false |
include_cle | 是否使用跨层均衡(cross layer equalization) | true、false |
include_bias_corr | 是否使用偏差校正 | true、false |
keep_first_last_layer_accuracy | 是否跳过对第一层和最后一层进行量化(未启用) | FALSE |
keep_add_layer_accuracy | 是否跳过对"add"层进行量化(未启用) | FALSE |
target_device | 部署量化模型的设备 | DPU、CPU、GPU |
quantizable_data_type | 模型中要进行量化的张量类型 | |
datatype | 用于量化的数据类型 | int、bfloat16、float16、float32 |
bit_width | 用于量化的比特宽度 | |
method | 用于校准量化的方法 | maxmin、percentile、entropy、mse、diffs |
round_mode | 量化过程中的舍入方法 | half_even、half_up、half_down、std_round |
symmetry | 是否使用对称量化 | true、false |
per_channel | 是否使用通道级别的量化 | true、false |
signed | 是否使用有符号量化 | true、false |
narrow_range | 是否对有符号量化使用对称整数范围 | true、false |
scale_type | 量化过程中使用的尺度类型 | float、poweroftwo |
calib_statistic_method | 如果使用多批次数据获得不同的尺度,用于选择一个最优尺度的方法 | modal、max、mean、median |
全局量化设置的部分:
量化参数的部分:
使用 PyTorch 框架和 Vitis AI 量化工具(通过 pytorch_nndct 模块)的一个示例:
- # 创建量化器对象,并获取量化模型
- from pytorch_nndct.apis import torch_quantizer
- quantizer = torch_quantizer(
- quant_mode, model, (dummy_input), device=device, quant_config_file=config_file, target=target)
- quant_model = quantizer.quant_model
-
- loss_fn = torch.nn.CrossEntropyLoss().to(device)
- val_loader, _ = load_data(…)
-
- if finetune == True:
- ft_loader, _ = load_data(…)
- if quant_mode == 'calib':
- quantizer.fast_finetune(evaluate, (quant_model, ft_loader, loss_fn))
- elif quant_mode == 'test':
- quantizer.load_ft_param()
-
- acc1_gen, acc5_gen, loss_gen = evaluate(quant_model, val_loader, loss_fn)
-
- if quant_mode == 'calib':
- quantizer.export_quant_config()
- if deploy:
- quantizer.export_torch_script()
- quantizer.export_onnx_model()
- quantizer.export_xmodel()
代码的主要功能和步骤包括:
在当今技术快速发展的时代,我们追求的不仅是智能设备的高性能,同时也强调其能效和便携性。Vitis AI量化器便是在这样的背景下应运而生的一个工具,它通过将神经网络模型的数据精度从32位浮点数降低到8位整数,极大地缩减了模型的体积和计算需求,而通过精心设计的校准和微调过程,又能确保模型的预测准确性基本不受影响。这一过程不仅包括了校准激活、量化感知训练等关键步骤,还提供了详细的量化校准配置和实用的量化函数,以适应不同的部署需求。通过这种方式,Vitis AI量化器使得深度学习模型能够更加轻松地被部署到资源受限的设备上,无论是在移动设备、嵌入式系统还是其他平台,都能够实现快速、高效的智能计算,为用户带来更加丰富和流畅的体验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。