Skip to content

优化

本页区分已实现的优化计划中的优化。计划项的落地顺序见 ROADMAP

已实现的优化

1. W8A16 量化推理路径

  • INT8 权重 + FP16 激活,分组量化(QuantizationParams::group_size,默认 128,对称量化无零点)
  • 权重显存占用约为 FP16 的 1/2(不含 scale 开销)
  • 实现:kernels/w8a16_matmul.cusrc/quantization.cpp

2. 显存预分配的 KV Cache

  • KVCacheManagerKVCacheConfig(层数、头数、head_dim、max_seq_len、max_batch_size)一次性预分配
  • 避免 decode 阶段动态分配;显存上界在启动时即可计算
  • 每序列 KV 显存估算公式:2 × num_layers × num_kv_heads × head_dim × max_seq_len × 2 bytes

3. 共享内存与 warp 级 kernel 模式

  • kernels/ 下的 attention / rmsnorm / elementwise kernel 使用共享内存分块与 warp 级归约
  • GQA 支持:ModelConfig::num_kv_headsnum_heads 可不同

计划中的优化(按 ROADMAP 顺序)

优化项预期收益状态
真实模型端到端 + 基准脚本使所有优化可度量待做(前置条件)
CUDA Graphs降低 decode 阶段 kernel launch 开销待做
FlashAttention 风格 attentionprefill 阶段显存与速度待做(可复用 cuflash-attn 的经验)
KV Cache swapping/offload支持超出显存的并发序列待做
连续批处理吞吐导向场景待做(调度层设计见 paged-infer

注意:上表中的配置开关(如 CUDA Graphs 开关)目前尚不存在于代码中,实现前请勿在任何文档中引用。

内存估算方法(理论值,非实测)

推理时显存主要由三部分组成:

组件估算公式
模型权重 (W8A16)num_params × 1 byte + scale 开销
KV Cache2 × num_layers × num_kv_heads × head_dim × max_seq_len × batch × 2 bytes
激活与临时缓冲与 hidden_dim、seq_len 相关,按实际分配统计

实测显存分解将在基准测试阶段用 cudaMemGetInfo 差值法补充。

通用测量建议

  1. nvidia-smi dmon 观察 GPU 利用率与显存带宽
  2. 用 Nsight Systems 看时间线空洞,用 Nsight Compute 看 kernel 级瓶颈(见 分析
  3. 测量时固定时钟与功率限制,避免 boost 抖动影响对比

基于 MIT 许可证发布