ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入浅出TinyML 17:参数量、模型大小、MACC和激活内存有什么区别?

深入浅出TinyML 17:参数量、模型大小、MACC和激活内存有什么区别? 参数少的模型可能计算很多次模型文件小的模型也可能产生很大的中间激活。把参数量、模型大小、MACC和激活内存混为一谈会在部署阶段遇到Flash够用但RAM不足或模型很小但推理超时的情况。这四个指标需要分别计算再与最终固件和目标MCU实测对应。静态分析帮助筛选候选模型链接报告与板端测试负责最终验收。参数量主要影响权重存储MACC描述计算规模激活内存决定运行峰值的一部分模型文件还包含结构和元数据。完成本篇后你应该能够分别计算参数量、模型字节、MACC和激活张量大小。理解为什么参数更少的模型不一定RAM更少或运行更快。运行网络资源估算器比较Dense与Conv1D结构的资源瓶颈。参数是训练后保存的权重激活是推理过程中产生的中间结果。前者多影响Flash后者多影响运行时RAM。图1参数量、模型文件、MACC和激活内存对应不同资源问题一、先把核心关系连起来参数量先决定权重存储下限全连接层参数量由输入维度和输出神经元相乘再加偏置。卷积层参数量由卷积核尺寸、输入通道和输出通道决定与输出时间长度无关。权重采用FP32时每个参数通常占4字节INT8权重通常占1字节。模型文件还包含图结构、张量描述和量化参数因此不会严格等于参数量乘字节数。Dense参数量 输入维度 × 输出维度 输出偏置Conv1D参数量 卷积核长度 × 输入通道 × 输出通道 输出偏置MACC取决于算子被执行多少次卷积核参数在每个输出位置重复使用因此参数量不变时输入长度越大MACC越高。全局平均池化可以减少后续全连接参数却仍需完成前面所有卷积计算。MACC是比较计算规模的近似指标。内存访问、数据布局、量化重缩放和内核优化会让相同MACC产生不同执行时间。表1四个指标的含义与不能回答的问题指标主要回答不能直接推出参数量权重数量推理时间与Arena模型文件序列化存储大小最终固件与运行RAMMACC理论计算规模目标MCU上的真实耗时激活内存中间张量规模完整系统RAM峰值二、激活内存由张量形状和生命周期决定每层输出张量的元素数乘数据类型字节数给出该张量大小。运行时会复用生命周期不重叠的空间因此峰值不是简单把所有层相加。输入很长、早期通道数很宽的模型容易产生大激活。INT8能够减少激活字节数但Scratch Buffer和对齐开销仍需由运行时实际规划。Python计算一层Conv1D的参数量与MACCdef conv1d_cost(input_length, in_channels,out_channels, kernel, stride1):output_length (input_length - kernel) // stride 1params kernel * in_channels * out_channels out_channelsmacc output_length * kernel * in_channels * out_channelsactivation_int8 output_length * out_channelsreturn params, macc, activation_int8print(conv1d_cost(100, 6, 16, 5))三、把静态指标映射到固件实测模型报告应同时列出参数量、模型文件、MACC、最大单层激活和估算Arena。部署后补充最终固件Flash、Arena实际使用、推理时间和能量。任何优化都要说明改善了哪一项。删除参数可能减少模型文件却不一定降低推理时间缩短输入可以同时降低MACC和激活但可能损失事件信息。四个指标来自网络的不同位置Dense层输入I、输出O时权重I×O、偏置O主要MACC也是I×O。Conv1D还要乘输出时间位置核宽K、输入通道Cin、输出通道Cout、输出长度Tout时权重K×Cin×Cout主要MACC为Tout×K×Cin×Cout。卷积参数共享使参数不随Tout增长计算量却会随Tout增长。模型文件大小受到数据类型和格式开销影响。10000个FP32权重的裸存储约40000字节INT8约10000字节偏置、量化参数、算子描述、张量元数据和对齐仍会占空间。最终Flash还包括运行时和已注册算子代码。激活峰值来自执行时同时存活的张量与临时工作区。一个早期卷积层输出很长即使权重很少也可能成为Arena峰值。改变层顺序、步长或通道数会改变生命周期需要运行时规划或目标板记录确认。Conv1DParams K×Cin×Cout CoutMACC Tout×K×Cin×CoutActivation bytes Tout×Cout×bytes_per_element估算用于筛选实测用于签字训练前的公式可以快速淘汰明显超标结构也能解释通道翻倍为何常使卷积计算接近四倍。它没有包含内核填充、内存复制、对齐和硬件指令效率因此不能承诺延迟。比较候选模型时固定输入、数据集、编译优化、主频、Cache、运行时版本和计时范围。记录模型文件、最终固件、Arena峰值、栈水位、预处理时间、Invoke时间和完整周期。优化要针对瓶颈Flash超限先看权重和算子代码Arena超限先看激活形状延迟超限看MACC、算子支持和内核效率功耗超限还要看执行频率与待机。指标、瓶颈和验证证据指标主要回答最终证据参数/模型文件权重存储文件与map报告MACC计算规模DWT或GPIO计时激活大小Arena趋势内存规划记录栈/缓冲系统并发峰值栈水位与任务统计动手逐层生成模型资源账单脚本实现Dense和Conv1D两种估算函数输出参数、MACC和输出激活。随后比较两个候选模型明确哪个受Flash约束、哪个受激活约束。实验环境与输入Python 3标准库。保存为 model_cost.py 并运行。估算不包含运行时临时工作区结果用于结构筛选。按顺序完成实验运行脚本核对每层输入输出形状。把第一层卷积通道从16改为32观察参数、MACC和激活变化。把stride从1改为2观察输出长度与后续层成本下降。为候选模型加入数据类型字节数估算FP32与INT8激活差异。可直接运行Dense与Conv1D逐层资源估算def dense(inputs, outputs, bytes_per1):return {out: (outputs,), params: inputs*outputsoutputs,macc: inputs*outputs, activation: outputs*bytes_per}def conv1d(length, cin, cout, kernel, stride1, paddingvalid, bytes_per1):out_len (length stride - 1)//stride if padding same else (length-kernel)//stride1return {out: (out_len, cout),params: kernel*cin*coutcout,macc: out_len*kernel*cin*cout,activation: out_len*cout*bytes_per}layers []layers.append((conv1, conv1d(100, 6, 16, 5, stride1)))layers.append((conv2, conv1d(layers[-1][1][out][0], 16, 24, 3, stride2)))flatten layers[-1][1][out][0] * layers[-1][1][out][1]layers.append((dense, dense(flatten, 5)))total_params total_macc 0peak_visible_activation 0for name, cost in layers:total_params cost[params]total_macc cost[macc]peak_visible_activation max(peak_visible_activation, cost[activation])print(name, cost)print(total params:, total_params)print(total major MACC:, total_macc)print(largest listed output:, peak_visible_activation, bytes)print(note: Tensor Arena peak also includes overlap and scratch buffers)先读懂代码中的关键路径每层成本函数显式返回输出shape后续层必须读取前层输出而非手填长度。参数与MACC分别累计避免把一次权重存储误当成每个时间位置都存储。最大列出激活只是下界Arena还包括重叠、持久对象、对齐和scratch。stride改变输出长度时要重新计算后续所有层而非只修改当前层MACC。你应该观察到什么卷积参数量不乘输出长度MACC会乘输出长度。早期长序列卷积可能产生最大输出激活。stride减小后续时间长度但也可能损失短暂事件。成功标准公式结果与模型摘要中的参数量一致。估算报告明确区分可见张量与Arena实测峰值。优化建议指向已识别瓶颈不用模型文件大小替代全部资源。失败时从哪里查起资源估算偏差来源现象原因检查参数量差一个输出通道数漏算偏置确认层是否use_biasMACC与工具不同padding或MAC定义不同核对输出shape和计数口径Arena远大于最大激活张量重叠与scratch查看运行时内存规划把估算函数接入模型搜索后可以在训练前过滤超预算结构节省后续转换和上板时间。把实验迁移到真实MCU项目从Keras或TFLite摘要自动导出逐层shape后再与公式脚本核对。工具口径不同的地方要记录例如一次MAC是否算一还是两次操作。板端报告用最终FlatBuffer和固件生成。训练模型参数量不包含转换融合、量化元数据和注册内核不能直接代替Flash报告。把结果再向前推进一步手算一个3×6×16卷积层的参数与MACC。找出你模型中最大的权重层和最大激活层。为估算与实测分别定义报告字段。收束四个指标分别描述权重、文件、计算和中间张量。完整部署判断还需要最终固件、Arena、板端时间和功耗。参考资料TensorFlow Lite Micro 官方代码仓库Arm CMSIS-NN 官方文档
返回列表