混合视觉Transformer硬件加速:挑战与优化方案
1. 混合视觉Transformer的硬件加速挑战
在边缘计算设备上部署视觉Transformer模型一直是个棘手的问题。传统ViT模型虽然性能出色,但计算复杂度和内存占用让它们在资源受限的边缘设备上寸步难行。混合视觉Transformer(Hybrid ViT)的出现改变了这一局面——它巧妙地将CNN的局部特征提取能力与Transformer的全局注意力机制相结合,在保持精度的同时大幅降低了计算开销。
但真正要在硬件上高效实现这类混合模型,工程师们面临着三大核心挑战:
计算单元异构性:一个典型的混合ViT模型(如EdgeNeXt-S)可能包含常规卷积、深度可分离卷积、矩阵乘法、逐点卷积等多种计算类型,每种运算对硬件加速器的计算单元(PE)都有不同要求。
内存墙问题:特别是其中的"倒瓶颈"结构(inverted bottleneck),会产生大量中间激活数据。我们的实测数据显示,在EdgeNeXt-S模型中,这些中间数据占到了全部DRAM访问量的63.6%,成为能效提升的主要瓶颈。
特殊函数处理:LayerNorm和Softmax等Transformer特有的操作需要动态计算统计量,传统实现方式会导致频繁的数据搬移。以LayerNorm为例,虽然其计算量仅占全网的0.8%,却贡献了12%的执行延迟。
提示:在28nm工艺下,片外DRAM访问的能耗高达100pJ/byte,是SRAM访问的50-100倍。因此减少DRAM访问是提升能效的关键。
2. 可重构PE阵列设计
2.1 基础架构选择
我们首先构建了一个16×16的PE阵列作为计算核心,每个PE支持8位整数量化运算。关键创新在于PE阵列的可重构性——它能根据当前执行的层类型动态切换数据流模式:
C|K模式:针对常规卷积和矩阵乘法优化,沿PE阵列的列方向累加部分和。这种模式下,输入特征图在PE间广播,权重数据则保持局部性。
C|FX模式:专为深度可分离卷积设计,使数据沿行方向流动。实测表明,这种模式将深度卷积层的PE利用率从35%提升至92%。
// 可重构数据流控制逻辑示例 switch(layer_type) { case CONV: configure_dataflow(C_K_MODE); break; case DW_CONV: configure_dataflow(C_FX_MODE); break; // 其他层类型处理... }2.2 硬件开销分析
这种动态重构能力带来的硬件开销令人惊喜地低:
- 面积开销:仅增加1.1%的硅片面积
- 功耗开销:额外多路选择器导致动态功耗增加约2.3%
- 性能收益:整体网络延迟降低18%
下表对比了固定架构与可重构架构的性能差异:
| 指标 | 固定架构(OX|C) | 可重构架构(C|(K∨FX)) | |--------------|----------------|----------------------| | 常规卷积效率 | 95% | 93% | | 深度卷积效率 | 35% | 92% | | 全网络延迟 | 1.0x | 0.82x |
3. 像素级时序优化技术
3.1 循环重排序策略
传统硬件加速器在处理LayerNorm时,需要先完成前驱层的所有计算,将结果写回内存,再重新读取数据进行归一化。我们提出的像素级时序优化彻底改变了这一流程:
- 计算顺序重构:将标准的光栅扫描顺序改为像素优先(pixel-first)处理
- 行缓冲设计:在PE输出端增加深度为C(通道数)的行缓冲
- 统计量流水:当前像素的归一化参数随计算实时生成
# 传统计算顺序 (层间分离) for x in range(W): for y in range(H): for c in range(C): conv_out[x,y,c] = conv_compute(x,y,c) for x in range(W): for y in range(H): for c in range(C): norm_out[x,y,c] = layernorm(conv_out[x,y,c]) # 优化后计算顺序 (层间融合) for x in range(W): for y in range(H): pixel_buffer = [] for c in range(C): conv_val = conv_compute(x,y,c) pixel_buffer.append(conv_val) stats = compute_stats(pixel_buffer) for c in range(C): norm_out[x,y,c] = (pixel_buffer[c] - stats.mean)/stats.std3.2 实测性能提升
该优化带来了显著收益:
- LayerNorm延迟从12.3ms降至0.8ms
- 相关片内数据搬运减少87%
- 整体能耗降低9.2%
4. 跨层融合的内存优化
4.1 倒瓶颈结构的挑战
倒瓶颈结构通过临时扩展通道维度(通常4倍)来增强模型表达能力,但这会产生巨大的中间激活数据。以EdgeNeXt-S的某个倒瓶颈模块为例:
- 输入尺寸:56×56×64
- 扩展后尺寸:56×56×256
- 数据量:56×56×256×1byte = 802KB
这远超典型边缘加速器的片上缓存容量(通常128-256KB),迫使数据频繁进出DRAM。
4.2 分块融合技术
我们的解决方案是将两个逐点卷积层融合执行,关键技术包括:
- 输出分块计算:将输出特征图划分为X×C维度的瓦片
- 双缓冲策略:当一个瓦片t1计算完成后立即用于下一层计算
- 动态内存回收:中间结果使用后立即释放缓存空间
优化前后的数据流对比:
| 阶段 | 传统方案 | 融合方案 |
|---|---|---|
| 计算第一层 | 计算完整中间结果→写DRAM | 计算部分中间结果→暂存SRAM |
| 计算第二层 | 从DRAM读取→完整计算 | 立即复用数据→部分计算 |
| 内存访问量 | 2×中间数据大小 | 0.25×中间数据大小 |
实测显示,该技术使倒瓶颈结构的DRAM访问减少75%,全网络能耗降低37.6%。
5. 硬件实现与实测结果
5.1 芯片关键参数
我们在28nm工艺下实现了该加速器:
- 核心面积:1.48mm²
- 工作频率:100MHz
- 片上存储器:
- 输入缓存:8KB
- 权重缓存:4KB/PE
- 输出寄存器文件:24KB
- 全局SRAM:512KB
5.2 能效表现
在典型工作场景下(运行EdgeNeXt-S网络):
- 峰值能效:1.39 TOPS/W @ 25.6GMAC/s
- 平均功耗:18.4mW
- 帧率:13.16FPS
- 网络能效:731.1FPS/W
与同类方案的对比:
| 指标 | [24]JSCC'19 | [20]ISSCC'21 | 本工作 |
|---|---|---|---|
| 工艺(nm) | 65 | 28 | 28 |
| 精度(bit) | 1-16 | 8 | 8 |
| 网络能效(FPS/W) | 61.6 | 323.2 | 731.1 |
| 支持层类型 | CNN | CNN | Hybrid |
5.3 实际部署建议
对于想要采用该方案的开发者,我们建议:
- 模型量化:虽然支持8-16bit,但8bit量化能获得最佳能效比
- 内存规划:将频繁访问的权重数据映射到PE本地存储器
- 任务调度:利用硬件可编程性,将相似层类型连续执行以减少重构开销
- 温度管理:持续高负载时建议动态调整频率保持结温<85℃
该加速器的RTL代码已开源在KU Leuven MICAS实验室的GitHub仓库,包含完整的仿真测试环境和部署工具链。
