极智AI | 量化实现分享三:详解ACIQ对称量化算法实现

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,视频资源包5000点
简介: 大家好,我是极智视界,本文剖析一下ACIQ 对称量化算法实现,以 Tengine 的实现为例。

大家好,我是极智视界,本文剖析一下ACIQ 对称量化算法实现,以 Tengine 的实现为例。

这是量化实现的第三篇,前面还有一、二,有兴趣的同学可以查阅

(1) 《【模型推理】量化实现分享一:详解 min-max 对称量化算法实现》;

(2)《【模型推理】量化实现分享二:详解 KL 对称量化算法实现》;

ACIQ 和前面的量化策略类似,也是会截取一个阈值 T,然后将 [-T, T] 映射到量化值域,不同的是寻找 T 的过程,本文不止讲原理,也结合 tengine 讲讲量化策略的实现。下面开始。


1、ACIQ 量化策略原理

ACIQ 量化策略在论文《Post training 4-bit quantization of convolutional networks for rapid-deployment》中被提出,先贴一下效果:

上图比对统一采用 8-bit 权值量化、4-bit 激活值量化,在量化效率上 ACIQ 比 KL 量化过程快 4000 倍(unbelievable~),在量化精度上,可以看到除了 resnet-101,其他测试的网络量化效果均好于 KL 量化,可以说是效率和效果一个也不落。

在文章的一开始,作者就写道 Unlike traditional approaches that focus on the quantization at the network level, in this work we propose to minimize the quantization effect at the tensor level. 可以看出 ACIQ 是从 Tensor 级别出发的量化策略,整个推导逻辑主要是:

(1) first, derive a generic expression for any given distribution for the expected MSE as a function of clipping value;

(2) then use this expression to develop a specifific expression for each distribution;

(3) finally, establish the optimal clipping values by solving the equations for which the derivative with respect to the clipping value are set to zero;

通常在量化的时候需要做裁剪,以应对原始数据的长尾问题,假设 α 为截断值,截断可以表示为:

ACIQ 需要一个较强先验假设:Tensor (feature map) 服从拉普拉斯分布或高斯分布,然后采用最优化思想求解量化过程截断值对应的最小量化损失,整个量化过程是将服从原始分布的值映射到 2^M量化离散值域,M 为量化比特数,意思是将上面的 [-α, α] 的值域等分给 2^M,如下图:

假设原始分布的概率密度函数为 f(x),截断值 α 以及量化函数 Q(x),则量化前后的 L2 Loss 可以这么计算:

以上算式很明显可以分为三个部分:

(1) [负无穷, -α];

(2) [-α, α];

(3) [α, 正无穷];

对于高斯分布N(0, σ^2) 或者 拉普拉斯分布 Laplace(0, b)) 这种 0 轴对称分布来说,(1) 和 (3) 是等价的,含义是 |x| 到 |α| 之间的均方误差 (mean-square-error)。在做 [-α, α] 等分映射到 2^M 后,每个量化值会取每段中间的值 q1、q2、q3 ... q2^M,第 (2) 项就是中间截断的累计误差。现在整个量化过程转化为求一个使 E[(X - Q(X))^2] 最小的截断值 α (深度学习到最后都是数学问题啊~~),然后再结合先验分布,做一些公式的等价变换~变换~之后,得到最终的整体量化损失优化目标函数:

数学上,要求目标函数的最小值 ==> 求偏导,令其为 0。

对于拉普拉斯分布来说,求偏导后的表达式为:

对于高斯分布来说,求偏导后的表达式为:

最后不管对于拉普拉斯分布还是高斯分布来说,M 是你想量化的比特位,还有像 β (拉普拉斯分布参数)、σ (高斯分布参数) 这些都是已知值,自然可以求出我们想要的截断值 α 了,对于对称量化来说有了截断值就 ok 了。


2、ACIQ 量化策略实现

下面来看 ACIQ 在 tengine 中的实现。

量化实现主要代码:

case ALGORITHM_ACIQ:{
    if (quant_tool.scale_file.empty()){
        quant_tool.scale_file = "table_aciq.scale";
        quant_tool.activation_quant_tool();
    }
    save_graph_i8_perchannel(quant_tool.model_file.c_str(), quant_tool.scale_file.c_str(), quant_tool.output_file, quant_tool.inplace, false);
    /* Evaluate quantitative losses */
    if (quant_tool.evaluate){
        fprintf(stderr, "[Quant Tools Info]: Step Evaluate, evaluate quantitative losses\n");
        quant_tool.assess_quant_loss(0);
    }
    break;
}

2.1 激活值量化

激活值量化入口:

quant_tool.activation_quant_tool();

首先就是求 min、max 值,这个过程和前面写过的量化策略是一样的逻辑,就不多说了,接着进 ACIQ 策略:

