1. 张量神经网络训练加速器架构概述

张量分解技术正在彻底改变神经网络训练的计算范式。传统神经网络参数以稠密矩阵形式存储,而张量神经网络(TNN)通过Tucker、TT(Tensor-Train)等分解方法,将高维权重张量转化为低秩张量网络表示。这种表示不仅减少了90%以上的参数存储量,更重要的是将矩阵乘法转化为多级张量收缩(Tensor Contraction)操作,为硬件加速创造了独特机会。

1.1 张量分解的核心原理

以TT分解为例,一个大小为d₁×d₂×...×dₙ的高维权重张量,可以分解为n个小型核心张量G₁,G₂,...,Gₙ的链式乘积。每个Gₖ的大小仅为r_{k-1}×dₖ×rₖ(其中rₖ为秩参数),总参数量从O(dⁿ)降为O(ndr²)。在正向传播时,输入张量需要与这些核心张量按特定顺序进行收缩运算。例如,对于三层TT分解的矩阵乘法Y=XW,其计算过程可表示为:

Y(i,j) = ∑_{α,β} X(i,α) * G₁(α,k₁,β) * G₂(β,k₂,γ) * G₃(γ,j,δ)

这种计算模式带来两个关键特性:1) 计算过程呈现多级流水线特征,每级只需处理小型核心张量;2) 中间结果(如α,β,γ等辅助索引维度)会产生大量临时张量,需要高效的内存管理。

1.2 训练加速的硬件挑战

与传统稠密神经网络训练相比,TNN训练面临三个特殊挑战:

  1. 动态数据布局 :在反向传播过程中,同一张量可能作为操作数(如激活值)或梯度参与不同维度的收缩运算,需要频繁改变内存排布。例如,权重梯度计算通常需要将激活张量从"K-last"转为"M-last"布局。

  2. 不规则并行性 :不同收缩阶段的运算强度差异显著。早期阶段(如G₁收缩)通常是内存受限的,而后期阶段(如G₃收缩)则是计算密集的。

  3. 细粒度依赖 :自动微分要求精确匹配正向和反向传播的数据流路径,任何优化不得破坏计算图的数值一致性。

2. FETTA加速器架构设计

2.1 整体架构

FETTA采用分层处理架构,核心组件包括:

  • 收缩引擎阵列(CE Array) :16个4×4 PE组成的计算单元,支持BFLOAT16格式的MAC运算
  • 转置蝶形网络 :分布网络(Distribution Network)和归约网络(Reduction Network)均采用log(N)+1级蝶形拓扑
  • 统一内存 :512KB SRAM组织为16个存储体,支持同时读写访问
  • 累加单元 :128KB专用SRAM用于部分和(Psum)的中间存储
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ Unified     │    │ Transposable│    │ Contraction │
│ Memory      │───▶│ Butterfly   │───▶│ Engine      │
│ (16 banks)  │    │ Network     │    │ Array       │
└─────────────┘    └─────────────┘    └─────────────┘
                           ▲                     │
                           │                     ▼
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ Accumulation│◀────┤ Reduction   │◀────┤ Psum Output│
│ Unit        │     │ Network     │     │            │
└─────────────┘     └─────────────┘     └─────────────┘

2.2 可重构PE阵列设计

每个CE内部的4×4 PE阵列支持六种基本数据流模式:

  1. 输入驻留(Input Stationary)

    • 垂直路径:输入张量沿列方向广播,权重张量沿行方向流动
    • 水平路径:输入张量沿行方向广播,权重张量沿列方向流动
  2. 权重驻留(Weight Stationary)

    • 类似输入驻留,但将权重固定在PE寄存器中
  3. 输出驻留(Output Stationary)

    • 部分和累积在PE内,输入和权重通过蝶形网络动态路由

关键创新在于PE的 多模式累加器 设计:

always @(posedge clk) begin
  case (mode)
    IS_MODE:  psum <= (ib_sel) ? psum + ia * ib : psum;
    WS_MODE:  psum <= (ia_sel) ? psum + ia * ib : psum;
    OS_MODE:  psum <= psum + ia * ib;
  endcase
end

通过动态配置数据选择器(ib_sel/ia_sel),同一PE可适应不同数据流策略,无需硬件重构。

2.3 转置蝶形网络

分布网络和归约网络采用改进的蝶形拓扑:

  • 基础结构 :N输入N输出的log₂N+1级网络
  • 转置层 :首级加入全连接转置层,支持行列变换
  • 路由单元 :分布网络使用2:1 MUX,归约网络使用带加法器的2×2开关

典型路由模式包括:

  • 广播 :单输入→多输出(如权重共享)
  • 行组播 :单行输入→多行输出
  • 列转置 :矩阵行列交换
  • 部分归约 :相邻PE的psum相加

与传统的Benes网络相比,该设计在保证灵活性的同时,将面积开销从O(NlogN)降至O(N),功耗降低42%。

3. 数据流优化关键技术

3.1 收缩序列搜索引擎(CSSE)

