Skip to content

性能基准

Tiny-LLM 的性能基准测试和分析数据。


目录


系统配置

基准测试参考系统:

组件规格
GPUNVIDIA RTX A6000 (Ampere, 48 GB)
CPUAMD EPYC 7763 64-Core
内存256 GB DDR4
CUDA12.2
驱动535.104

端到端基准

吞吐 (tokens/second)

模型: 7B 参数, 4096 隐藏层, 32 层, 32 头

Batch 大小序列长度Prefill (tok/s)Decode (tok/s)显存 (GB)
112812,800854.2
151210,240825.8
120486,4007611.2
412824,00028011.8
451218,43227016.4

注意: Batch > 1 需要足够的 KV 缓存显存。

W8A16 vs FP16 对比

指标W8A16FP16改善
权重显存7.5 GB15 GB50%
激活显存相同相同-
吞吐85 tok/s78 tok/s9%
精度 (困惑度)9.129.080.4%

Kernel 基准

W8A16 矩阵乘法

配置: M=1, K=4096, N=4096

GPU时间 (μs)吞吐 (TFLOPS)Tensor Core 利用率
RTX A6000420.8078%
A100350.9682%
RTX 4090281.2085%

Attention Decode

配置: batch=1, heads=32, head_dim=128, 变化 seq_len

序列长度时间 (μs)显存带宽 (GB/s)
12824420
51252780
2048180920
8192680980

注意: Decode 受显存带宽限制,因为需要读取 KV 缓存。

RMSNorm

隐藏维度时间 (μs)带宽 (TB/s)
40961.22.7
81922.13.1

内存使用

模型权重 (7B 模型)

组件W8A16 大小FP16 大小
词嵌入250 MB250 MB
32 × 注意力层4.0 GB8.0 GB
32 × FFN 层3.5 GB7.0 GB
输出 Norm + LM Head~0~0
权重总计~7.8 GB~15.3 GB

运行时显存

配置权重KV 缓存激活总计
Batch=1, Seq=20487.8 GB0.5 GB0.1 GB8.4 GB
Batch=4, Seq=20487.8 GB2.0 GB0.4 GB10.2 GB

KV 缓存公式: 2 × batch × num_layers × seq_len × num_kv_heads × head_dim × sizeof(half)

7B 模型示例 (32 层, 32 头, 128 头维度):

  • 每 token: 2 × 32 × 128 × 2 = 16.4 KB
  • 2048 tokens: 每层 32.8 MB → 每 batch 1.05 GB

性能分析指南

Nsight Compute

分析单个 kernel:

bash
# 分析特定 kernel
ncu --kernel-name attention_decode \
    --metrics sm__throughput.avg.pct_of_peak_sustained_elapsed \
    ./test_attention

# 完整报告
ncu -o report.ncu-rep ./benchmark
ncu-ui report.ncu-rep  # 用 GUI 打开

Nsight Systems

追踪完整应用:

bash
nsys profile -o profile --stats true ./tiny_llm_demo
nsys-ui profile.qdrep

自定义计时器

cpp
#include <chrono>

class Timer {
    using Clock = std::chrono::high_resolution_clock;
    Clock::time_point start_;
public:
    Timer() : start_(Clock::now()) {}

    float elapsedMs() {
        auto end = Clock::now();
        return std::chrono::duration<float, std::milli>(end - start_).count();
    }
};

// 使用
Timer t;
engine->generate(prompt, config);
std::cout << "生成耗时: " << t.elapsedMs() << " ms" << std::endl;

基于 MIT 许可证发布