μNAS:面向微控制器的约束神经架构搜索——论文解读

举报
DuHz 发表于 2025/09/07 02:23:29 2025/09/07
【摘要】 μNAS:面向微控制器的约束神经架构搜索Liberis E, Dudziak Ł, Lane N D. μnas: Constrained neural architecture search for microcontrollers[C]//Proceedings of the 1st Workshop on Machine Learning and Systems. 2021: 70-...

μNAS:面向微控制器的约束神经架构搜索

Liberis E, Dudziak Ł, Lane N D. μnas: Constrained neural architecture search for microcontrollers[C]//Proceedings of the 1st Workshop on Machine Learning and Systems. 2021: 70-79.

1. 引言与研究背景

1.1 微控制器的资源约束挑战

物联网(IoT)设备的智能化正在改变我们与周围世界的交互方式。这些设备的核心是微控制器单元(MCU),它们是包含低频处理器、持久程序存储器(Flash)和易失性静态RAM的超小型计算机,全部集成在单一芯片上。2019年,全球MCU出货量估计超过300亿个单元,其广泛应用得益于极低的成本和功耗优势。

然而,这些优势是以计算能力的大幅降低为代价的。本研究聚焦于"中等规格"的物联网级MCU,其SRAM和持久存储空间最多64KB,可用于神经网络推理。这种严苛的资源约束给运行资源密集型计算带来了前所未有的挑战。相比之下,即使是移动设备也拥有比MCU多几个数量级的计算资源。

1.2 现有方法的局限性

TABLE1.png

传统的模型压缩方法,如剪枝、蒸馏、量化和使用更轻量级的层,虽然能够在保持精度的同时减少模型大小,但大多数方法并不适合生成MCU级别的神经网络。许多技术针对的是移动设备或类似平台,这些平台的计算资源比MCU多出几个数量级。即使是专门设计的资源高效模型,如MobileNet和SqueezeNet,也会超出假定的资源预算10倍以上。

2. 神经网络在MCU上的执行机制

2.1 执行策略详解

μNAS遵循TensorFlow Lite Micro解释器和CMSIS-NN库使用的执行策略,这种策略具有以下特点:

顺序执行原则:算子按预定义顺序逐个执行,完全没有并行性。这与GPU或现代CPU的并行执行形成鲜明对比。

内存管理机制:执行一个算子时遵循三步流程:

  • 在SRAM中为输出缓冲区分配/预留内存
  • 完全执行算子主体
  • 释放不再需要的输入缓冲区

这意味着神经网络的激活矩阵仅存储在SRAM中,而所有静态数据(如网络权重)则从Flash中的可执行二进制文件读取。

量化策略:网络权重和所有计算都量化为8位定点数据类型(int8)。这种量化方法的选择基于四个关键优势:字节对齐(值可以直接加载而无需解码)、不需要芯片上存在浮点运算单元、广泛的行业采用、以及在量化过程中不会造成显著的精度损失。

2.2 分支网络的内存管理挑战

FIG1.png

图1:计算图的不同执行路径对峰值内存使用的影响

图1展示了一个具有分支结构的卷积神经网络计算图。网络包含多个Conv2D层,具有不同的配置(1×1卷积、3×3深度可分离卷积等)和一个Concat层。图中显示了两种不同的执行顺序:

  • 默认执行路径(左侧):按照1→2→3→4→5→6→7的顺序执行,产生5216字节的峰值内存使用
  • 优化执行路径(右侧):按照1→2→5→3→4→6→7的顺序执行,峰值内存使用降至4960字节

这256字节的差异虽然看似不大,但在只有64KB总内存的MCU上却至关重要。图中每个节点旁边的尺寸标注(如7×7×32、4×4×16)表示该层输出张量的维度,这直接影响内存占用。

3. 多目标优化的数学框架

3.1 问题形式化

神经架构搜索的核心是一个约束零阶优化问题。给定搜索空间A,我们寻找最优架构α*,使其最大化某个目标函数L,同时满足资源使用约束。验证集精度对于特定架构α由通过梯度下降获得的最优权重θ*决定。

