海康威视 AI Infra 一面
Q: 国产AI平台和NVIDIA平台的主要差异?
国产 AI 芯片(华为昇腾/寒武纪/壁仞/海光 DCU 等)与 NVIDIA GPU 平台的差异体现在多个层面:
1. 软件生态差距(最关键瓶颈):
- NVIDIA:CUDA 生态经过 15+ 年积累,cuBLAS/cuDNN/TensorRT/NCCL/Triton 等库高度成熟,开发者社区庞大
- 国产平台:各家自建编程模型(华为 CANN/AscendCL,寒武纪 BANG C,壁仞 BIRCC),算子库覆盖度有限,社区小,遇到问题难以搜索解决方案
- 影响:模型迁移需要重写或适配算子,新模型/新算子的支持滞后于 NVIDIA 数周到数月
2. 通信互联差距:
- NVIDIA:NVLink(900 GB/s per GPU on H100)+ NVSwitch(全互联)+ InfiniBand(400 Gbps)形成高速通信网络
- 国产平台:芯片间互联带宽通常是 NVLink 的 1/5-1/3,缺乏成熟的全互联方案
- 影响:TP(张量并行)效率受限,通信-计算重叠的设计空间更小,大规模并行训练效率低
3. 编程模型与开发效率:
- NVIDIA:统一的 CUDA 编程模型,丰富的调试/性能分析工具(Nsight Compute/Systems、cuda-gdb、compute-sanitizer)
- 国产平台:各厂商接口不统一,调试工具相对简陋,Profile 粒度和准确性有限
- 趋势:华为的 MindSpore/CANN 在逐步完善,但与 CUDA 生态差距仍然显著
4. 实际性能(MFU)差距:
- 单卡理论算力可能接近(如昇腾 910B 标称 FP16 320 TFLOPS vs A100 312 TFLOPS)
- 但实际 MFU(Model FLOPs Utilization)差距大:NVIDIA 大模型训练 MFU 可达 50-60%,国产平台通常 30-40%
- 原因:编译器优化不足、kernel 实现效率低、通信库不够成熟
5. 兼容性与迁移成本:
- PyTorch/TensorFlow 对 CUDA 原生支持,国产平台需要通过适配层(如华为的 torch_npu)接入
- 模型迁移通常需要:算子适配(有些算子国产平台不支持需要拆分/替换)、精度对齐(不同硬件的浮点行为差异)、性能调优
- 迁移一个大模型到国产平台典型需要 2-6 个月工程投入
发展趋势:国产平台在追赶中,华为昇腾生态最为完善(已支持 Llama/ChatGLM 等主流模型训练推理)。信创需求推动适配加速,但短期内 CUDA 仍是 AI Infra 的主流选择。
Q: 分布式训练的瓶颈?
大规模分布式训练的瓶颈随着规模增长在不同阶段呈现不同特征:
1. 通信瓶颈(最常见):
- AllReduce 开销:DDP 中每步梯度同步的通信量 = 2 * model_size * (N-1)/N。7B 模型 64 卡 Ring AllReduce 通信量 ~28GB/step
- 规模效应:随卡数增加,通信占比从 10% 可能上升到 30-50%
- 缓解方法:通信计算重叠(overlap backward 和 allreduce)、梯度压缩(FP16/INT8 通信)、增大 batch size 摊薄通信比例
- TP 通信:每个 transformer 层需要 2 次 AllReduce(attention + FFN),延迟累积显著
2. Pipeline 气泡(PP 并行):
- 1F1B 调度下,气泡率 = (p-1) / (p-1+m),p=stage 数,m=micro-batch 数
- 4 stage 16 micro-batch:气泡率 = 3/19 ≈ 16%
- 缓解:增加 micro-batch 数、interleaved schedule(Megatron-LM 的虚拟 pipeline stage)、zero bubble PP
3. 显存限制:
- 模型参数 + 梯度 + 优化器状态 + 激活值:7B FP32 训练约需 7*20=140GB
- 激活值显存随 seq_len 和 batch size 增长快速增加
- 缓解:ZeRO 切分、激活重计算(checkpoint)、offload 到 CPU/NVMe
4. 数据 IO 瓶颈:
- 大规模预训练的数据吞吐需求:1000 GPU * 每 GPU 处理 100K tokens/s = 100M tokens/s
- 数据读取、tokenize、shuffle 的速度需跟上 GPU 消耗速度
- 缓解:预处理数据存为 MMap 格式、多 worker 并行加载、数据在线 streaming
5. 容错性与稳定性:
- 千卡规模训练持续数周,期间硬件故障(GPU 宕机、网络断连、NVLink 错误)概率高
- 1000 卡训练中,平均每 2-4 天可能遇到一次硬件故障
- 缓解:频繁 checkpoint(每 100-500 步)、弹性训练(故障节点自动踢出)、冗余计算、heartbeat 监控
6. 负载不均衡:
- PP 中各 stage 计算量不等(embedding 层、LM head 层特殊)
- MoE 训练中不同专家负载不均
- 异构硬件(不同代 GPU 混用)的速度差异
- 缓解:精细的 stage 划分(加权而非均匀)、负载均衡的专家路由、同步屏障等待最慢节点
Q: 量化过程中出现掉点如何排查?
量化导致精度下降(掉点)是常见问题,需要系统化排查定位根因并针对性解决:
Step 1: 逐层敏感度分析(定位问题层):
- 方法:每次只量化一层(其他层保持 FP16),观察端到端 PPL/accuracy 变化
- 工具:量化框架的 sensitivity analysis 功能或自定义 hook
- 典型发现:第一层(embedding 后的 linear)、最后一层(LM head)、attention 的 QK 投影层通常最敏感
- 量化标准:单层量化导致 PPL 上升 >0.1 视为”敏感层”
Step 2: 检查分布异常(Outlier 问题):
- 统计每层权重和激活的分布(min/max/std/percentile)
- LLM 中普遍存在 “massive activation” 现象:某些通道的激活值比其他通道大 10-100x
- 可视化直方图:如果分布有长尾(少量极大值),min-max 量化范围被拉大,正常值精度下降
- 解决:SmoothQuant(将激活的 outlier 迁移到权重侧)、AWQ(保护重要通道不量化)
Step 3: 提升量化粒度:
- Per-tensor -> Per-channel -> Per-group(128/64/32 元素一组)
- 粒度越细,每组的 scale 越能匹配局部分布,量化误差越小
- Per-group 128 通常是精度和开销的平衡点(额外存储 scale/zp 的开销 ~3%)
Step 4: 检查校准数据:
- 校准数据是否代表实际推理数据的分布?
- 用少于 50 条校准数据可能统计不稳定
- 尝试增加校准数据量或更换更有代表性的数据集
- 不同校准数据可能导致 0.1-0.5 PPL 差异
Step 5: 混合精度策略:
- 基于 Step 1 的敏感度分析结果,对敏感层保持 FP16/BF16
- 常见保留高精度的层:第一个 Linear、LM Head、attention 的 Q/K 投影
- 通常保留 10-20% 的层为高精度,整体压缩比损失有限(如 W4 -> 有效 W4.5)
Step 6: 升级量化算法:
- MinMax PTQ -> GPTQ(逐列优化最小化逐层输出误差)
- GPTQ -> AWQ(识别并保护重要权重通道)
- PTQ -> QAT(有训练资源时,端到端微调量化参数)
实践经验:INT8 量化通常不需要特殊处理(PPL 上升 <0.1);INT4 量化需要使用 GPTQ/AWQ + per-group 才能保证质量(PPL 上升 <0.5);更激进的 INT2/INT3 通常需要 QAT。
Q: 手撕:合并两个有序数组?
(编程题)