CSSE采用动态规划算法寻找最优收缩路径:

  1. 代价建模 :为每个可能的收缩步骤建立时延-能耗模型

    • 计算代价:FLOPs × 硬件吞吐率倒数
    • 通信代价:数据量 × 内存层次访问延迟
  2. 路径搜索

def search_sequence(tensor_graph):
    n = len(tensor_graph.nodes)
    dp = [[None]*n for _ in range(n)]
    
    for l in range(1, n+1):  # sequence length
        for i in range(n-l+1):
            j = i + l - 1
            if l == 1:
                dp[i][j] = Cost(tensor_graph.nodes[i])
            else:
                min_cost = float('inf')
                for k in range(i, j):
                    cost = dp[i][k] + dp[k+1][j] + 
                           contraction_cost(tensor_graph, i, k, j)
                    if cost < min_cost:
                        min_cost = cost
                dp[i][j] = min_cost
    return dp[0][n-1]

实验表明,相比固定序列,CSSE为UCF-TR任务带来7.38倍加速和40.64倍能效提升。

3.2 统一内存管理

16存储体的统一内存采用三项关键技术:

  1. 动态体使能 :根据当前数据流模式激活部分存储体

    • 例如,行广播时只需激活4个存储体(每行1个)
  2. 乒乓缓冲 :双缓冲机制实现:

    • 片外DRAM预取与计算重叠
    • 相邻网络层的流水线执行
  3. 冲突避免 :通过XOR运算生成体选择向量

    bank_idx = (bank_idx + stride) % BANK_NUM;
    sel_vec = original_vec ^ (bank_idx & mask);
    

3.3 混合精度训练支持

FETTA集成三种精度模式:

  1. BFLOAT16主路径 :MAC单元采用1-8-7格式
  2. FP32累加 :部分和使用32位累加以防止溢出
  3. 8位梯度压缩 :通过向量单元实现梯度量化

精度配置寄存器:

位域 名称 功能描述
1:0 ACT_PREC 激活值精度 (00=BF16)
3:2 WGT_PREC 权重精度 (01=FP32)
5:4 GRAD_PREC 梯度精度 (10=INT8)
7:6 ACCUM_PREC 累加器精度 (11=FP32)

4. 实现与性能分析

4.1 硬件实现

采用7nm工艺实现关键指标:

  • 面积:0.21 mm²(CE阵列占20.17%)
  • 功耗:175.5 mW @1GHz
  • 能效:21.49 TOPS/W(BF16稠密模式)

资源分布:

模块 面积占比 功耗占比
CE阵列 20.17% 56.57%
归约网络 5.30% 13.58%
分布网络 0.63% 1.74%
统一内存 54.44% 12.73%
累加单元 12.34% 4.18%

4.2 基准测试

在典型负载上的性能表现:

  1. Transformer (ATIS-TT)

    • 速度:144.8倍于GPU稠密训练
    • 能效:1246倍于GPU稠密训练
  2. BERT (SQuAD-TT)

    • 内存占用减少10.4倍
    • 准确率损失<2%
  3. LSTM (UCF-HT)

    • 参数压缩47,375倍
    • 准确率提升7.51%

4.3 对比分析

与主流加速器比较(几何平均):

指标 TPU-v2 SIGMA TRETA FETTA
时延(归一化) 25.7× 8.85× 3.86× 1.0×
能耗(归一化) 5.6× 1.73× 1.41× 1.0×
MAC利用率 9.8% 63.2% 22.0% 89.7%

关键优势体现在:

  1. 数据流灵活性 :支持动态切换输入/权重/输出驻留模式
  2. 布局转换零开销 :通过蝶形网络硬件实现张量转置
  3. 细粒度功耗门控 :按需激活CE和存储体

5. 实际部署经验

5.1 编译器优化

为充分发挥硬件潜力,需要编译器执行:

  1. 张量切片 :将大张量分解为适合CE处理的子块

    • 典型切片大小:4×4×4(匹配PE阵列尺寸)
  2. 指令调度 :隐藏内存访问延迟

    LOAD_TILE IA, bank0  // 启动IA加载
    COMPUTE_PREVIOUS     // 计算上一批数据
    SYNC IA              // 等待加载完成
    
  3. 模式预测 :基于计算图分析提前配置数据流

5.2 常见问题排查

  1. 存储体冲突

    • 现象:带宽利用率突然下降
    • 解决:调整张量填充(Padding)或切片策略
  2. 累加溢出

    • 现象:训练loss出现NaN
    • 解决:启用FP32累加模式或减小学习率
  3. 路由拥塞

    • 现象:蝶形网络部分链路利用率达100%
    • 解决:优化CSSE权重,增加通信代价比重

5.3 扩展应用

该架构经适配还可用于:

  1. 量子电路模拟 :将量子门操作映射为张量收缩
  2. 科学计算 :加速高阶偏微分方程求解
  3. 推荐系统 :超大规模稀疏张量运算

在部署UCF视频分类任务时,通过将HT分解与FETTA加速结合,实现了端到端87.2%的准确率(比稠密模型高7.51%),同时能耗降低192.6倍。这证明张量训练加速器在边缘设备上的实用价值。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