科大讯飞 飞星 AI Infra 校招
Q: NVIDIA 的卡对 FP8 有哪些独特的优化?
Hopper 架构(H100)是首款原生支持 FP8 计算的 GPU,做了全方位的硬件优化:
1. Tensor Core 原生支持:
- FP8 矩阵乘法直接在第四代 Tensor Core 上执行
- 吞吐对比:FP8 = 1978 TFLOPS,FP16 = 989 TFLOPS——2x 吞吐提升
- 支持 FP8 × FP8 → FP16/FP32 的混合精度累加,保证数值精度
2. Transformer Engine:
- NVIDIA 提供的软件层,自动管理 FP8 训练中的动态缩放(Dynamic Scaling)
- 根据激活/权重/梯度的统计信息自动选择最优格式:前向用 E4M3(精度更高),反向用 E5M2(范围更大)
- Per-tensor 粒度的 scale factor,每层独立维护
- 与 PyTorch/JAX 深度集成,用户代码几乎不需修改
3. 硬件 Format 转换:
- 支持 FP8 ↔ FP16/BF16/FP32 的高效类型转换
- 转换通过专用硬件单元完成,不占用 CUDA Core/Tensor Core
4. 延迟缩放(Delayed Scaling):
- 传统做法:当前 step 计算 amax → 计算 scale → 量化。这需要额外的同步操作
- 延迟缩放:利用上一步的 amax 统计进行当前步的缩放
- 减少了实时统计的同步开销,对训练精度影响可忽略(相邻 step 的分布变化很小)
5. TMA(Tensor Memory Accelerator)配合:
- TMA 可以在数据从 HBM 搬到 SRAM 时自动做格式转换
- FP8 数据在 HBM 中占用更少带宽,加载时由 TMA 转为 FP16 计算
Q: FP8 的两种格式(E4M3 和 E5M2)有什么区别?分别怎么计算?
| 属性 | E4M3 | E5M2 |
|---|---|---|
| 指数位 | 4 | 5 |
| 尾数位 | 3 | 2 |
| 偏置(bias) | 7 | 15 |
| 最大正值 | 448 | 57344 |
| 最小正 subnormal | 2^(-9) ≈ 0.00195 | 2^(-16) ≈ 0.0000153 |
| 动态范围 | ~10^2.7 | ~10^4.8 |
| 精度级数 | 8 级(2^3) | 4 级(2^2) |
| 特殊值 | 有 NaN,无 Inf | 有 NaN 和 Inf |
| 适用场景 | 前向(权重、激活) | 反向(梯度) |
计算方式(与标准 IEEE 浮点相同):
1 | value = (-1)^sign × 2^(exponent - bias) × (1 + mantissa/2^m) |
为什么分两种格式:
- 前向用 E4M3:权重和激活的分布相对集中,需要更高精度(8 级尾数)来区分相近的值,动态范围要求不高
- 反向用 E5M2:梯度分布跨度大(尤其是深层网络),需要更大动态范围防止下溢/上溢,精度要求可以放低(梯度方向比精确值更重要)
Q: 如何计算 FP8 的 KV Cache 大小?
公式:
1 | KV Cache = 2(K和V) × num_layers × num_kv_heads × head_dim × seq_len × batch_size × bytes_per_element |
具体计算示例(LLaMA-70B:80 层、8 KV heads(GQA)、128 head_dim):
| 配置 | 计算 | 结果 |
|---|---|---|
| FP16, bs=1, seq=4096 | 2×80×8×128×4096×1×2 | 1.0 GB |
| FP8, bs=1, seq=4096 | 2×80×8×128×4096×1×1 | 0.5 GB |
| FP8, bs=16, seq=4096 | 2×80×8×128×4096×16×1 | 8.0 GB |
| FP8, bs=1, seq=32768 | 2×80×8×128×32768×1×1 | 4.0 GB |
FP8 KV Cache 的意义:
- 相比 FP16 减少 50% 显存
- 可以支持 2x 更长序列或 2x 更大 batch
- 对精度影响:attention score 的精度损失约 0.1-0.3 PPL,多数场景可接受
- 进一步优化:结合 GQA(减少 head 数)+ FP8(减少每个元素字节数),KV Cache 可以降低到 MHA+FP16 的 1/16
Q: H100 有什么新设计,和 L40 有什么不一样?
H100(Hopper 架构)核心新特性:
| 特性 | 说明 |
|---|---|
| FP8 Tensor Core | 原生支持,算力 1978 TFLOPS(FP8),是 A100 FP16 的 6x |
| TMA | Tensor Memory Accelerator,硬件异步数据搬运,解放 SM 不再做地址计算和搬运 |
| DSMEM | 分布式共享内存,SM 间直接访问对方 shared memory,无需经过 L2 |
| Thread Block Cluster | 多个 Block 组成 Cluster 协同工作,共享 DSMEM |
| NVLink 4.0 | 900 GB/s 双向带宽(A100 为 600 GB/s) |
| HBM3 | 80 GB,3.35 TB/s 带宽(A100 HBM2e 为 2.0 TB/s) |
| 132 SM | 比 A100(108 SM)多 22% |
H100 vs L40 对比:
| 维度 | H100 (Hopper) | L40 (Ada Lovelace) |
|---|---|---|
| 定位 | 数据中心训练+推理 | 推理/图形工作站 |
| 显存类型 | HBM3 80GB | GDDR6X 48GB |
| 显存带宽 | 3.35 TB/s | 864 GB/s |
| NVLink | 支持(900 GB/s) | 不支持 |
| FP8 算力 | 1978 TFLOPS | 362 TFLOPS |
| FP16 算力 | 989 TFLOPS | 181 TFLOPS |
| TDP 功耗 | 700W | 300W |
| 价格 | ~$30,000+ | ~$7,000 |
| 适用场景 | 大规模训练/推理 | 单卡推理/渲染 |
核心差异总结:L40 无 HBM(带宽只有 H100 的 1/4)、无 NVLink(不能高速多卡互联)、算力远低,但功耗和成本也低很多。L40 适合单卡推理小模型,H100 适合多卡训练和大模型推理。
Q: 最近推理方面有什么新的 tricks?
2024-2025 推理优化前沿方向:
解码加速:
- 投机解码(Speculative Decoding):小模型草稿 + 大模型验证,不改变输出分布的前提下加速 2-3x
- EAGLE/EAGLE-2:特征级别投机,用隐藏状态预测下一token特征而非直接预测token,接受率更高
- Medusa:在最后一层加多个预测头,并行预测多个未来 token
- Lookahead Decoding:利用 Jacobi 迭代并行解码
KV Cache 优化:
- MLA(Multi-head Latent Attention):DeepSeek 的低秩 KV 压缩,压缩比 5-10x
- StreamingLLM:attention sink + 滑动窗口,支持无限长度推理
- H2O(Heavy Hitter Oracle):动态保留高累积 attention score 的 token KV
- SGLang RadixAttention:前缀树自动复用公共前缀的 KV Cache
系统级优化:
- PD 分离 + Chunked Prefill:Prefill/Decode 异构部署 + chunk 交错执行
- MoE + Expert Parallel:稀疏激活降低计算量,EP 实现专家分布式部署
- FP8 推理:Hopper 原生支持,吞吐翻倍,精度损失可控
- DeepEP:DeepSeek 开源的高性能 MoE All-to-All 通信库
量化/压缩:
- FP4/NF4:4-bit 浮点量化,比 INT4 更适配正态分布权重
- W4A8:权重 INT4 + 激活 INT8,兼顾压缩率和计算加速