1. 项目概述在边缘设备上跑一个像ResNet-152这样的大模型动辄几百兆的权重文件对内存和存储都是巨大的负担。这就像让你用一部老式功能机的存储空间去装一个现代3A游戏根本不可能。为了解决这个问题模型压缩技术应运而生其中权重剪枝和量化是两大主流手段。剪枝是把那些不重要的权重直接“剪掉”变成零量化则是把高精度的浮点数权重比如32位用更少的比特数来表示比如8位、4位甚至更激进的5位。5位量化听起来很极端但研究表明对于很多CNN模型5位对数量化在精度损失极小的情况下能带来巨大的存储节省。然而光是量化还不够。量化后的权重数据里依然存在大量冗余信息尤其是经过剪枝后权重矩阵变得非常稀疏充满了大量的零值。这时候数据压缩技术就能派上用场了。我们熟知的哈夫曼编码就是一种熵编码它根据符号出现的概率分配不同长度的码字出现概率高的用短码概率低的用长码从而实现压缩。但哈夫曼编码有个理论上的限制它的压缩率无法突破信息熵的极限而且对于某些概率分布效率并非最优。算术编码是另一种更高效的熵编码方法。它不像哈夫曼编码那样为每个符号分配一个独立的码字而是将整个输入序列映射到一个0到1之间的单一实数区间。理论上它能无限逼近信息熵的极限达到更高的压缩比。这篇论文的核心就是把算术编码和5位量化权重结合起来并设计了一个专门的硬件解码器让压缩后的权重能在资源受限的边缘设备上被快速、低功耗地解压出来直接喂给CNN加速器进行推理。这不仅仅是软件算法而是软硬件协同设计目标是在几乎不增加推理延迟的前提下大幅降低模型对存储和内存带宽的需求。2. 核心思路与方案选型2.1 为什么是5位量化算术编码选择5位量化作为起点是基于一个权衡。更低的比特数如4位、3位虽然能进一步压缩数据但带来的精度损失可能难以接受特别是对于复杂的视觉任务。5位量化尤其是基于对数的5位量化被证明是一个在精度和压缩率之间很好的平衡点。对数量化还有一个硬件友好的优势乘法操作可以被简化为移位操作这在没有专用浮点单元的嵌入式设备上能显著提升计算效率。那么为什么在量化之后还要用算术编码而不是更简单的哈夫曼编码关键在于压缩效率。算术编码在理论上能达到更高的压缩比因为它能将整个序列编码成一个接近最优长度的码流。对于经过剪枝和量化后的权重数据其值分布往往高度集中大量零值和少数几个特定的非零值这种分布特性使得算术编码能更紧凑地表示数据。论文中的实验也证实了这一点在5位量化权重上算术编码比哈夫曼编码平均提升了3.7%的压缩比而在剪枝量化的权重上优势更加明显压缩比提升了2.2倍到3.9倍。2.2 整体架构与执行流程整个方案分为离线的编码阶段和在线的解码推理阶段这是一个典型的分工策略。离线编码云端/数据中心训练与量化首先在拥有强大算力的云端使用FP32精度训练好CNN模型。剪枝可选应用剪枝算法移除不重要的权重连接增加稀疏性。5位量化采用已有的量化方法如论文中提到的INQ将FP32权重转换为5位格式0-31的整数。算术编码压缩这是本文的核心贡献之一。对量化后的权重序列应用带范围缩放Range Scaling的算术编码生成高度压缩的比特流。这个压缩过程是无损的意味着解压后能得到完全相同的5位权重不会引入额外的精度损失。分发将压缩后的权重比特流和对应的概率表记录每个权重值出现的频率部署到边缘设备。在线推理边缘设备存储压缩的权重比特流存储在边缘设备的闪存或内存中。按需解压当CNN加速器需要某一层的权重进行计算时硬件解码器开始工作。硬件解码解码器从内存中读取压缩比特流结合预存好的概率表实时解压出原始的5位权重。计算解压后的权重直接送入CNN加速器的私有本地内存供计算单元使用。流水线隐藏延迟关键技巧在于第i层权重的解码和数据传输可以与第i-1层的卷积计算同时进行流水线。这样除了第一层后续层的解码延迟几乎可以被完全隐藏。这个架构的精妙之处在于将计算密集型的编码工作放在云端边缘设备只负责轻量级的解码。同时通过专用的硬件解码器和流水线设计将解压这个额外步骤对整体推理速度的影响降到了最低。3. 带范围缩放的算术编码算法详解标准的算术编码理论很美但直接硬件实现会遇到问题它输出的是一个理论上无限精度的实数这在实际的二进制计算机中是无法表示的。论文采用的是一种适应二进制的、带范围缩放的算术编码变体它更易于硬件实现。3.1 核心思想与问题想象一个数轴从0到1我们根据每个权重值出现的概率把这个区间划分成若干个子区间。编码过程就是根据输入序列一步步缩小目标区间。最终这个区间内的任何一个数都能唯一代表整个输入序列。但在二进制硬件中我们只能用有限位比如N16位或32位的无符号整数来近似表示这个实数区间。如果我们简单地把0-1映射到0到MAX例如N8时MAX255在编码长序列时用于表示当前区间的[low, high]会越来越小可能小到无法用有限的整数精度来区分这就发生了“下溢”导致编码失败或精度损失。3.2 范围缩放解决下溢的钥匙为了解决下溢问题论文引入了“范围缩放”技术。其核心思想是当当前区间[low, high]落在整个数值空间的某个特定部分时我们就对它进行“放大”同时输出相应的比特到码流中记录这次缩放操作。缩放规则有三种情况假设整个空间是[0, MAX]HALF MAX/2QTR MAX/4低区缩放如果high HALF说明当前区间完全落在下半区。那么最终编码结果的最高位MSB肯定是0。我们可以安全地将区间放大两倍low low * 2,high high * 2并向输出比特流写入一个0。高区缩放如果low HALF说明当前区间完全落在上半区。那么最终编码结果的MSB肯定是1。我们将区间平移并放大两倍low (low - HALF) * 2,high (high - HALF) * 2并向输出比特流写入一个1。中区缩放如果low QTR high 3*QTR说明当前区间横跨中点附近。此时无法确定MSB是0还是1。我们不立即输出比特而是将区间以中点为基准进行“聚焦”放大low (low - QTR) * 2,high (high - QTR) * 2。同时我们用一个计数器RS记录连续进行中区缩放的次数。RS计数器的作用当中区缩放连续发生时意味着当前区间非常接近中心点不确定性最高。RS记录了这种“犹豫”的次数。当后续遇到高区或低区缩放时我们不仅输出决定性的1或0还会额外输出RS个相反的比特高区缩放后输出RS个0低区缩放后输出RS个1。这相当于把之前累积的不确定性信息补上。实操心得理解RS是理解整个编码/解码同步的关键。它确保了编码器和解码器在面对一连串“中区缩放”时能够保持对区间位置的同步认知。在硬件实现中RS通常只需要几比特的计数器就够了因为连续中区缩放很多次的情况在实践中很少见。3.3 编码过程逐步拆解结合图4的伪代码我们用一个简化例子走一遍。假设权重值只有{0,1,2}概率为{0.4,0.4,0.2}累积概率F为{0, 0.4, 0.8, 1.0}。要编码序列{0,1,0,1,2}设N8MAX255。初始化low0,highMAX255,RS0。编码第一个元素‘0’新区间[low, high][0⌊255*F[0]⌋, 0⌊255*F[1]⌋][0, 102]。因为high102 HALF128属于低区缩放。输出比特0因为RS0没有附加比特。缩放后区间变为[0, 204]。此时区间[0,204]不满足任何缩放条件。编码第二个元素‘1’当前区间为[0,204]宽度range204。‘1’的子区间为[0⌊204*F[1]⌋, 0⌊204*F[2]⌋][81, 163]。因为low81 QTR64且high163 3*QTR192属于中区缩放。不输出比特RS加1变为1。缩放后区间变为[(81-64)*2, (163-64)*2][34, 198]。新区间不满足中区缩放条件。编码第三个元素‘0’当前区间[34,198]宽度range164。‘0’的子区间为[34⌊164*F[0]⌋, 34⌊164*F[1]⌋][34, 99]。high99 HALF128属于低区缩放。此时RS1所以输出比特0MSB后再输出RS1个1即输出01。然后RS重置为0。缩放后区间变为[68, 198]。编码第四个元素‘1’区间[68,198]宽度range130。‘1’的子区间[68⌊130*0.4⌋, 68⌊130*0.8⌋][120, 172]。low120 QTR64且high172 192属于中区缩放。RS加1变为1。缩放后区间[(120-64)*2, (172-64)*2][112, 216]。编码第五个元素‘2’区间[112,216]宽度range104。‘2’的子区间[112⌊104*F[2]⌋, 112⌊104*F[3]⌋][195, 216]。low195 HALF128属于高区缩放。输出1MSB和RS1个0即输出10。RS重置为0。缩放后区间[(195-128)*2, (216-128)*2][134, 176]。此时low134 HALF再次高区缩放。输出1没有附加比特因为RS0。缩放后区间[(134-128)*2, (176-128)*2][12, 96]。此时high96 HALF低区缩放。输出0。缩放后区间[24, 192]不满足任何条件循环结束。最终处理循环结束后区间为[24,192]。此时low24 QTR64属于低半区。RS先加1变为1然后输出0和RS1个1即01。最终输出的比特流为0011010010011010019比特。原始5位数据共5*525比特压缩到了9比特。解码过程是编码的逆过程。解码器同样维护low、high区间和一个指向压缩比特流的滑动窗口Z。它读入Z判断其落在哪个权重值的子区间内输出该权重值然后根据Z相对于当前区间的位置执行与编码器完全相同的范围缩放操作并更新Z即滑动窗口如此循环。注意事项编码和解码必须使用完全相同的概率表PROB和参数N。概率表通常很小对于5位权重只需要存储32个值的频率可以用16位或32位整数表示可以事先计算好并存储在解码硬件中。N的选择是一个权衡更大的N能提供更精细的区间划分减少缩放次数但也会增加硬件中寄存器的位宽。论文中选择N32是一个经验值在压缩率和计算复杂度之间取得了平衡。4. 硬件解码器设计与实现算法再好也需要高效的硬件来实现才能在边缘设备上满足实时性的要求。软件解码虽然灵活但其速度和能效无法与定制硬件相比。4.1 解码单元架构论文提出的解码单元DU架构如图10所示是一个高度流水化和并行的设计。核心组件比特流缓冲区存储从主存加载的压缩权重比特流。概率表一个小型的片上存储器如BRAM存储每个权重值0-31的累积概率F[x]。这是一个只读表在初始化后不变。范围缩放单元这是解码器的核心逻辑之一。它根据当前Z值从比特流缓冲区中取出的N位窗口和当前的[low, high]区间判断属于哪种缩放情况高、低、中并执行相应的缩放操作同时更新Z值和idx比特流索引。范围计算单元根据缩放后的[low, high]区间和概率表并行计算32个可能的子区间对应32个可能的权重值。这是一个计算密集型部分并行化至关重要。比较器阵列将当前的Z值与32个子区间并行比较找出Z落在哪个子区间内从而确定解码出的权重值。解码权重缓冲区存储解码出的原始5位权重等待被CNN加速器读取。控制逻辑协调以上所有单元的工作流程实现状态机控制。工作流程控制逻辑初始化low0,highMAX,idx0。从比特流缓冲区读取Z(idx)N位。范围缩放单元检查Z和当前区间可能进行多次缩放while循环每次缩放可能消耗输出比特流中的位并更新idx。缩放稳定后范围计算单元利用当前的[low, high]和概率表并行计算出所有32个权重值的子区间[low_j, high_j]。比较器阵列并行检查Z是否满足low_j Z high_j。满足条件的j即为解码出的权重值。将该权重值写入解码权重缓冲区。更新[low, high]区间为[low_j, high_j]准备解码下一个权重。重复步骤2-7直到所有权重解码完毕。4.2 多DU并行与资源权衡单个DU的解码速度有限。为了提升吞吐量论文采用了数据并行的策略权重分块在编码阶段就将整个网络的权重分成多个大小相近的块。独立编码每个块独立进行算术编码生成独立的压缩比特流。并行解码在解码硬件中集成多个完全相同的DU。每个DU处理一个块的比特流独立、并行地解码。这样解码速度理论上可以随DU数量线性提升。论文在FPGAZCU106上实现了16个DU的设计平均每个权重解码只需6.45个时钟周期。实操心得DU的数量是一个关键的设计折衷。更多的DU带来更高的解码吞吐量和更低的延迟但也会消耗更多的逻辑资源LUT、FF、DSP块和片上存储器BRAM。对于资源极度受限的微型边缘设备如Ultra96平台可能只能容纳2个或4个DU。设计师需要根据目标设备的硬件预算和系统对推理延迟的要求来选择DU的数量。论文图12展示了这种权衡2-DU解码器在AlexNet上可能带来超过100%的延迟开销而16-DU解码器则能将开销控制在1%以内。4.3 延迟隐藏技术解码权重需要时间如果等所有权重都解码完再开始计算延迟是不可接受的。论文巧妙地利用了CNN推理的层间流水线来隐藏这部分延迟。前提条件CNN加速器的片上内存足够大能同时容纳至少两层的输入/输出特征图避免层间数据频繁进出片外内存。解码和传输第i层权重的时间必须小于等于计算第i-1层的时间。流水线执行时间点 T0开始计算第1层。同时启动第2层权重的解码和数据传输。时间点 T1第1层计算完成。此时第2层的权重已经解码并传输完毕立即开始第2层计算。同时启动第3层权重的解码和传输。依此类推...在这种模式下只有第一层权重的解码延迟是无法隐藏的因为它前面没有计算可以重叠。后续所有层的解码延迟都被成功隐藏。因此整个系统的额外延迟仅仅等于第一层权重的解码时间。通过使用多DU解码器加快第一层解码速度这个开销可以变得非常小。5. 性能评估与结果分析论文在五个经典CNN模型NiN, SqueezeNet, GoogleNet, AlexNet, CaffeNet上进行了全面的评估涵盖了压缩率、能耗和延迟三大指标。5.1 压缩率与内存能耗压缩率压缩率定义为未压缩数据大小与压缩后数据大小的比值CR Su/Sc。比值越大压缩效果越好。模型32-bit FP16-bit8-bit5-bitHC-5bitAC-5bit (Ours)IE-5bit (理论极限)NiN1x (基准)2x4x6.4x8.2x8.5x8.5xSqueezeNet1x2x4x6.4x8.3x8.6x8.6xGoogleNet1x2x4x6.4x8.2x8.5x8.5xAlexNet (Q)1x2x4x6.4x8.3x8.6x8.6xCaffeNet (Q)1x2x4x6.4x8.4x8.7x8.7x平均 (仅Q)1x2x4x6.4x8.3x8.6x8.6xAlexNet (PQ)1x---26.7x57.5x-CaffeNet (PQ)1x---28.8x112.2x-关键结论量化是基础5位量化本身就能带来6.4倍的压缩相比32位。算术编码优势在5位量化基础上算术编码AC-5bit比哈夫曼编码HC-5bit平均提升3.7%的压缩比并且几乎达到了信息熵IE-5bit的理论极限证明其编码效率极高。剪枝的威力当结合权重剪枝PQ时压缩率产生飞跃。AlexNet达到57.5倍CaffeNet甚至达到112.2倍。这是因为剪枝产生了大量零值而算术编码能极其高效地压缩这种稀疏数据。内存能耗降低压缩率直接转化为内存数据传输能耗的节省。论文估算使用LPDDR4内存时AC-5bit方案相比未压缩的32位权重平均减少了89.2%的内存传输能耗。对于剪枝后的模型能耗降低高达98.3%-99.1%。5.2 解码延迟开销这是衡量方案实用性的关键。延迟开销主要来自第一层权重的解码。组合加速器基准延迟 (ms)无延迟隐藏有延迟隐藏 (16-DU)延迟 (ms)开销Accelerator A [9]0.700.7912.9%Accelerator B [10]18.4520.9213.4%Accelerator C [11] (8-bit)25.9837.1342.9%关键结论延迟隐藏至关重要如果不做流水线隐藏解码延迟开销可能高达13%-43%。一旦采用层间流水线隐藏开销骤降至0.16%-1.43%几乎可以忽略不计。硬件并行度16-DU的解码器提供了足够的解码吞吐量使得第一层的解码时间非常短从而实现了极低的延迟开销。兼容性即使对于8位精度的加速器Accelerator C本方案仅压缩其中的5位也能在带来压缩好处的同时保持仅1.4%的延迟开销展示了良好的兼容性。5.3 系统级能效与设计折衷论文进一步评估了在资源受限平台如Ultra96上使用较少DU如4-DU时的系统级能效。指标基准 (仅5-bit Q)本方案 (PQ 4-DU)Accelerator A [9]加速器功耗 (W)2.52.8推理延迟 (ms)0.700.72加速器能耗 (µJ)17502016系统总能耗 (µJ)18351665系统节能--9.3%Accelerator B [10]加速器功耗 (W)4.14.3推理延迟 (ms)18.4518.48加速器能耗 (µJ)7564579464系统总能耗 (µJ)7682075975系统节能--1.1%分析加速器能耗增加加入4-DU解码器硬件会增加一些功耗同时因为轻微的延迟增加导致加速器本身消耗的能量有所上升5.7% ~ 40.2%。系统总能耗下降然而由于权重被高度压缩从闪存加载和从内存传输权重数据所需的能量大幅下降。这部分节省的能量超过了解码硬件带来的额外能耗。最终整个系统加速器内存存储的总能耗实现了1.1%到9.3%的降低。设计启示对于边缘设备不能只看计算单元的能耗内存访问能耗往往是更大的瓶颈。本方案通过压缩数据精准地优化了这块“耗能大户”即使计算部分略有增加整体仍然是赢的。6. 常见问题与实现考量6.1 概率表如何获取与存储概率表是编解码的基础。它需要在离线阶段统计训练好的、量化后的权重中每个值0-31出现的频率。这个频率表非常小只有32个条目。在硬件中可以用一个小的查找表LUT或片上内存如BRAM来存储。每个条目存储的是累积概率F[x]可以用定点数表示例如用16位整数表示分子分母为总权重数。解码时F[x]用于计算low_j low floor(range * F[x])。由于range和F[x]都是整数这个计算可以通过乘法和移位来实现避免浮点运算。6.2 如何处理不同的层或不同的权重块不同的卷积层其权重值的分布可能不同。有两种策略全局概率表为整个网络的所有权重计算一个统一的概率表。优点是只需存储一份表节省资源。缺点是压缩率可能不是最优因为无法适应每层独特的分布。每层概率表为每一层或每个权重块计算独立的概率表。优点是能获得每层最优的压缩率。缺点是存储开销随层数线性增加并且解码硬件需要能够动态加载不同的概率表。论文中倾向于使用每层概率表因为对于资源受限的设备存储压缩后的权重比特流是主要矛盾而多存储几十个字节的概率表开销相对很小却能换来更高的压缩率。6.3 硬件实现中的精度与位宽问题N的选择N是表示区间[low, high]的整数位宽。N越大区间划分越精细编码效率越高但硬件中寄存器和乘法器的位宽也越大消耗更多资源。N32是一个常见的选择在精度和资源消耗间取得平衡。中间计算溢出在计算range * F[x]时range可能是一个很大的数接近MAX。使用N位乘法时需要确保结果不会溢出。通常需要用到2N位的中间结果然后再取整到N位。缩放操作的硬件实现高、低、中区缩放的判断和操作比较、减法、移位都可以用简单的组合逻辑实现非常适合硬件流水线。6.4 与现有CNN加速器的集成本方案的解码器是独立于CNN加速器的模块。集成方式相对简单内存接口解码器需要直接访问存储压缩权重的主存如DDR。权重缓冲区接口解码器输出解压后的权重写入一个共享的或专有的权重缓冲区该缓冲区与CNN加速器的读取端口相连。控制信号需要有一个控制器来协调解码器和加速器的工作。控制器知道网络结构会在加速器计算第i-1层时触发解码器开始解码第i层权重。当加速器准备计算第i层时权重应该已经解码完毕并就位。这种松耦合的设计使得该方案可以作为一个“压缩-解压”加速IP相对容易地集成到现有的边缘AI SoC设计中。6.5 扩展到其他比特宽度论文主要针对5位量化但方法本身具有通用性。算术编码可以应用于任意比特宽度的量化权重。只需调整概率表的大小从32个条目变为2^b个条目其中b是量化比特数和相应的硬件位宽即可。对于更高的比特宽度如8位虽然压缩率提升空间可能不如5位明显因为信息熵本身更高但依然能减少数据量。对于更低的比特宽度如4位硬件实现会更简单但需要更仔细地评估精度损失。
5位量化权重结合算术编码:边缘CNN模型存储与带宽优化方案
1. 项目概述在边缘设备上跑一个像ResNet-152这样的大模型动辄几百兆的权重文件对内存和存储都是巨大的负担。这就像让你用一部老式功能机的存储空间去装一个现代3A游戏根本不可能。为了解决这个问题模型压缩技术应运而生其中权重剪枝和量化是两大主流手段。剪枝是把那些不重要的权重直接“剪掉”变成零量化则是把高精度的浮点数权重比如32位用更少的比特数来表示比如8位、4位甚至更激进的5位。5位量化听起来很极端但研究表明对于很多CNN模型5位对数量化在精度损失极小的情况下能带来巨大的存储节省。然而光是量化还不够。量化后的权重数据里依然存在大量冗余信息尤其是经过剪枝后权重矩阵变得非常稀疏充满了大量的零值。这时候数据压缩技术就能派上用场了。我们熟知的哈夫曼编码就是一种熵编码它根据符号出现的概率分配不同长度的码字出现概率高的用短码概率低的用长码从而实现压缩。但哈夫曼编码有个理论上的限制它的压缩率无法突破信息熵的极限而且对于某些概率分布效率并非最优。算术编码是另一种更高效的熵编码方法。它不像哈夫曼编码那样为每个符号分配一个独立的码字而是将整个输入序列映射到一个0到1之间的单一实数区间。理论上它能无限逼近信息熵的极限达到更高的压缩比。这篇论文的核心就是把算术编码和5位量化权重结合起来并设计了一个专门的硬件解码器让压缩后的权重能在资源受限的边缘设备上被快速、低功耗地解压出来直接喂给CNN加速器进行推理。这不仅仅是软件算法而是软硬件协同设计目标是在几乎不增加推理延迟的前提下大幅降低模型对存储和内存带宽的需求。2. 核心思路与方案选型2.1 为什么是5位量化算术编码选择5位量化作为起点是基于一个权衡。更低的比特数如4位、3位虽然能进一步压缩数据但带来的精度损失可能难以接受特别是对于复杂的视觉任务。5位量化尤其是基于对数的5位量化被证明是一个在精度和压缩率之间很好的平衡点。对数量化还有一个硬件友好的优势乘法操作可以被简化为移位操作这在没有专用浮点单元的嵌入式设备上能显著提升计算效率。那么为什么在量化之后还要用算术编码而不是更简单的哈夫曼编码关键在于压缩效率。算术编码在理论上能达到更高的压缩比因为它能将整个序列编码成一个接近最优长度的码流。对于经过剪枝和量化后的权重数据其值分布往往高度集中大量零值和少数几个特定的非零值这种分布特性使得算术编码能更紧凑地表示数据。论文中的实验也证实了这一点在5位量化权重上算术编码比哈夫曼编码平均提升了3.7%的压缩比而在剪枝量化的权重上优势更加明显压缩比提升了2.2倍到3.9倍。2.2 整体架构与执行流程整个方案分为离线的编码阶段和在线的解码推理阶段这是一个典型的分工策略。离线编码云端/数据中心训练与量化首先在拥有强大算力的云端使用FP32精度训练好CNN模型。剪枝可选应用剪枝算法移除不重要的权重连接增加稀疏性。5位量化采用已有的量化方法如论文中提到的INQ将FP32权重转换为5位格式0-31的整数。算术编码压缩这是本文的核心贡献之一。对量化后的权重序列应用带范围缩放Range Scaling的算术编码生成高度压缩的比特流。这个压缩过程是无损的意味着解压后能得到完全相同的5位权重不会引入额外的精度损失。分发将压缩后的权重比特流和对应的概率表记录每个权重值出现的频率部署到边缘设备。在线推理边缘设备存储压缩的权重比特流存储在边缘设备的闪存或内存中。按需解压当CNN加速器需要某一层的权重进行计算时硬件解码器开始工作。硬件解码解码器从内存中读取压缩比特流结合预存好的概率表实时解压出原始的5位权重。计算解压后的权重直接送入CNN加速器的私有本地内存供计算单元使用。流水线隐藏延迟关键技巧在于第i层权重的解码和数据传输可以与第i-1层的卷积计算同时进行流水线。这样除了第一层后续层的解码延迟几乎可以被完全隐藏。这个架构的精妙之处在于将计算密集型的编码工作放在云端边缘设备只负责轻量级的解码。同时通过专用的硬件解码器和流水线设计将解压这个额外步骤对整体推理速度的影响降到了最低。3. 带范围缩放的算术编码算法详解标准的算术编码理论很美但直接硬件实现会遇到问题它输出的是一个理论上无限精度的实数这在实际的二进制计算机中是无法表示的。论文采用的是一种适应二进制的、带范围缩放的算术编码变体它更易于硬件实现。3.1 核心思想与问题想象一个数轴从0到1我们根据每个权重值出现的概率把这个区间划分成若干个子区间。编码过程就是根据输入序列一步步缩小目标区间。最终这个区间内的任何一个数都能唯一代表整个输入序列。但在二进制硬件中我们只能用有限位比如N16位或32位的无符号整数来近似表示这个实数区间。如果我们简单地把0-1映射到0到MAX例如N8时MAX255在编码长序列时用于表示当前区间的[low, high]会越来越小可能小到无法用有限的整数精度来区分这就发生了“下溢”导致编码失败或精度损失。3.2 范围缩放解决下溢的钥匙为了解决下溢问题论文引入了“范围缩放”技术。其核心思想是当当前区间[low, high]落在整个数值空间的某个特定部分时我们就对它进行“放大”同时输出相应的比特到码流中记录这次缩放操作。缩放规则有三种情况假设整个空间是[0, MAX]HALF MAX/2QTR MAX/4低区缩放如果high HALF说明当前区间完全落在下半区。那么最终编码结果的最高位MSB肯定是0。我们可以安全地将区间放大两倍low low * 2,high high * 2并向输出比特流写入一个0。高区缩放如果low HALF说明当前区间完全落在上半区。那么最终编码结果的MSB肯定是1。我们将区间平移并放大两倍low (low - HALF) * 2,high (high - HALF) * 2并向输出比特流写入一个1。中区缩放如果low QTR high 3*QTR说明当前区间横跨中点附近。此时无法确定MSB是0还是1。我们不立即输出比特而是将区间以中点为基准进行“聚焦”放大low (low - QTR) * 2,high (high - QTR) * 2。同时我们用一个计数器RS记录连续进行中区缩放的次数。RS计数器的作用当中区缩放连续发生时意味着当前区间非常接近中心点不确定性最高。RS记录了这种“犹豫”的次数。当后续遇到高区或低区缩放时我们不仅输出决定性的1或0还会额外输出RS个相反的比特高区缩放后输出RS个0低区缩放后输出RS个1。这相当于把之前累积的不确定性信息补上。实操心得理解RS是理解整个编码/解码同步的关键。它确保了编码器和解码器在面对一连串“中区缩放”时能够保持对区间位置的同步认知。在硬件实现中RS通常只需要几比特的计数器就够了因为连续中区缩放很多次的情况在实践中很少见。3.3 编码过程逐步拆解结合图4的伪代码我们用一个简化例子走一遍。假设权重值只有{0,1,2}概率为{0.4,0.4,0.2}累积概率F为{0, 0.4, 0.8, 1.0}。要编码序列{0,1,0,1,2}设N8MAX255。初始化low0,highMAX255,RS0。编码第一个元素‘0’新区间[low, high][0⌊255*F[0]⌋, 0⌊255*F[1]⌋][0, 102]。因为high102 HALF128属于低区缩放。输出比特0因为RS0没有附加比特。缩放后区间变为[0, 204]。此时区间[0,204]不满足任何缩放条件。编码第二个元素‘1’当前区间为[0,204]宽度range204。‘1’的子区间为[0⌊204*F[1]⌋, 0⌊204*F[2]⌋][81, 163]。因为low81 QTR64且high163 3*QTR192属于中区缩放。不输出比特RS加1变为1。缩放后区间变为[(81-64)*2, (163-64)*2][34, 198]。新区间不满足中区缩放条件。编码第三个元素‘0’当前区间[34,198]宽度range164。‘0’的子区间为[34⌊164*F[0]⌋, 34⌊164*F[1]⌋][34, 99]。high99 HALF128属于低区缩放。此时RS1所以输出比特0MSB后再输出RS1个1即输出01。然后RS重置为0。缩放后区间变为[68, 198]。编码第四个元素‘1’区间[68,198]宽度range130。‘1’的子区间[68⌊130*0.4⌋, 68⌊130*0.8⌋][120, 172]。low120 QTR64且high172 192属于中区缩放。RS加1变为1。缩放后区间[(120-64)*2, (172-64)*2][112, 216]。编码第五个元素‘2’区间[112,216]宽度range104。‘2’的子区间[112⌊104*F[2]⌋, 112⌊104*F[3]⌋][195, 216]。low195 HALF128属于高区缩放。输出1MSB和RS1个0即输出10。RS重置为0。缩放后区间[(195-128)*2, (216-128)*2][134, 176]。此时low134 HALF再次高区缩放。输出1没有附加比特因为RS0。缩放后区间[(134-128)*2, (176-128)*2][12, 96]。此时high96 HALF低区缩放。输出0。缩放后区间[24, 192]不满足任何条件循环结束。最终处理循环结束后区间为[24,192]。此时low24 QTR64属于低半区。RS先加1变为1然后输出0和RS1个1即01。最终输出的比特流为0011010010011010019比特。原始5位数据共5*525比特压缩到了9比特。解码过程是编码的逆过程。解码器同样维护low、high区间和一个指向压缩比特流的滑动窗口Z。它读入Z判断其落在哪个权重值的子区间内输出该权重值然后根据Z相对于当前区间的位置执行与编码器完全相同的范围缩放操作并更新Z即滑动窗口如此循环。注意事项编码和解码必须使用完全相同的概率表PROB和参数N。概率表通常很小对于5位权重只需要存储32个值的频率可以用16位或32位整数表示可以事先计算好并存储在解码硬件中。N的选择是一个权衡更大的N能提供更精细的区间划分减少缩放次数但也会增加硬件中寄存器的位宽。论文中选择N32是一个经验值在压缩率和计算复杂度之间取得了平衡。4. 硬件解码器设计与实现算法再好也需要高效的硬件来实现才能在边缘设备上满足实时性的要求。软件解码虽然灵活但其速度和能效无法与定制硬件相比。4.1 解码单元架构论文提出的解码单元DU架构如图10所示是一个高度流水化和并行的设计。核心组件比特流缓冲区存储从主存加载的压缩权重比特流。概率表一个小型的片上存储器如BRAM存储每个权重值0-31的累积概率F[x]。这是一个只读表在初始化后不变。范围缩放单元这是解码器的核心逻辑之一。它根据当前Z值从比特流缓冲区中取出的N位窗口和当前的[low, high]区间判断属于哪种缩放情况高、低、中并执行相应的缩放操作同时更新Z值和idx比特流索引。范围计算单元根据缩放后的[low, high]区间和概率表并行计算32个可能的子区间对应32个可能的权重值。这是一个计算密集型部分并行化至关重要。比较器阵列将当前的Z值与32个子区间并行比较找出Z落在哪个子区间内从而确定解码出的权重值。解码权重缓冲区存储解码出的原始5位权重等待被CNN加速器读取。控制逻辑协调以上所有单元的工作流程实现状态机控制。工作流程控制逻辑初始化low0,highMAX,idx0。从比特流缓冲区读取Z(idx)N位。范围缩放单元检查Z和当前区间可能进行多次缩放while循环每次缩放可能消耗输出比特流中的位并更新idx。缩放稳定后范围计算单元利用当前的[low, high]和概率表并行计算出所有32个权重值的子区间[low_j, high_j]。比较器阵列并行检查Z是否满足low_j Z high_j。满足条件的j即为解码出的权重值。将该权重值写入解码权重缓冲区。更新[low, high]区间为[low_j, high_j]准备解码下一个权重。重复步骤2-7直到所有权重解码完毕。4.2 多DU并行与资源权衡单个DU的解码速度有限。为了提升吞吐量论文采用了数据并行的策略权重分块在编码阶段就将整个网络的权重分成多个大小相近的块。独立编码每个块独立进行算术编码生成独立的压缩比特流。并行解码在解码硬件中集成多个完全相同的DU。每个DU处理一个块的比特流独立、并行地解码。这样解码速度理论上可以随DU数量线性提升。论文在FPGAZCU106上实现了16个DU的设计平均每个权重解码只需6.45个时钟周期。实操心得DU的数量是一个关键的设计折衷。更多的DU带来更高的解码吞吐量和更低的延迟但也会消耗更多的逻辑资源LUT、FF、DSP块和片上存储器BRAM。对于资源极度受限的微型边缘设备如Ultra96平台可能只能容纳2个或4个DU。设计师需要根据目标设备的硬件预算和系统对推理延迟的要求来选择DU的数量。论文图12展示了这种权衡2-DU解码器在AlexNet上可能带来超过100%的延迟开销而16-DU解码器则能将开销控制在1%以内。4.3 延迟隐藏技术解码权重需要时间如果等所有权重都解码完再开始计算延迟是不可接受的。论文巧妙地利用了CNN推理的层间流水线来隐藏这部分延迟。前提条件CNN加速器的片上内存足够大能同时容纳至少两层的输入/输出特征图避免层间数据频繁进出片外内存。解码和传输第i层权重的时间必须小于等于计算第i-1层的时间。流水线执行时间点 T0开始计算第1层。同时启动第2层权重的解码和数据传输。时间点 T1第1层计算完成。此时第2层的权重已经解码并传输完毕立即开始第2层计算。同时启动第3层权重的解码和传输。依此类推...在这种模式下只有第一层权重的解码延迟是无法隐藏的因为它前面没有计算可以重叠。后续所有层的解码延迟都被成功隐藏。因此整个系统的额外延迟仅仅等于第一层权重的解码时间。通过使用多DU解码器加快第一层解码速度这个开销可以变得非常小。5. 性能评估与结果分析论文在五个经典CNN模型NiN, SqueezeNet, GoogleNet, AlexNet, CaffeNet上进行了全面的评估涵盖了压缩率、能耗和延迟三大指标。5.1 压缩率与内存能耗压缩率压缩率定义为未压缩数据大小与压缩后数据大小的比值CR Su/Sc。比值越大压缩效果越好。模型32-bit FP16-bit8-bit5-bitHC-5bitAC-5bit (Ours)IE-5bit (理论极限)NiN1x (基准)2x4x6.4x8.2x8.5x8.5xSqueezeNet1x2x4x6.4x8.3x8.6x8.6xGoogleNet1x2x4x6.4x8.2x8.5x8.5xAlexNet (Q)1x2x4x6.4x8.3x8.6x8.6xCaffeNet (Q)1x2x4x6.4x8.4x8.7x8.7x平均 (仅Q)1x2x4x6.4x8.3x8.6x8.6xAlexNet (PQ)1x---26.7x57.5x-CaffeNet (PQ)1x---28.8x112.2x-关键结论量化是基础5位量化本身就能带来6.4倍的压缩相比32位。算术编码优势在5位量化基础上算术编码AC-5bit比哈夫曼编码HC-5bit平均提升3.7%的压缩比并且几乎达到了信息熵IE-5bit的理论极限证明其编码效率极高。剪枝的威力当结合权重剪枝PQ时压缩率产生飞跃。AlexNet达到57.5倍CaffeNet甚至达到112.2倍。这是因为剪枝产生了大量零值而算术编码能极其高效地压缩这种稀疏数据。内存能耗降低压缩率直接转化为内存数据传输能耗的节省。论文估算使用LPDDR4内存时AC-5bit方案相比未压缩的32位权重平均减少了89.2%的内存传输能耗。对于剪枝后的模型能耗降低高达98.3%-99.1%。5.2 解码延迟开销这是衡量方案实用性的关键。延迟开销主要来自第一层权重的解码。组合加速器基准延迟 (ms)无延迟隐藏有延迟隐藏 (16-DU)延迟 (ms)开销Accelerator A [9]0.700.7912.9%Accelerator B [10]18.4520.9213.4%Accelerator C [11] (8-bit)25.9837.1342.9%关键结论延迟隐藏至关重要如果不做流水线隐藏解码延迟开销可能高达13%-43%。一旦采用层间流水线隐藏开销骤降至0.16%-1.43%几乎可以忽略不计。硬件并行度16-DU的解码器提供了足够的解码吞吐量使得第一层的解码时间非常短从而实现了极低的延迟开销。兼容性即使对于8位精度的加速器Accelerator C本方案仅压缩其中的5位也能在带来压缩好处的同时保持仅1.4%的延迟开销展示了良好的兼容性。5.3 系统级能效与设计折衷论文进一步评估了在资源受限平台如Ultra96上使用较少DU如4-DU时的系统级能效。指标基准 (仅5-bit Q)本方案 (PQ 4-DU)Accelerator A [9]加速器功耗 (W)2.52.8推理延迟 (ms)0.700.72加速器能耗 (µJ)17502016系统总能耗 (µJ)18351665系统节能--9.3%Accelerator B [10]加速器功耗 (W)4.14.3推理延迟 (ms)18.4518.48加速器能耗 (µJ)7564579464系统总能耗 (µJ)7682075975系统节能--1.1%分析加速器能耗增加加入4-DU解码器硬件会增加一些功耗同时因为轻微的延迟增加导致加速器本身消耗的能量有所上升5.7% ~ 40.2%。系统总能耗下降然而由于权重被高度压缩从闪存加载和从内存传输权重数据所需的能量大幅下降。这部分节省的能量超过了解码硬件带来的额外能耗。最终整个系统加速器内存存储的总能耗实现了1.1%到9.3%的降低。设计启示对于边缘设备不能只看计算单元的能耗内存访问能耗往往是更大的瓶颈。本方案通过压缩数据精准地优化了这块“耗能大户”即使计算部分略有增加整体仍然是赢的。6. 常见问题与实现考量6.1 概率表如何获取与存储概率表是编解码的基础。它需要在离线阶段统计训练好的、量化后的权重中每个值0-31出现的频率。这个频率表非常小只有32个条目。在硬件中可以用一个小的查找表LUT或片上内存如BRAM来存储。每个条目存储的是累积概率F[x]可以用定点数表示例如用16位整数表示分子分母为总权重数。解码时F[x]用于计算low_j low floor(range * F[x])。由于range和F[x]都是整数这个计算可以通过乘法和移位来实现避免浮点运算。6.2 如何处理不同的层或不同的权重块不同的卷积层其权重值的分布可能不同。有两种策略全局概率表为整个网络的所有权重计算一个统一的概率表。优点是只需存储一份表节省资源。缺点是压缩率可能不是最优因为无法适应每层独特的分布。每层概率表为每一层或每个权重块计算独立的概率表。优点是能获得每层最优的压缩率。缺点是存储开销随层数线性增加并且解码硬件需要能够动态加载不同的概率表。论文中倾向于使用每层概率表因为对于资源受限的设备存储压缩后的权重比特流是主要矛盾而多存储几十个字节的概率表开销相对很小却能换来更高的压缩率。6.3 硬件实现中的精度与位宽问题N的选择N是表示区间[low, high]的整数位宽。N越大区间划分越精细编码效率越高但硬件中寄存器和乘法器的位宽也越大消耗更多资源。N32是一个常见的选择在精度和资源消耗间取得平衡。中间计算溢出在计算range * F[x]时range可能是一个很大的数接近MAX。使用N位乘法时需要确保结果不会溢出。通常需要用到2N位的中间结果然后再取整到N位。缩放操作的硬件实现高、低、中区缩放的判断和操作比较、减法、移位都可以用简单的组合逻辑实现非常适合硬件流水线。6.4 与现有CNN加速器的集成本方案的解码器是独立于CNN加速器的模块。集成方式相对简单内存接口解码器需要直接访问存储压缩权重的主存如DDR。权重缓冲区接口解码器输出解压后的权重写入一个共享的或专有的权重缓冲区该缓冲区与CNN加速器的读取端口相连。控制信号需要有一个控制器来协调解码器和加速器的工作。控制器知道网络结构会在加速器计算第i-1层时触发解码器开始解码第i层权重。当加速器准备计算第i层时权重应该已经解码完毕并就位。这种松耦合的设计使得该方案可以作为一个“压缩-解压”加速IP相对容易地集成到现有的边缘AI SoC设计中。6.5 扩展到其他比特宽度论文主要针对5位量化但方法本身具有通用性。算术编码可以应用于任意比特宽度的量化权重。只需调整概率表的大小从32个条目变为2^b个条目其中b是量化比特数和相应的硬件位宽即可。对于更高的比特宽度如8位虽然压缩率提升空间可能不如5位明显因为信息熵本身更高但依然能减少数据量。对于更低的比特宽度如4位硬件实现会更简单但需要更仔细地评估精度损失。