匹配大模型版本与本地显存方法
我们看见大量的大语言模型在 modelscope 这类平台上,如何确定我们本地的GPU显存能否匹配上这个模型的基本要求?
这次我们搞这个。
看模型显存需求
大模型的计算单位都是2字节,也就是8*2=16bit ;而 我们看见 标着 AWQ 或者 4int 等就是量化压缩到4bit 的意思,最终显存需求会是原来的1/4。
Qwen-32B-AWQ
指的是32B个计算单位,原本FP16单位是32*2=64G的显存需求,但是AWQ的压缩,导致只需要64/4= 16G显存。
Qwen2.5-72B-AWQ
指的是72B个计算单位,原本FP16 是72*2=144G的显存需求,但是AWQ的压缩,导致只需要144/4= 36G显存。
通义千问 QwQ-32B
指的是32B个计算单位,FP16 大小就是 16bit的单位,也就是32*2=64G的显存需求。
计算任务拆分
ray 搞一个2个机器的集群,然后vllm 来平分GPU显存去计算。核心是vllm对计算的拆分。
例如:
tensor_parallel_size=4
,我们把计算任务用vllm 分4份给到GPU集群。
我们的算力集群是由4张24G显存的GPU组成。
GPU单卡显存计算公式
总需求
单卡需求(GB) = (量化模型大小 ÷ tensor_parallel_size) + KV_Cache + 开销
模型分片
模型分片 = (量化模型大小 ÷ tensor_parallel_size)
KV_Cache
KV_Cache ≈ 2 × batch_size × seq_len × 层数 × hidden_size × dtype_size × 0.6
大约KV_Cache(GB) ≈ batch_size × seq_len × 0.0001
下方为 KV_Cache(GB) 例表:
batch=4, seq=2048 | ~0.8 GB |
---|---|
batch=8, seq=4096 | ~3.2 GB |
batch=16, seq=8192 | ~12.8 GB |
vLLM | --max-num-seqs |
最大并发请求数(直接影响 batch_size) |
---|---|---|
--max-num-batched-tokens |
批处理的最大 token 数 |
vLLM | --max-model-len |
模型支持的最大序列长度(直接影响 seq_len) |
---|---|---|
--max-num-batched-tokens |
间接限制 seq_len |
开销
开销(固定值)
中间激活值:1-2 GB
框架开销:1-2 GB
总计:2-4 GB
启动峰值显存
启动峰值显存比稳态高 15-30%
查看GPU单卡显存压力
例如:
Qwen/Qwen-32B-Chat
FP16 大小:32B × 2 = 64 GB
KV_Cache(GB) ≈ batch_size × seq_len × 0.0001 = 8 × 8192 × 0.0001 = 6.5536 GB ≈ 6.4 GB
batch_size |
8 | 并发请求数 |
---|---|---|
seq_len |
8192 | 上下文长度 |
单卡需求:
- 模型分片:64GB ÷ 4 = 16 GB
- KV Cache:6.4 GB
- 开销:3.0 GB
单卡需求 = 25.4 > 我单一GPU 24G显存
所以我无法部署此大模型。
同时,由于启动峰值显存比稳态高 15-25%,上面的vllm配置中,即便是batch_size=1,seq_len=512, 在峰值依然超过了 显存余量,所以我无法部署此大模型。
例如:
通义千问2.5-72B-Instruct-AWQ量化
单卡需求:
- 模型分片:36GB ÷ 4 = 9 GB
- KV Cache:6.4 GB
- 开销:3.0 GB
单卡需求 = 18.4 > 我单一GPU 24G显存
启动峰值显存 ≈ 18.4 * 1.25 = 23 < 我单一GPU 24G显存, 所以可以部署。
查看GPU总显存压力
满足一下即可:
模型需要显存大小 < vllm总显存