0%

LLM的推理相关计算公式

记录 LLM 在推理上的理论计算公式

参数量

embedding + lm head + transformer block ×\times N

  • Embedding / LM Head 的参数量:vocab_size ×\times hidden_size
  • transformer block 的参数量
    • self-attention:qkvo 四个线性层,需要分别考虑两种 Attention
      • multi-head attention(MHA):4 ×\times hidden_size 2^2
      • grouped query attention(GQA):
        • q 和 o,2 $\times $ hidden_size 2^2

        • k 和 v,2 $\times $ hidden_size 2^2 / num_attention_heads $\times $ num_key_value_heads

    • FFN:三个线性层,3 ×\times hidden_size ×\times intermediate_size
    • layer norm:2 ×\times 2 ×\times hidden_size

llama2-13B 为例,关键参数

1
2
3
4
5
6
7
"hidden_size": 5120,
"intermediate_size": 13824,
"mlp_bias": false,
"num_attention_heads": 40,
"num_hidden_layers": 40,
"num_key_value_heads": 40,
"vocab_size": 32000,

由于 num_attention_heads == num_key_value_heads,所以是 MHA

  • Embedding/LM Head: 32000×512032000\times 5120
  • transformer block
    • self-attention:4×5120×51204\times 5120\times 5120
    • FFN: 3×5120×138243\times 5120\times 13824
    • layer norm: 4×51204\times 5120

综上,列出计算

2×32000×5120+40×(4×5120×5120+3×5120×13824+4×5120)=13,016,268,80013B2\times 32000\times 5120 + 40\times (4\times 5120\times 5120 + 3\times 5120\times 13824 + 4\times 5120) = 13,016,268,800 \approx 13B

如果是 (b)float16,则占用空间/显存为 13 $\times $ 2 = 26G

如果是 GQA,self-attn 参数量公式为

KV cache 显存计算公式

4×b×l×num_heads×embed_size_per_head×(s+n)4\times b\times l\times num\_heads\times embed\_size\_per\_head \times (s+n)

参数说明

  • b: 句子条数
  • l:层数
  • num_heads:隐层大小 (num_key_value_heads)
  • embed_size_per_head:每个头的大小 (hidden_size / num_attention_heads)
  • s:输入长度
  • n:输出长度
  • 4:k cache+v cache,均为 float16,所以是(1+1)*2

如果只有1条句子,输入+输出 token 长度由 512 -> 1024,则会增加 4×512×l×h4\times 512 \times l\times h

Llama3-8B:$4\times 512\times 1024\times 32 / 1024 / 1024 = 64 $ M

Llama3-70B:4×512×1024×80/1024/1024=1604\times 512\times 1024\times 80 / 1024 / 1024 = 160 M

简单来说,每增加一个 token

8B 就会增加 0.125 M 的显存

70B 就会增加 0.3125 M 的显存

计算量

Embedding 可以视作一个哈希表,没有计算量

  • LM Head:2×b×s×hidden_size×V2 \times b \times s\times hidden\_size\times V
  • Self-attention:
    • q_proj: 2×b×s×hidden_size22 \times b \times s \times hidden\_size^2
    • k_proj和v_proj:
      • MHA: 2×(2×b×s×hidden_size2)2\times(2 \times b \times s \times hidden\_size^2)
      • GQA: 2×(2×b×s×hidden_size2/(num_attention_heads×num_key_value_heads)2)2\times(2 \times b \times s \times hidden\_size^2 / (num\_attention\_heads \times num\_key\_value\_heads)^2 )
    • attn_weights: 2×b×s2×hidden_size2 \times b \times s^2 \times hidden\_size
    • attn_output: 2×b×s2×hidden_size2 \times b \times s^2 \times hidden\_size
    • o_proj: 2×b×s×hidden_size22 \times b \times s \times hidden\_size^2
  • FFN:
    • gate_proj 和 up_proj: 2×2×b×s×(hidden_size×intermediate_size)2\times 2\times b \times s\times (hidden\_size\times intermediate\_size)
    • down_proj: 2×b×s×(intermediate_size×hidden_size)2\times b \times s\times (intermediate\_size\times hidden\_size)

参数说明

  • b: 句子条数
  • s: 输入长度
  • 2: 一次乘法操作和一次加法操作

还是以 llama2-13B 为例,关键参数

1
2
3
4
5
6
7
"hidden_size": 5120,
"intermediate_size": 13824,
"mlp_bias": false,
"num_attention_heads": 40,
"num_hidden_layers": 40,
"num_key_value_heads": 40,
"vocab_size": 32000,

假设 b=1,s=1,则整体计算量有

  • LM Head: 2×5120×320002\times 5120\times 32000
  • self-attention:
    • 2×5120×51202\times 5120\times 5120
    • 4×5120×51204\times 5120\times 5120
    • 2×51202\times 5120
    • 2×51202\times 5120
    • 2×5120×51202\times 5120\times 5120
  • MLP:
    • 4×5120×138244\times 5120\times 13824
    • 2×13824×51202\times 13824\times 5120

模型有 40 层,所以

2×5120×32000+40×(8×5120×5120+4×5120+2×5120×13824+2×13824×5120)=20,041,728,0002\times 5120\times 32000+ 40\times(8\times 5120\times 5120+4\times 5120+ 2\times 5120\times 13824+2\times 13824\times 5120) = 20,041,728,000

参考资料:

https://blog.csdn.net/wxc971231/article/details/135434478