for (int i = 0; i < ir_graph->tensor_num; i++){
    struct tensor* t = ir_graph->tensor_list[i];
    if (t->tensor_type == TENSOR_TYPE_VAR || t->tensor_type == TENSOR_TYPE_INPUT){
        float absmax = 0.f;
        float act_scale = 1.f;
        int act_zero_point = 0;
        int emlement_num = t->elem_num;
        absmax = std::max(std::abs(max_activation[i]), std::abs(min_activation[i]));
        float threshold = compute_aciq_gaussian_clip(absmax, emlement_num, 8);
        act_scale = threshold / 127.f;
        /* the scale of softmax is always scale = 1 / 127.f */
        for (int j = 0; j < ir_graph->node_num; j++){
            struct node* noden = ir_graph->node_list[j];
            struct tensor* tensor_tmp = get_ir_graph_tensor(ir_graph, noden->output_tensors[0]);
            if (!(tensor_tmp->tensor_type == TENSOR_TYPE_INPUT || tensor_tmp->tensor_type == TENSOR_TYPE_VAR))
                continue;
            std::string tmp_op_name = get_op_name_from_type(noden->op.type);
            std::string cur_name = t->name;
            std::string tmp_name = tensor_tmp->name;
            if ((cur_name == tmp_name) && tmp_op_name == "Softmax"){
                act_scale = 1 / 127.f;
                break;}
        }
        fprintf(fp_aciq, "%s %f %d\n", ir_graph->tensor_list[i]->name, act_scale, act_zero_point);}
}

关键是这个函数,tengine 里默认先验服从高斯分布, int8 量化:

float threshold = compute_aciq_gaussian_clip(absmax, emlement_num, 8);

来看一下它的实现:

static float compute_aciq_gaussian_clip(float absmax, int N, int num_bits)
{
    const float alpha_gaussian[8] = {0, 1.71063519, 2.15159277, 2.55913646, 2.93620062, 3.28691474, 3.6151146, 3.92403714};   // 当8-bit量化时,α=3.92403714
    const double gaussian_const = (0.5 * 0.35) * (1 + sqrt(3.14159265358979323846 * log(4))); 
    double std = (absmax * 2 * gaussian_const) / sqrt(2 * log(N));  
    return (float)(alpha_gaussian[num_bits - 1] * std);
}

这样就得到了截断值,然后就可以求 scale 了:

act_scale = threshold / 127.f;

这样就完成了激活值的量化。

2.2 权值&偏置量化

权值&偏置的量化过程和前面介绍过的 MIN-MAX 和 KL 量化的逻辑一样,这里不再赘述。

最后实践一下,可以发现 ACIQ 的量化过程十分的快,比 KL 量化快 4000 倍不是瞎说的,主要是源于先验的高斯分布 alpha_gaussian、gaussian_const、std 这些值不需要进行搜索。


以上分享了 ACIQ 的量化原理和实现,希望我的分享能对你的学习有一点帮助。


logo_show.gif

相关文章
|
7天前
|
传感器 人工智能 监控
智慧电厂AI算法方案
智慧电厂AI算法方案通过深度学习和机器学习技术,实现设备故障预测、发电运行优化、安全监控和环保管理。方案涵盖平台层、展现层、应用层和基础层,具备精准诊断、智能优化、全方位监控等优势,助力电厂提升效率、降低成本、保障安全和环保合规。
智慧电厂AI算法方案
|
7天前
|
机器学习/深度学习 人工智能 监控
智慧交通AI算法解决方案
智慧交通AI算法方案针对交通拥堵、违法取证难等问题,通过AI技术实现交通管理的智能化。平台层整合多种AI能力,提供实时监控、违法识别等功能;展现层与应用层则通过一张图、路口态势研判等工具,提升交通管理效率。方案优势包括先进的算法、系统集成性和数据融合性,应用场景涵盖车辆检测、道路环境检测和道路行人检测等。
|
7天前
|
传感器 人工智能 监控
智慧化工厂AI算法方案
智慧化工厂AI算法方案针对化工行业生产过程中的安全风险、效率瓶颈、环保压力和数据管理不足等问题,通过深度学习、大数据分析等技术,实现生产过程的实时监控与优化、设备故障预测与维护、安全预警与应急响应、环保监测与治理优化,全面提升工厂的智能化水平和管理效能。
智慧化工厂AI算法方案
|
1月前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
31 5
|
1月前
|
机器学习/深度学习 人工智能 开发框架
【AI系统】AI 学习方法与算法现状
在人工智能的历史长河中,我们见证了从规则驱动系统到现代机器学习模型的转变。AI的学习方法基于深度神经网络,通过前向传播、反向传播和梯度更新不断优化权重,实现从训练到推理的过程。当前,AI算法如CNN、RNN、GNN和GAN等在各自领域取得突破,推动技术进步的同时也带来了更大的挑战,要求算法工程师与系统设计师紧密合作,共同拓展AI技术的边界。
81 1
|
1月前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
1月前
|
人工智能 算法 JavaScript
无界SaaS与AI算力算法,链接裂变万企万商万物互联
本文介绍了一种基于无界SaaS与AI算力算法的商业模式的技术实现方案,涵盖前端、后端、数据库及AI算法等关键部分。通过React.js构建用户界面,Node.js与Express搭建后端服务,MongoDB存储数据,TensorFlow实现AI功能。提供了项目结构、代码示例及部署建议,强调了安全性、可扩展性和性能优化的重要性。
|
3月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
182 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
2月前
|
机器学习/深度学习 人工智能 开发框架
智能ai量化高频策略交易软件、现货合约跟单模式开发技术规则
该项目涵盖智能AI量化高频策略交易软件及现货合约跟单模式开发,融合人工智能、量化交易与软件工程。软件开发包括需求分析、技术选型、系统构建、测试部署及运维;跟单模式则涉及功能定义、策略开发、交易执行、终端设计与市场推广,确保系统高效稳定运行。
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
276 1