数坤科技 AI Infra 实习 一面
Q: Transformer的架构是什么?KV-Cache加速体现在哪里?
Transformer架构:
Transformer由Encoder和Decoder两部分组成(原始论文),现代LLM主要使用Decoder-only架构。
1 | Encoder Layer (×N): |
核心组件:
- Multi-Head Attention:多组QKV独立计算注意力再拼接
- FFN(前馈网络):通常为两层MLP(先升维4x再降维),现代模型用SwiGLU
- 残差连接:缓解梯度消失,允许信息直接跳过层传递
- LayerNorm:稳定训练(Pre-LN更常用,放在attention/FFN之前)
- 位置编码:RoPE(旋转位置编码)是主流
KV-Cache加速原理:
在自回归推理中,每生成一个新token需要计算它与所有历史token的注意力:
1 | 不使用KV-Cache: |
加速效果量化:
- Prefill阶段:所有token并行计算(类似训练),无需cache
- Decode阶段:每步只需计算1个token的QKV投影(而非重算所有历史token的KV)
- 计算量从O(n^2 × d)(重算全部)降为每步O(n × d)(增量attention)
- 代价:需要O(n × d × 2 × num_layers × num_heads)的显存存储KV-Cache
KV-Cache的显存占用: 以LLaMA-70B为例,每个token的KV-Cache约1MB(FP16),4K上下文需要4GB/request
Q: 并行策略有哪几种?
大模型训练中的并行策略用于将单卡无法承载的模型/数据分布到多个设备上:
1. 数据并行(Data Parallelism, DP):
- 每个设备持有完整模型副本,数据均分到各设备
- 前向独立计算,反向梯度通过AllReduce同步(求平均)
- 变体:DDP(PyTorch原生)、ZeRO(分片优化器状态/梯度/参数减少冗余显存)
- 适用:模型能放入单卡,需要加速训练
- 通信量:每步2×模型参数量的数据(一次AllReduce)
2. 张量并行(Tensor Parallelism, TP):
- 将单层的权重矩阵切分到多个设备
- MLP:第一层列切(各设备独立计算)→ 第二层行切(需AllReduce求和)
- Attention:按head切分(各设备处理不同head)→ 输出投影行切+AllReduce
- 每个Transformer层需要2次AllReduce(前向+反向各4次总共4对通信)
- 必须高带宽互联:NVLink(600GB/s),PCIe(64GB/s)不够用
3. 流水线并行(Pipeline Parallelism, PP):
- 将模型按层切分到不同设备(如前16层在GPU0,后16层在GPU1)
- 通过micro-batch流水线化减少气泡(bubble)
- 1F1B调度:填充期→稳态期(交替1次前向1次反向)→排空期
- bubble比例:(p-1)/(p-1+m),p为stage数,m为micro-batch数
- 通信量小(只传激活值),适合跨节点
4. 序列并行(Sequence Parallelism, SP):
- 沿序列维度切分,每个设备处理序列的一部分
- 解决长序列Attention的O(n^2)显存问题
- Ring Attention / DeepSpeed Ulysses等实现
5. 专家并行(Expert Parallelism, EP):
- MoE模型中不同expert分布在不同设备
- 需要All-to-All通信做token dispatch(路由到对应expert)和combine(结果收集回来)
混合并行策略(3D/4D/5D并行):
1 | 典型配置(如Megatron-LM训练175B模型): |
Q: 做并行时矩阵切分有什么注意的?数学原理是什么?
矩阵切分的数学原理:
对于 Y = X · W(X: [M, K], W: [K, N], Y: [M, N]):
列切分(Column Parallel):W按列切分
1 | W = [W1 | W2] (W1: [K, N/2], W2: [K, N/2]) |
- 每个设备独立计算X·Wi,无需通信
- 结果需要AllGather拼接(或直接传给下一层作为行切输入)
- Megatron MLP第一层(gate_proj/up_proj)使用列切
行切分(Row Parallel):W按行切分
1 | W = [W1; W2] (W1: [K/2, N], W2: [K/2, N]) |
- 每个设备计算部分积,结果需要AllReduce
- Megatron MLP第二层(down_proj)使用行切
Megatron-LM的MLP切分方案:
1 | 列切分(无通信) 行切分(AllReduce) |
- 一对(列切+行切)只需一次AllReduce(前向),巧妙避免中间通信
- 反向传播时同样只需一次AllReduce
关键注意事项:
- 数学等价性:切分后的分布式计算必须与单设备结果严格一致
- 维度整除:切分维度必须被设备数整除(如N=4096按8卡切,每卡512列)
- 通信类型选择:列切后需AllGather(拼接), 行切后需AllReduce(求和)
- 激活值通信:TP中每层的输入X需要在所有设备上保持一致(forward时需broadcast/allgather)
- 实际Megatron实现中:列切输出直接作为行切输入(跳过中间通信),利用SiLU/GeLU的element-wise特性
Q: 通信时延的影响因素?如何缓解?
通信时延模型:
1 | 通信时间 = 延迟(latency) + 数据量(bytes) / 带宽(bandwidth) |
影响因素详解:
| 因素 | 量化参考 | 影响程度 |
|---|---|---|
| 互联带宽 | NVLink:600GB/s, PCIe5:64GB/s, IB:400Gb/s, TCP:25Gb/s | 决定大数据传输速度 |
| 延迟 | NVLink: |
决定小消息效率 |
| 数据量 | 梯度/激活值/KV-Cache大小 | 正比影响传输时间 |
| 网络拓扑 | 全连接 vs 环形 vs Fat-tree | 影响集合通信效率 |
| 拥塞 | 多job共享网络 | 抖动和尾延迟 |
| 协议开销 | RDMA(kernel bypass) vs TCP(多次拷贝) | 影响实际利用率 |
缓解方法:
1. 计算通信重叠(Overlap)——最有效:
1 | // 边计算边通信 |
- 前向:GEMM分块完成后立即开始该块的通信
- 反向:梯度就绪后立即开始AllReduce
2. 减少通信量:
- 梯度压缩/量化(FP32梯度量化为FP16/INT8传输)
- 梯度稀疏化(只传top-k大梯度)
- GQA/MQA减少KV-Cache大小(TP通信减少)
3. 优化通信效率:
- Ring AllReduce:将大消息分成chunks流水线传输,带宽利用率(n-1)/n
- 分层通信:节点内NVLink做局部AllReduce,节点间RDMA做全局AllReduce
- 融合小消息:将多个小tensor合并为一个大buffer一次通信
4. 硬件层面:
- NVLink/NVSwitch:节点内高带宽(900GB/s on H100)
- InfiniBand NDR/XDR:节点间高带宽低延迟
- SHARP/In-Network Computing:交换机内做AllReduce减少数据传输
Q: 手撕:在全0方形矩阵中画出一个内切圆(用1填充)?
(编程题)