ReRAM存内计算实战:从网络剪枝、权重量化到硬件映射的协同优化
1. 项目概述与核心挑战在边缘AI和物联网设备爆发的今天我们这些做硬件加速和芯片设计的老兵每天都在和“功耗墙”、“内存墙”死磕。传统的冯·诺依曼架构把计算和存储分开数据像钟摆一样在CPU和内存之间来回搬运这产生的功耗和延迟在需要实时处理海量数据的场景下简直是灾难。存内计算CIM的概念就像是在内存里直接开个“小厨房”数据不用出门就能被加工理论上能极大提升能效。而在众多CIM的候选技术中基于阻变存储器ReRAM的交叉阵列凭借其非易失、高密度和天然的模拟乘累加计算能力成为了最受瞩目的明星。但理想很丰满现实很骨感。当你真的想把一个动辄数百万参数的神经网络塞进ReRAM交叉阵列时一堆棘手的问题就冒出来了。最头疼的就是IR压降和潜行电流。你可以把交叉阵列想象成一个巨大的、由导线字线和位线交织成的网格每个交叉点是一个ReRAM单元代表一个权重。当阵列规模变大这些导线本身的电阻不可忽视电流流过时就会产生电压降导致施加在阵列边缘和中心的单元上的实际电压不一致计算结果自然就失真了。潜行电流更烦人就像电路里的“漏电”电流会通过非目标路径溜走干扰正常信号信噪比一下就下来了。此外硬件本身也有局限。一个ReRAM单元能稳定区分的电导状态是有限的可能就几十个而神经网络的权重却是高精度的浮点数。这就必须进行权重量化把浮点数“压缩”成有限的几个整数值。同时为了表示正负权重通常需要一对差分单元一个表示正一个表示负这直接导致硬件资源消耗翻倍。如何在有限的、不完美的硬件上高效且准确地部署庞大的神经网络同时还要控制成本、功耗和面积这就是我们面临的核心挑战。本文分享的正是我们团队针对这些问题从软件算法到硬件映射的一整套“组合拳”实战经验。2. 方法论全景从软件剪枝到硬件映射的协同优化面对上述挑战零敲碎打的优化往往事倍功半。我们的思路是构建一个从算法到硬件的协同优化流水线其核心在于“先瘦身再适配”。整个流程可以概括为三步走首先通过渐进式剪枝剔除网络中的冗余参数为后续操作创造更有利的条件其次根据目标硬件精度高比特或低比特选择合适的量化策略最后利用聚类算法对量化后的权重进行智能映射合并相似的参考列从而最大化ReRAM阵列的资源利用率。2.1 第一板斧基于梯度敏感度的渐进式网络剪枝在考虑量化之前我们先给网络“瘦身”。传统的幅度剪枝Magnitude Pruning简单粗暴直接去掉绝对值小的权重。但这有个问题有些权重虽然小但对最终输出的影响梯度可能很大有些权重虽然大但可能处于饱和区剪掉反而影响小。因此我们采用了基于梯度敏感度的渐进式剪枝。为什么是梯度敏感度梯度的绝对值反映了损失函数对某个权重的敏感程度。一个权重的梯度很大意味着它对当前任务的学习至关重要即使它的值很小也不应该被轻易剪除。相比之下一个梯度很小的权重无论其绝对值大小其对网络性能的贡献都相对有限是更安全的修剪候选。实操步骤与心得重要性评分对于网络中的每一层l我们计算其权重矩阵W_l的梯度弗罗贝尼乌斯范数Frobenius norm的期望值作为该层的重要性分数I_l。这个计算需要在多个训练批次上进行平均以得到稳定的估计。公式虽简单但计算开销需要注意我们通常在验证集的一个子集上进行。自适应修剪率分配不是所有层都按统一比例修剪。我们将所有层的重要性分数归一化然后根据公式S_l (1 - sqrt(I_l_norm)) * S_target / 2为每层分配修剪率。这里S_target是全局目标稀疏度比如80%。核心技巧开平方根操作sqrt()是关键它能确保重要性较低的层被分配更高的修剪率而重要性高的层得到更多保护避免“一刀切”对关键层造成毁灭性打击。迭代式修剪-重训练循环这是保证精度的核心。我们不会一步到位剪到80%稀疏度而是分多个迭代进行例如20轮。每一轮根据当前层的修剪率S_l和权重分布计算一个动态阈值剪掉该层中幅度最小的那部分权重。立即对修剪后的网络进行少量epoch如5个的重训练Fine-tuning。这里的坑学习率需要调小例如初始学习率的1/10并使用余弦退火等策略让网络平稳地适应新的稀疏结构。评估当前稀疏度下的验证集精度如果下降在可接受范围内则进入下一轮提高目标稀疏度。注意剪枝后的网络结构是“非结构化”的即权重矩阵中零元素的位置是随机的。这对于ReRAM阵列而言其实是优势因为阵列本身可以灵活地关断任意单元而不需要像GPU那样需要特殊的稀疏计算库支持。但这也意味着我们需要记录非零权重的索引会引入额外的元数据开销需要在算法设计中权衡。通过这套方法我们在LeNet网络上实现了超过82%的稀疏度而MNIST数据集上的精度损失仅从98.51%下降到97.67%。这为后续的量化映射打下了坚实基础——需要存储和计算的权重数量直接减少了五分之四。2.2 第二板斧针对高低比特场景的差异化量化策略剪枝之后剩下的权重是精炼过的但仍是浮点数。接下来就要进行量化将其转换为ReRAM单元能够表示的有限个离散整数值。这里没有“一招鲜”必须根据硬件能够提供的精度比特数来选择策略。高比特量化如8-bit非对称量化与零点偏移当ReRAM单元能区分较多状态例如256个时我们采用非对称量化。它的目的是将原始权重范围[w_min, w_max]线性映射到量化整数值范围[q_min, q_max]例如[-128, 127]。计算公式与操作意图缩放因子Scale:Scale (w_max - w_min) / (q_max - q_min)。这决定了浮点数中“1”对应多少整数值是量化的“刻度尺”。零点Zero Point, Zp:Zp q_min - w_min / Scale。这是一个关键技巧。因为权重分布可能不对称比如全为正或正负不均直接线性映射会导致量化区间利用不充分。Zp的作用是将浮点零点映射到一个非零的整数上从而让量化后的正负区间都能被充分利用。量化操作:qw round(Zp w / Scale)。最终得到整型的量化权重qw。在ReRAM上部署时一个权重w对应的计算y w * x可以分解为y (qw * x - Zp * x) * Scale。其中qw * x可以在交叉阵列中通过模拟计算完成电流求和而Zp * x这部分与权重无关只与输入x有关可以在数字域如FPGA中预先计算或并行计算从而节省阵列资源。低比特量化如2-bit, 3-bit对称量化与差分对表示当硬件精度非常有限例如单元只能区分4个状态时非对称量化中Zp的引入会挤占本就紧张的数值表示空间导致精度急剧下降。此时我们转向对称量化。缩因子:Scale k * max(|weight|) / (2^(n-1) - 1)。这里k是一个略小于1的经验系数如0.9用于留出安全边际防止溢出。n是量化比特数。量化操作:qw round(w / Scale)。范围是[-(2^(n-1)-1), 2^(n-1)-1]。在硬件映射上我们使用差分对来表示一个有符号权重。例如用两个相邻的ReRAM单元g和g-其电导差(g - g-)来代表权重值。这样一个正权重可能对应(2,1)的状态对一个负权重对应(1,2)零权重则可以用(1,1)或(2,2)表示。这里隐藏了一个重要的优化机会零权重的两种等价表示为后续的权重合并提供了可能。2.3 第三板斧基于聚类的权重映射与参考列合并量化完成后我们得到了一个整型的权重矩阵。直接映射到ReRAM阵列是低效的尤其是采用差分对表示时硬件开销几乎翻倍。我们的核心创新在于通过聚类算法智能地合并那些“相似”的权重列从而减少实际需要的物理列数。高比特场景基于K-means的零点聚类合并在高比特非对称量化中每个权重向量或一组权重都有自己的零点Zp和缩放因子Scale。在差分映射中这些Zp会占据一个单独的参考列。我们发现许多不同的权重向量其(Zp, Scale)这个二维向量是相似的。操作流程我们将网络中所有需要独立Zp的权重组例如一个卷积核的所有输出通道的(Zp, Scale)参数收集起来。使用K-means聚类算法将这些二维向量聚合成K个簇。K是我们期望合并后的参考列数量这是一个可调节的超参数。每个簇内的所有权重组不再使用各自原来的(Zp, Scale)而是统一使用该簇的质心(Zp_new, Scale_new)重新进行量化即 requantize。映射到硬件时原来需要N个参考列现在只需要K个。所有共享同一个新Zp_new的权重列可以连接到同一个物理参考列上。避坑指南K值的选择需要权衡。K越小硬件节省越多但重新量化引入的误差越大。我们的实验表明在8-bit量化下K从256减少到32精度损失通常小于0.5%但可以节省大量阵列资源。建议从一个较小的K开始如总组数的1/8逐步增加在精度损失和资源节省间找到平衡点。低比特场景基于谱聚类的负权重列合并在低比特对称量化中情况不同。这里没有独立的Zp列但差分对中的“负单元”列即g-列成为了合并的目标。我们的目标是让多个不同的正权重列共享同一个负权重列。挑战与解决方案 直接合并任意两列会引入误差。例如权重A1表示为(2,1)权重B-1表示为(1,2)。如果强行让它们共享负列假设共享后负列都为1那么A就变成了(2,1)正确B却变成了(1,1)这表示的是0而不是-1产生了误差。因此我们需要找到那些“兼容”的、合并后误差最小的列进行合并。我们将每一列假设长度为L的权重向量看作一个节点列与列之间的“兼容性”或可合并性定义为它们可以共享同一个负列时所需引入的误差。这个关系构成了一个图。谱聚类Spectral Clustering非常适合解决这类图划分问题。它通过计算图的拉普拉斯矩阵的特征向量来发现数据在低维空间中的聚集结构能识别出任意形状的簇。实操算法简化描述构建相似度矩阵对于所有需要合并的列计算两两之间的“距离”。这个距离可以定义为如果这两列共享负列所需要调整的权重值的绝对值之和。距离越小相似度越高越应该被聚在一起。二分法确定聚类数我们并不预先指定要合并成多少簇而是设定一个可容忍的“最大合并误差”阈值。使用二分搜索算法动态地寻找在满足该误差阈值前提下能达成的最少聚类数量即最少的负列数。谱聚类执行基于相似度矩阵使用谱聚类算法将列分配到各个簇中。簇内合并每个簇内的所有列共享一个新的、优化过的负权重列。这个新的负列通常取簇内各列原负列值的某种平均或中值以最小化整体误差。通过这种方法在3-bit量化下我们能在MNIST数据集上实现约30%的阵列资源节省而精度损失控制在3%以内。3. 硬件部署实战与调优细节算法设计得再精妙最终还是要落到硬件上跑通才算数。我们搭建了一个载板-FPGA测试平台核心是一颗32x32的ReRAM交叉阵列芯片。这个平台让我们能够验证从软件模型到物理硬件的全链路可行性。3.1 测试平台搭建与网络映射平台结构如图10所示主要包括ReRAM阵列32行 x 32列每个单元可通过电压脉冲编程为不同的电导状态。外围电路数模转换器DAC用于将输入的数字激活值activation转换为施加在字线上的模拟电压。精度需要与量化比特数匹配如8-bit或4-bit。模数转换器ADC用于将位线上汇集的模拟电流即乘累加结果转换回数字值。这是精度和功耗的关键点。多路复用器MUX由于阵列引脚有限需要MUX来分时复用将更大的网络映射到有限的物理阵列上。FPGA作为控制器负责发送配置脉冲、控制DAC/ADC/MUX、执行数字域的计算如Scale缩放、偏置加法等以及整个推理流程的调度。网络映射策略 我们设计了一个精简的两层网络来处理MNIST的裁剪图像28x28 - 26x26第一层一个深度可分离的全连接层包含26个通道每个通道是26x1的权重向量。这正好可以映射到32x32阵列的一部分。第二层一个26x4的普通全连接层。 由于阵列只有32行我们需要将网络分块映射。例如第一层的每个26x1的权重向量加上其对应的参考列如果使用差分对可能需要占用2列。通过我们的聚类合并算法我们可以减少参考列的数量使得在有限的32列内能同时映射更多的有效权重列从而提高并行度和计算效率。3.2 关键参数影响与调优实验在部署过程中以下几个硬件非理想特性对算法效果影响最大我们进行了专项测试1. ReRAM电导值偏差Device Variation这是最现实的挑战。由于制造工艺波动和编程不精确单元的实际电导值会偏离目标值。我们在软件仿真中引入了随机偏差±5%, ±10%, ±25%, ±50%来模拟这种效应。实验结果与解读 如表1所示令人欣慰的是无论是浮点网络还是我们提出的量化方法8-bit高比特法、3-bit低比特法在高达50%的电导偏差下MNIST识别精度都没有出现灾难性下降。这主要得益于神经网络的固有容错性。权重值的微小扰动被网络大量的神经元和层级结构所平滑。我们的量化聚类方法并没有放大这种硬件噪声证明了其鲁棒性。2. 模数/数模转换器精度ADC/DAC ResolutionADC和DAC是连接数字世界和模拟计算世界的桥梁其精度位数直接决定信号的质量。高比特量化8-bit权重我们使用8-bit的DAC输入和8-bit的ADC输出。这确保了输入信号和输出读数的精度与权重精度匹配。低比特量化3-bit权重激活值也被量化为4-bit以降低接口带宽和功耗。此时DAC采用4-bit。但ADC的位数需要仔细选择位数太低会丢失计算结果的细节位数太高则功耗和成本上升。我们发现对于3-bit权重使用6-bit ADC是一个较好的折衷能在保证精度的前提下控制功耗。3. 交叉阵列行数Crossbar Row Size这对应着算法中“聚类单元”的长度。在低比特谱聚类方法中我们观察到表3更短的行数如4或8往往能获得更好的聚类效果和更高的资源节省率。这是因为更短的向量更容易找到高度相似的匹配项进行合并。而在高比特K-means方法中行数的影响相对较小。这给了我们设计启示在硬件设计时可以采用多个中等规模如32x32的阵列并行而不是一个巨大的阵列这样更有利于聚类优化算法的发挥。3.3 部署结果与性能分析我们将经过渐进式剪枝稀疏度82%和低比特谱聚类量化映射3-bit后的网络部署到上述32x32 ReRAM测试平台上。最终成果硬件资源节省通过聚类合并减少了42%的ReRAM单元使用量。推理精度在MNIST数据集上实测精度达到88.6%。精度损失相较于未使用节省策略的基准部署精度91.5%损失为2.9%。相较于原始的浮点模型精度91.5%损失为2.9%。这个结果具有重要的实践意义。它证明了在存在显著硬件非理想特性电导偏差、有限精度ADC/DAC的真实芯片上我们的软件-硬件协同优化方法是有效的。我们用约3%的精度代价换取了近一半的硬件资源节省。对于许多边缘AI应用如关键字唤醒、简单视觉检测来说这样的trade-off是完全可接受的因为它直接 translates to 更小的芯片面积、更低的成本和功耗。4. 方案拓展与不同场景下的策略选择我们的方法不是一个固定配方而是一个工具箱。针对不同的网络架构、数据集和硬件约束需要灵活选择和调整策略。4.1 扩展到更复杂的网络与数据集为了验证方法的泛化能力我们在CIFAR-10和CIFAR-100数据集上测试了AlexNet、VGG16等更复杂的网络表4。核心发现高比特量化8-bit优势明显在ResNet-18/CIFAR-100这样的任务上8-bit量化结合高比特聚类方法在精度损失1%的前提下实现了可观的资源节省。因为8-bit提供了足够的表达空间网络容量大对剪枝和压缩的容忍度高。低比特量化2-bit面临瓶颈当量化到2-bit时网络本身的表达力已接近极限。此时再进行激进的剪枝或合并精度会急剧下降。因此在2-bit模式下资源节省率相对较低。这告诉我们极端低比特量化需要与网络架构搜索NAS或专门的训练后量化PTQ技术结合从头开始设计或微调网络才能取得更好效果。4.2 高低比特方法的对比与选型指南图8和图9清晰地展示了两种方法的适用场景高比特K-means聚类法在量化比特数较高≥4-bit时表现优异。它通过合并零点参考列来节省资源对精度的侵蚀较小。适用于对精度要求高、硬件单元状态较多的场景。低比特谱聚类法在量化比特数较低2-bit, 3-bit时优势显著。它通过合并差分对中的负权重列来节省资源在极低精度下能保持相对较好的精度。适用于对功耗和面积极度敏感可以接受一定精度损失的边缘场景。选型决策流程建议确定硬件约束明确ReRAM单元的可编程状态数决定可用比特数、阵列最大规模、ADC/DAC精度。设定精度目标根据应用需求确定可接受的最大精度损失例如分类任务Top-1 Accuracy下降不超过3%。尝试高比特路径首先尝试8-bit或4-bit量化 高比特K-means聚类。评估精度和节省率。评估低比特路径如果硬件资源极其紧张尝试3-bit或2-bit量化 低比特谱聚类。评估精度损失是否在可接受范围内。引入渐进式剪枝在量化之前或之后应用渐进式剪枝可以进一步提升资源节省率。注意剪枝和量化会相互影响可能需要交替进行微调。4.3 与其他先进方法的对比思考在学术界也有许多针对ReRAM的权重量化与映射优化工作例如利用权重和激活的稀疏性进行位级压缩、自动化网络剪枝与映射联合搜索等。我们方法的独特优势在于“务实”完全在软件域完成我们的剪枝、量化、聚类算法都在训练后或训练中进行生成的是优化后的权重矩阵。映射过程不涉及在交叉阵列内部进行复杂的动态索引或位级操作避免了引入额外的、难以控制的硬件开销和时序复杂性。兼容主流差分架构我们的方法基于业界广泛采用的差分对表示法不需要改变底层硬件架构。优化后的权重可以直接部署到标准的ReRAM交叉阵列上。提供明确的设计权衡通过调节聚类数量K、相似度阈值等参数我们为设计者提供了清晰的“精度-面积/功耗”权衡曲线便于根据产品需求进行精准定制。当然我们的方法也有其局限。例如聚类合并引入了额外的、依赖于数据分布的量化误差对于动态稀疏性激活稀疏的利用还不够充分。未来的工作可以将我们的静态权重优化与动态的激活稀疏性管理结合起来或者在训练阶段就引入硬件感知的损失函数进行端到端的联合优化以期在更严苛的约束下挖掘更大的能效潜力。