AI模型的计算过程可系统性地拆解为“取”、“算”、“存”三大阶段,每个阶段又可细化为多个子步骤,并对应着关键的延迟指标。
1. “取”阶段:数据与指令获取
此阶段负责将模型权重、输入数据及计算指令从存储系统加载至计算单元。
| 子步骤 | 核心任务 | 关键延迟指标 |
|---|---|---|
| 1.1 指令取指 (Instruction Fetch) | 从指令缓存(I-Cache)或内存中读取下一条待执行的指令。 | 分支预测失败惩罚 (Branch Misprediction Penalty):当CPU/GPU错误预测分支跳转方向时,需清空流水线并重新取指,造成10-20个时钟周期的延迟。 |
| 1.2 数据加载 (Data Load) | 将模型权重(Weights)和输入数据(Activations)从内存层次结构(如HBM、DRAM)加载到片上缓存或寄存器。 | 缓存命中率 (Cache Hit Rate):衡量所需数据在高速缓存(如L1/L2 Cache、KV Cache)中直接命中的比例。未命中(Miss)需访问更慢的存储,导致缓存未命中延迟 (Cache Miss Latency),可达数百个时钟周期。 |
| 1.3 权重预取与广播 (Weight Prefetching & Broadcasting) | 在分布式训练或MoE模型中,提前将所需权重从参数服务器或其他计算节点拉取到本地,或在节点间广播。 | 网络通信延迟 (Network Latency):跨节点数据传输的端到端延迟,受网络带宽、协议开销和物理距离影响。MoE all-to-all通信延迟:在混合专家模型中,Token路由后所需的跨节点数据交换延迟。 |
2. “算”阶段:核心计算执行
此阶段在算术逻辑单元(ALU)、张量核心(Tensor Core)等计算单元上执行矩阵乘、卷积等核心运算。
| 子步骤 | 核心任务 | 关键延迟指标 |
|---|---|---|
| 2.1 指令译码与发射 (Instruction Decode & Issue) | 将取到的指令解码为微操作,并发射到相应的功能单元。 | 流水线停顿 (Pipeline Stall):由于数据依赖(如前一条指令结果未就绪)、资源冲突或结构冒险导致流水线空转的周期数。 |
| 2.2 计算执行 (Execution) | 在ALU、FPU或Tensor Core上执行实际的浮点或整数运算。 | 计算延迟 (Compute Latency):完成一次基本运算(如FMA)所需的时钟周期。内存墙 (Memory Wall)延迟:由于数据供给速度远低于计算速度,导致计算单元空闲等待数据的延迟,这是冯·诺依曼架构的主要瓶颈。 |
| 2.3 同步与归约 (Synchronization & Reduction) | 在分布式计算中,等待所有并行计算单元完成工作,并对结果进行汇总(如梯度All-Reduce)。 | 同步延迟 (Synchronization Latency):等待最慢计算单元(Straggler)的时间。归约通信延迟:在集群中进行All-Reduce等集合操作产生的网络延迟。 |
3. “存”阶段:结果写回与更新
此阶段将计算结果写回内存或缓存,并可能更新模型状态。
| 子步骤 | 核心任务 | 关键延迟指标 |
|---|---|---|
| 3.1 结果写回 (Write-Back) | 将计算单元的运算结果写回寄存器或缓存。 | 写缓冲区满停顿 (Write Buffer Stall):当写缓冲区(Write Buffer)已满时,后续的存储指令必须等待,导致流水线停顿。 |
| 3.2缓存一致性维护 (Cache Coherence Maintenance) | 在多核/多GPU系统中,确保不同核心的缓存中同一数据副本的一致性(如MESI协议)。 | 一致性协议通信延迟:为维护一致性,缓存间发送无效化(Invalidation)或更新消息所产生的延迟。 |
| 3.3模型状态更新 (Model State Update) | 在训练过程中,将计算出的梯度更新到优化器状态和模型权重中。 | 参数更新延迟:特别是对于大规模模型,将更新后的权重从GPU HBM写回至CPU内存或参数服务器的延迟。在存算一体等新型架构中,此延迟可能被显著降低。 |
| 3.4 输出返回 (Output Return) | 将最终的模型输出(如生成的Token)从设备内存传输回主机内存或发送给用户。 | 端到端延迟 (End-to-End Latency):从用户提交请求到收到完整响应的总时间,是衡量推理性能的终极指标,包含首Token延迟 (TTFT)和Token间延迟 (TPOT)。 |
核心延迟优化技术代码示意
以下以优化“取”阶段的缓存命中率为例,展示一种软件预取策略:
import numpy as np def prefetch_aware_matrix_multiply(A, B, C, block_size, prefetch_distance): """ 带有数据预取意识的块矩阵乘法,旨在提升缓存命中率。 A, B: 输入矩阵 C: 输出矩阵 (初始为零矩阵) block_size: 缓存友好的分块大小 prefetch_distance: 预取提前量(以迭代次数计) """ n = A.shape[0] # 假设我们针对B矩阵进行预取 for i in range(0, n, block_size): for j in range(0, n, block_size): # 1. 预取阶段:提前将未来要用的B矩阵块加载到缓存 if j + prefetch_distance * block_size < n: _prefetch_block_B = B[j + prefetch_distance * block_size: j + (prefetch_distance + 1) * block_size, i + prefetch_distance * block_size: i + (prefetch_distance + 1) * block_size] # 模拟硬件预取指令(如`__builtin_prefetch` in C) # 此处为逻辑表示,实际由编译器或硬件完成 pass # 2. 计算当前块 for k in range(0, n, block_size): A_block = A[i:i+block_size, k:k+block_size] B_block = B[k:k+block_size, j:j+block_size] C[i:i+block_size, j:j+block_size] += np.dot(A_block, B_block) return C # 使用示例 A = np.random.randn(1024, 1024) B = np.random.randn(1024, 1024) C = np.zeros((1024, 1024)) result = prefetch_aware_matrix_multiply(A, B, C, block_size=256, prefetch_distance=2)注释:此代码展示了通过分块(提升空间局部性)和模拟预取(将未来需要的数据提前加载)来优化缓存利用率的思路,是减少“取”阶段延迟的经典方法。
总结:延迟指标的层级关系
这些延迟指标共同构成了模型执行的性能画像。端到端延迟是最终用户体验的体现,而缓存未命中延迟、流水线停顿和分支预测失败是构成其微观时间开销的主要因素。优化往往需要从算法(如提升数据局部性)、系统(如优化内存层次)和硬件(如采用存算一体架构)多个层面协同进行。
参考来源
- 延迟指标解析:缓存命中率、流水线停顿与分支预测
- 5大关键指标:如何评估AI算力网络的通信性能?
- 算力≠速度:TOPS、GFLOPS、带宽、延迟这些指标怎么读?
- AI硬件的未来发展方向——存算融合
- AI算力网络中低延迟通信协议的实现原理与代码示例
- AI算力网络中的算力模型安全验证方法