将资源约束视为软约束并重新表述为额外目标,NAS成为多目标优化问题:

α=argminαAL(α)=argminαA{1.0ValAccuracy(α)ModelSize(α)PeakMemUsage(α)Latency(α)\alpha^* = \arg\min_{\alpha \in A} L(\alpha) = \arg\min_{\alpha \in A} \begin{cases} 1.0 - \text{ValAccuracy}(\alpha) \\ \text{ModelSize}(\alpha) \\ \text{PeakMemUsage}(\alpha) \\ \text{Latency}(\alpha) \end{cases}

3.2 Pareto前沿与标量化

多目标问题的解不是单一值,而是Pareto前沿——一组点的集合,在这些点上,改进一个目标函数必然导致另一个目标函数变差。为了有效探索Pareto前沿,μNAS采用随机标量化方法:

Lt(α)=maxi{1,2,3,4}{λitfi(α)}L_t(\alpha) = \max_{i \in \{1,2,3,4\}} \left\{ \lambda_i^t \cdot f_i(\alpha) \right\}

其中:

  • f1(α)=1.0ValAccuracy(α)f_1(\alpha) = 1.0 - \text{ValAccuracy}(\alpha)
  • f2(α)=PeakMemUsage(α)f_2(\alpha) = \text{PeakMemUsage}(\alpha)
  • f3(α)=ModelSize(α)f_3(\alpha) = \text{ModelSize}(\alpha)
  • f4(α)=MACs(α)f_4(\alpha) = \text{MACs}(\alpha)

标量系数λit\lambda_i^t的采样策略为:1/λiUniform[0;bi]1/\lambda_i \sim \text{Uniform}[0; b_i],其中bib_i是用户为第i个目标指定的软上界。

4. 搜索空间的层次化设计

4.1 架构模板

μNAS的搜索空间基于高度参数化的架构模板。一个架构由N个"卷积块"组成(N∈[1,10]),每个块的详细配置如下:

连接模式:每个块可以与前一个块串联或并联连接,提供了灵活的信息流路径。

卷积层配置:每个块包含M个卷积层(M∈[1,3]),每层具有以下可配置参数:

  • 可选的2×2最大池化前置操作
  • 全卷积或深度可分离卷积的选择
  • 核大小K∈{1,3,5,7}
  • 输出通道数C∈[1,128]
  • 步长S∈{1,2}
  • 可选的批归一化和ReLU激活

池化和全连接层:每个卷积块后跟P×P的平均或最大池化(P∈{2,4,6}),然后是F个全连接层(F∈[1,3]),每层有U个单元(U∈[10,256])。

4.2 搜索空间规模分析

这种细粒度的设计产生了包含1.15×101521.15 \times 10^{152}个可能架构的搜索空间。这个天文数字级的规模既是挑战也是机遇——它提供了找到最优架构的可能性,但也使搜索变得极其困难。

5. 资源约束的精确建模

5.1 峰值内存使用的算法计算

峰值内存使用的准确计算是μNAS的核心创新之一。算法基于以下原理:

工作集定义:在任意时刻t,工作集WtW_t包含所有必须保存在内存中的张量。这包括:

  • 当前执行算子的输入张量
  • 当前执行算子的输出张量
  • 后续算子需要但尚未处理的张量

拓扑排序枚举:对于具有分支的网络,不同的执行顺序产生不同的工作集序列。μNAS枚举所有有效的拓扑排序,计算每种排序的峰值内存使用:

PeakMemUsage(α)=minπΠ(α)maxttensorWtπsize(tensor)\text{PeakMemUsage}(\alpha) = \min_{\pi \in \Pi(\alpha)} \max_{t} \sum_{tensor \in W_t^\pi} \text{size}(tensor)

其中Π(α)\Pi(\alpha)是架构α的所有有效拓扑排序的集合。

5.2 模型大小的量化计算

采用8位整数量化后,模型大小计算简化为:

ModelSize(α)=llayers(α)params(l)×1 byte\text{ModelSize}(\alpha) = \sum_{l \in \text{layers}(\alpha)} \text{params}(l) \times 1 \text{ byte}

5.3 延迟预测模型

FIG2.png

图2:MACs作为MCU延迟预测器的有效性验证

图2分为两部分,形成鲜明对比:

上图(GPU延迟):展示了桌面GPU上FLOPs与实测延迟的关系,数据点分散且呈现非线性模式,延迟范围在0-10毫秒,FLOPs范围在0-400M。这种分散反映了GPU的复杂执行特性,包括并行处理、缓存效应和调度优化。

下图(MCU延迟):展示了1000个随机采样模型在NUCLEO-H743ZI2 MCU板上的实测延迟与MACs的关系。数据点紧密围绕一条直线分布,R²=0.975的高拟合度证明了线性关系。延迟范围在0-800毫秒,MACs范围在0-80M。

这种线性关系使得延迟预测模型简化为:

Latency(α)kMACs(α)+c\text{Latency}(\alpha) \approx k \cdot \text{MACs}(\alpha) + c

其中k和c是通过实验确定的常数。

6. 搜索算法的设计与实现

6.1 老化进化算法

老化进化(AE)算法维护一个大小为P的种群,通过以下步骤演化:

  1. 选择:从种群中随机采样S个架构
  2. 评估:计算每个架构的Lt(α)L_t(\alpha)
  3. 变异:对最优架构应用随机变形操作
  4. 更新:将新架构加入种群,移除最老的架构

变形操作包括改变层数、修改通道数、调整核大小等,详见表1中的完整列表。

6.2 贝叶斯优化方法

贝叶斯优化使用高斯过程(GP)作为代理模型来近似目标函数。核函数基于最优传输定义两个神经网络之间的距离:

k(α1,α2)=exp(dOT(α1,α2)2σ2)k(\alpha_1, \alpha_2) = \exp\left(-\frac{d_{OT}(\alpha_1, \alpha_2)}{2\sigma^2}\right)

其中dOTd_{OT}是基于最优传输的距离度量。

7. 模型压缩:结构化剪枝

7.1 DPF剪枝算法

μNAS采用DPF(Dynamic Pruning with Feedback)剪枝,基于L2范数识别和移除不重要的通道/单元:

Importance(ci)=wi2=jwij2\text{Importance}(c_i) = \|\mathbf{w}_i\|_2 = \sqrt{\sum_j w_{ij}^2}

其中wi\mathbf{w}_i是第i个通道或单元的权重向量。

7.2 渐进式剪枝策略

剪枝在训练过程中逐步进行,目标稀疏度stargets_{target}通过以下公式在训练周期内线性增加:

st=sinitial+(stargetsinitial)ttstarttendtstarts_t = s_{initial} + (s_{target} - s_{initial}) \cdot \frac{t - t_{start}}{t_{end} - t_{start}}

8. 实验结果的深入分析

8.1 配置比较实验

FIG3.png

图3:不同μNAS配置的Pareto前沿比较

图3展示了在Chars74K(左)和MNIST(右)数据集上三种配置的性能:

Chars74K结果

  • 错误率范围:0.10-0.50
  • 模型大小范围:0-30000字节
  • AE+剪枝配置(绿色点)明显占据了最左下角的位置,表示在相同模型大小下实现了最低的错误率
  • 纯AE(蓝色点)次之,而贝叶斯优化(橙色点)的Pareto前沿最差

MNIST结果

  • 错误率范围:0.00-0.10
  • 模型大小范围:0-8000字节
  • AE+剪枝在极小模型(<500字节)区域展现出卓越性能,达到了<1%的错误率

8.2 资源目标消融研究

FIG4.png

图4:资源约束对搜索行为的影响

图4通过三个子图展示了不同约束配置下MNIST模型的分布:

左图(无模型大小约束)

  • 峰值内存使用集中在100-1000字节的低范围
  • 模型大小分散在10²-10⁶字节的广泛范围
  • 搜索被峰值内存约束主导,产生深而窄的网络

中图(无内存使用约束)

  • 模型大小集中在较低范围
  • 峰值内存使用分散广泛
  • 搜索倾向于浅而宽的架构

右图(所有约束存在)

  • 两个维度都展现出良好的分布
  • 发现了多样化的权衡点
  • 实现了资源使用和精度之间的平衡

9. 与现有方法的综合比较

TABLE2.png

表2详细比较了μNAS与现有方法在多个数据集上的表现。特别值得注意的结果包括:

MNIST:μNAS找到了仅480字节、精度99.19%的模型,相比SpArSe在相似精度下模型大小减少5.7倍。

Speech Commands:在保持95.58%精度的同时,模型大小仅37KB,峰值内存使用21.1KB,MACs仅1.1M——比RENA减少636倍的计算量。

Fashion MNIST:达到93.22%的精度,同时保持63.6KB的模型大小和12.6KB的峰值内存使用。


附录:数学推导

A. 多目标优化的Pareto最优性条件

A.1 Pareto支配关系

对于两个解α1,α2A\alpha_1, \alpha_2 \in A,我们定义Pareto支配关系\prec如下:

α1α2i:fi(α1)fi(α2)j:fj(α1)<fj(α2)\alpha_1 \prec \alpha_2 \Leftrightarrow \forall i: f_i(\alpha_1) \leq f_i(\alpha_2) \land \exists j: f_j(\alpha_1) < f_j(\alpha_2)

A.2 Pareto前沿的数学定义

Pareto前沿P\mathcal{P}定义为所有非支配解的集合:

P={αAαA:αα}\mathcal{P} = \{\alpha \in A | \nexists \alpha' \in A: \alpha' \prec \alpha\}

A.3 随机标量化的收敛性分析

定理:在适当的条件下,随机标量化方法以概率1收敛到完整的Pareto前沿。

证明概要

Λ\Lambda为所有可能的权重向量λ\lambda的集合。对于Pareto前沿上的任意点αP\alpha^* \in \mathcal{P},存在权重向量λ\lambda^*使得:

α=argminαAmaxi{λifi(α)}\alpha^* = \arg\min_{\alpha \in A} \max_i \{\lambda_i^* f_i(\alpha)\}

由于我们从连续分布中采样λ\lambda,随着采样次数TT \rightarrow \infty

P(tT:λtλ<ϵ)1P(\exists t \leq T: \|\lambda^t - \lambda^*\| < \epsilon) \rightarrow 1

因此,随机标量化方法能够以任意精度逼近Pareto前沿上的任意点。

B. 峰值内存使用的图算法

B.1 动态规划形式化

G=(V,E)G = (V, E)为神经网络的计算图,其中VV是算子集合,EE是数据依赖关系。定义状态s=(v,M)s = (v, M),其中vv是当前算子,MM是内存中的张量集合。

峰值内存使用的递归关系:

PMU(s)=max{mem(Moutput(v)),maxvsucc(v)PMU((v,M))}PMU(s) = \max\left\{\text{mem}(M \cup \text{output}(v)), \max_{v' \in \text{succ}(v)} PMU((v', M'))\right\}

其中MM'是执行vv后的更新内存状态:

M=(Minputs(v))output(v)future_deps(v)M' = (M \setminus \text{inputs}(v)) \cup \text{output}(v) \cup \text{future\_deps}(v)

B.2 分支网络的内存调度优化

对于具有分支的网络,最优执行顺序可通过以下整数线性规划(ILP)求解:

决策变量

  • xij{0,1}x_{ij} \in \{0,1\}:算子ii是否在时间步jj执行
  • mjm_j:时间步jj的内存使用量

目标函数

minmaxjmj\min \max_j m_j

约束条件

  • 每个算子恰好执行一次:jxij=1,i\sum_j x_{ij} = 1, \forall i
  • 依赖关系:k<jxikxpj,(p,i)E\sum_{k<j} x_{ik} \geq x_{pj}, \forall (p,i) \in E
  • 内存计算:mj=isize(i)yijm_j = \sum_i \text{size}(i) \cdot y_{ij}

其中yijy_{ij}表示张量ii在时间jj是否在内存中。

C. 量化误差分析

C.1 仿射量化的数学形式

8位整数量化将浮点值rr映射到整数qq

q=round(rs)+zq = \text{round}\left(\frac{r}{s}\right) + z

其中ss是缩放因子,zz是零点。反量化操作:

r^=s(qz)\hat{r} = s(q - z)

C.2 量化误差界

量化误差ϵ=rr^\epsilon = r - \hat{r}的界限:

ϵs2|\epsilon| \leq \frac{s}{2}

对于神经网络层f(x)=Wx+bf(x) = Wx + b,量化后的输出误差:

f(x)f^(x^)Wϵx+ϵWx+ϵb\|f(x) - \hat{f}(\hat{x})\| \leq \|W\| \cdot \|\epsilon_x\| + \|\epsilon_W\| \cdot \|x\| + \|\epsilon_b\|

C.3 累积误差分析

对于L层网络,总误差界:

outputoutput^l=1Lk=l+1LWkϵl\|\text{output} - \widehat{\text{output}}\| \leq \sum_{l=1}^L \prod_{k=l+1}^L \|W_k\| \cdot \epsilon_l

这解释了为什么深度网络需要仔细的量化策略。

D. 搜索算法的理论分析

D.1 老化进化的收敛速度

假设目标函数LL是Lipschitz连续的,常数为LfL_f。老化进化算法的期望改进率:

E[ΔLt]1Pi=1SP(select i)E[ΔLmutate(i)]\mathbb{E}[\Delta L_t] \geq \frac{1}{P} \sum_{i=1}^S P(\text{select } i) \cdot \mathbb{E}[\Delta L | \text{mutate}(i)]

在适当的变异率μ\mu下,算法以速率O(1/t)O(1/\sqrt{t})收敛到局部最优。

D.2 贝叶斯优化的遗憾界

使用高斯过程的贝叶斯优化,其累积遗憾RTR_T满足:

RT=t=1T(L(α)L(αt))O(TγTlogT)R_T = \sum_{t=1}^T (L(\alpha^*) - L(\alpha_t)) \leq O(\sqrt{T \gamma_T \log T})

其中γT\gamma_T是最大信息增益,对于我们的核函数:

γTO((logT)d+1)\gamma_T \leq O((\log T)^{d+1})

其中dd是搜索空间的有效维度。

E. 剪枝算法的理论保证

E.1 结构化剪枝的最优性

给定目标稀疏度ss,最优剪枝策略是保留重要性得分最高的(1s)(1-s)比例的通道:

C=argmaxC:C=(1s)CcCwc22\mathcal{C}^* = \arg\max_{\mathcal{C}: |\mathcal{C}|=(1-s)C} \sum_{c \in \mathcal{C}} \|\mathbf{w}_c\|_2^2

E.2 剪枝后的性能界

在适当的假设下,剪枝后的网络性能损失界:

L(αpruned)L(αoriginal)O(smaxcwcL)|L(\alpha_{pruned}) - L(\alpha_{original})| \leq O(s \cdot \max_c \|\nabla_{\mathbf{w}_c} L\|)

这表明渐进式剪枝(逐步增加ss)能够更好地保持性能。

F. 搜索空间大小的精确计算

搜索空间的总大小通过乘法原理计算:

A=n=110[2m=13(224128222)23f=13247]|\mathcal{A}| = \prod_{n=1}^{10} \left[2 \cdot \prod_{m=1}^3 \left(2 \cdot 2 \cdot 4 \cdot 128 \cdot 2 \cdot 2 \cdot 2\right) \cdot 2 \cdot 3 \cdot \prod_{f=1}^3 247\right]

考虑所有可能的组合,得到A=1.15×10152|\mathcal{A}| = 1.15 \times 10^{152}

这个庞大的搜索空间使得穷举搜索完全不可行,即使以每秒评估10910^9个架构的速度,也需要1014310^{143}秒(远超宇宙年龄)才能遍历整个空间。这突出了高效搜索算法的必要性。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。