开源大模型实战分析
作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:神秘的鱼仔
# 分享内容
- 开源大模型生态
- 开源大模型开源的是什么
- 主流开源平台介绍
- 模型文件结构解析
- 分词器:文字和tokens的关系
- 部署大模型显存如何评估
- 部署大模型的方式
# 1. 开源大模型生态
# 1.1 开源大模型的崛起历程
在2022年11月ChatGPT发布之前,AI大模型领域主要由少数科技巨头主导。OpenAI、Google、Anthropic等公司掌握最先进技术,开发者依赖API调用。2023年Meta的LLaMA系列开启开源浪潮,随后LLaMA 2/3推动社区爆发。
进入2025-2026年,开源大模型已不再是“追赶者”。以Qwen3.5(Alibaba)、Llama 4(Meta,Scout/Maverick MoE原生多模态)、DeepSeek-V3.2、GLM-5(Zhipu AI)为代表,开源模型在推理、代理(agentic)、多模态(文本+图像+视频)、长上下文(128K-10M tokens)和编码/数学基准上已逼近或局部超越闭源前沿模型。MoE架构成为主流,仅激活少量参数即可实现高性能,显著提升效率。开源社区已成为AI创新核心力量。
# 1.2 为什么要关注开源大模型
核心优势依旧显著,但2026年更突出代理能力和多模态:
- 成本可控:闭源API token费用随规模激增;开源模型部署在自有基础设施上,仅硬件成本。MoE模型进一步降低推理开销。
- 数据安全:本地/私有部署,数据不出域,适用于金融、医疗、政府等敏感场景。
- 定制自由:支持LoRA/QLoRA微调、量化(FP8/INT4)、自定义推理流程、代理工具集成,甚至研究内部机制。
- 自主可控:避免API断供风险,支持边缘/离线部署。2026年国际环境下,自主AI能力战略意义更大。
# 1.3 开源大模型生态全景图
生态层次类似但更成熟:
- 基础设施层:GPU(NVIDIA Blackwell/H100等)、CUDA、PyTorch、FlashInfer等加速内核。
- 模型层:权重、配置、分词器、处理器(多模态)。涵盖语言、代码、多模态、代理专精模型。
- 工具层:Transformers、vLLM、SGLang、LMDeploy、Ollama等。
- 应用层:聊天机器人、RAG、代理系统、代码助手、多模态分析等。
# 2. 开源大模型到底开源了什么
# 2.1 开源的三个层次
当我们说“开源大模型”时,实际上存在明显不同的含义。业界更常用 “open-weights”(权重开源) 与 “fully open / true open source” 来区分。理解这一点对于合规使用和研究模型至关重要。
| 名称 | 包含内容 | 特点 | 代表模型 |
|---|---|---|---|
| 纯权重开源 Open Weights Only | • 训练好的模型参数(.safetensors 等) • 模型配置文件(config.json) • 分词器 / 处理器文件 | ✅ 可直接用于推理和部署 ❌ 通常无法轻松微调或复现 ❌ 训练细节完全不透明 | 早期部分闭源转向模型(较少见于主流) |
| 权重 + 推理/微调代码 Open Weights + Code | • 第一层所有内容 • 推理代码(Transformers / vLLM / SGLang 集成) • 微调代码(LoRA 等)和示例脚本 | ✅ 可直接推理、量化部署和基本微调 ✅ 可研究模型架构 ⚠️ 训练数据通常不公开(商业机密 + 法律风险) | Llama 4(Meta) Qwen3.5(Alibaba) Mistral 3 Phi-4(Microsoft) |
| 完全开源 Fully Open Source | • 第二层所有内容 • 完整的训练代码和中间检查点 • 训练数据集(或可复现的数据构建方式) • 训练配方(Training Recipe)、日志和评估方法 | ✅ 可以从零复现模型 ✅ 训练过程高度透明 ✅ 便于学术研究和社区共同改进 | OLMo 3(Allen Institute for AI) BLOOM |
# 2.2 主流模型的开源程度
| 模型 | 权重 | 代码 | 训练数据 | 许可证 |
|---|---|---|---|---|
| Llama 4 | ✅ | ✅ | ❌ | Llama Community License |
| Qwen3.5 | ✅ | ✅ | ❌ | Apache 2.0 |
| Mistral 3 | ✅ | ✅ | ❌ | Apache 2.0 |
| Phi-4 | ✅ | ✅ | ❌(主要合成数据) | MIT |
| OLMo 3 | ✅ | ✅ | ✅ | Apache 2.0 |
| BLOOM | ✅ | ✅ | ✅ | OpenRAIL-M |
# 2.3 许可证详解
# 2.3.1 常见许可证类型
Llama Community License(Meta):
- 允许商业使用,但对月活跃用户超过 700 million(7亿) 的产品需要额外向 Meta 申请许可。
- 通常要求在衍生产品中保留 “Built with Llama” 等声明。
- 注意:部分观点认为此许可证不完全符合 OSI 开源定义。
Apache 2.0(最推荐):
- 高度宽松,允许商业使用、修改、分发。
- 仅需保留版权声明和许可证文本。
- Qwen3.5、Mistral 3、OLMo 3 等均采用此许可。
MIT License:
- 极其宽松,几乎无限制(Phi-4 使用)。
- 适合小模型和研究。
OpenRAIL-M:
- 负责任 AI 许可,禁止部分有害用途。
- BLOOM 等早期模型采用。
# 2.4 为什么大多数模型仍不公开训练数据?
商业竞争:训练数据是核心竞争力,公开相当于暴露“秘方”。
法律风险:数据可能涉及版权、隐私或被诉侵权,公开会放大风险。
成本与治理:清洗海量数据成本极高,且很多公司难以完整披露来源。
实际趋势:即使是 Qwen3.5、Llama 4 等顶级模型,也仅公开部分验证/合成数据,完整预训练数据集仍属少数(OLMo 3 是例外)。
# 2.5 开源的意义
尽管完全公开训练数据的模型仍是少数,开源(尤其是 open-weights)在2026年依然价值巨大:
- 大幅降低AI门槛:开发者、企业可在本地部署、微调和集成先进模型,无需依赖闭源API。
- 促进创新与定制:社区可基于权重进行 LoRA 微调、量化优化、代理构建和多模态扩展。
- 提高透明度与安全性:模型行为可被审计,避免黑箱风险,利于学术研究和企业合规。
- 推动整个行业进步:开源生态加速了从推理优化(vLLM、SGLang)到应用落地的快速发展,让更多人参与 AI 创新。
# 3. Hugging Face 介绍
# 3.1 平台概述
Hugging Face仍是全球最大AI模型平台(2025年底模型数超200万,2026持续增长)。从Transformers库起步,已成为“AI界的GitHub”,活跃开发者数百万,下载量数十亿。
# 3.2 核心产品详解
# 3.2.1 Model Hub
支持托管、版本管理、模型卡片(含基准、多模态示例)、许可协议。模型类型包括:
- 语言/推理模型:Llama 4、Qwen3.5、DeepSeek-V3.2、GLM-5等。
- 多模态:Qwen3.5-VL、Llama 4(原生图像/视频)。
- Embedding、语音、代理专精模型等。
# 3.2.2 Transformers 库
统一API,支持自动设备映射、量化、多模态处理器。2026版增强MoE和长上下文支持。
示例代码(以Qwen3.5小模型为例,适配多模态/Thinking模式):
from transformers import AutoModelForCausalLM, AutoTokenizer, AutoProcessor
model_name = "Qwen/Qwen3.5-0.8B-Instruct" # 或更大MoE变体
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_name, trust_remote_code=True) # 多模态支持
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto",
trust_remote_code=True
)
# 多模态/聊天示例
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain quantum computing with an image example if possible."}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
# 生成(支持thinking模式)
outputs = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.7,
do_sample=True,
# enable_thinking=True # Qwen3.5等支持
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
优势:统一API、丰富预训练模型、全流程工具链(微调、量化、评估)。
# 3.2.3 Datasets 库
支持流式处理大规模数据集,2026增强多模态数据支持。
# 3.2.4 Spaces
免费托管Gradio/Streamlit Demo,支持GPU(含多模态预览)。
# 3. ModelScope 介绍
# 3.1 平台定位
阿里云ModelScope仍是“中国版Hugging Face”,优化中文/国产模型、本土速度和文档。
# 3.2 与 Hugging Face 对比
| 特性 | Hugging Face | ModelScope |
|---|---|---|
| 总部 | 美国 | 中国杭州 |
| 中文/国产模型 | 丰富 | 更丰富 |
| 国内下载速度 | 需镜像加速 | 原生快 |
| 文档 | 英文为主 | 中英文兼顾 |
# 3.3 核心优势
丰富国产模型:Qwen3.5系列、ChatGLM系列(升级为GLM-5)、InternLM、Yi等。Qwen3.5引入原生视觉-语言融合、Thinking/Fast模式、超长上下文。
本土优化:国内CDN、支付宝支付、中文教程。
# 4. 模型文件结构解析
以 Qwen3.5-0.8B 为例进行讲解,这是通义千问3.5系列中参数规模较小的模型(0.8B参数),非常适合学习理解模型文件结构。Qwen3.5是2025年3月发布的最新版本,引入了多项技术创新。
# 4.1 典型模型目录概览
当你从Hugging Face或ModelScope下载一个完整的模型时,会得到一个包含多个文件的目录。我们以Qwen3.5-0.8B为例:
Qwen/Qwen3.5-0.8B/
├── config.json # 模型架构配置
├── model.safetensors # 模型权重(单文件,约1.7GB)
├── tokenizer.json # 分词器完整配置
├── tokenizer_config.json # 分词器参数
├── vocab.json # 词表文件
├── merges.txt # BPE合并规则
├── added_tokens.json # 额外添加的token
├── special_tokens_map.json # 特殊token映射
├── chat_template.jinja # 对话模板(新增)
├── preprocessor_config.json # 视觉预处理配置(新增)
├── video_preprocessor_config.json # 视频预处理配置(新增)
└── README.md # 模型说明文档
2
3
4
5
6
7
8
9
10
11
12
13
Qwen3.5 新增文件:
chat_template.jinja:新的对话模板格式preprocessor_config.json:多模态视觉预处理配置video_preprocessor_config.json:视频预处理配置
理解这些文件的含义对于正确使用模型至关重要。下面我们逐一详解每个文件。
# 4.2 config.json - 模型配置
这是最核心的配置文件,定义了模型的整体架构。Qwen3.5-0.8B 的 config.json 如下:
{
"architectures": [
"Qwen3_5ForConditionalGeneration"
],
"image_token_id": 248056,
"model_type": "qwen3_5",
"text_config": {
"attention_bias": false,
"attention_dropout": 0.0,
"attn_output_gate": true,
"dtype": "bfloat16",
"eos_token_id": 248044,
"full_attention_interval": 4,
"head_dim": 256,
"hidden_act": "silu",
"hidden_size": 1024,
"initializer_range": 0.02,
"intermediate_size": 3584,
"layer_types": [
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention",
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention",
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention",
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention",
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention",
"linear_attention",
"linear_attention",
"linear_attention",
"full_attention"
],
"linear_conv_kernel_dim": 4,
"linear_key_head_dim": 128,
"linear_num_key_heads": 16,
"linear_num_value_heads": 16,
"linear_value_head_dim": 128,
"max_position_embeddings": 262144,
"mlp_only_layers": [],
"model_type": "qwen3_5_text",
"mtp_num_hidden_layers": 1,
"mtp_use_dedicated_embeddings": false,
"num_attention_heads": 8,
"num_hidden_layers": 24,
"num_key_value_heads": 2,
"rms_norm_eps": 1e-06,
"tie_word_embeddings": true,
"use_cache": true,
"vocab_size": 248320,
"mamba_ssm_dtype": "float32",
"rope_parameters": {
"mrope_interleaved": true,
"mrope_section": [
11,
11,
10
],
"rope_type": "default",
"rope_theta": 10000000,
"partial_rotary_factor": 0.25
}
},
"tie_word_embeddings": true,
"transformers_version": "4.57.0.dev0",
"video_token_id": 248057,
"vision_config": {
"deepstack_visual_indexes": [],
"depth": 12,
"hidden_act": "gelu_pytorch_tanh",
"hidden_size": 768,
"in_channels": 3,
"initializer_range": 0.02,
"intermediate_size": 3072,
"model_type": "qwen3_5",
"num_heads": 12,
"num_position_embeddings": 2304,
"out_hidden_size": 1024,
"patch_size": 16,
"spatial_merge_size": 2,
"temporal_patch_size": 2
},
"vision_end_token_id": 248054,
"vision_start_token_id": 248053
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
关键参数详解:
| 参数类别 | 参数名称 | 值 | 含义与说明 |
|---|---|---|---|
| 整体信息 | architectures | Qwen3_5ForConditionalGeneration | 模型主类,支持多模态条件生成 |
| 整体信息 | model_type | qwen3_5 | Qwen3.5 专用模型类型 |
| 整体信息 | transformers_version | 4.57.0.dev0 | 需要较新版本的 Transformers 支持 |
| 整体信息 | tie_word_embeddings | true | 词嵌入与输出层参数共享,节省显存 |
| 文本配置 | num_hidden_layers | 24 | Transformer 总层数 |
| 文本配置 | hidden_size | 1024 | 模型隐藏层维度(较小规模版本) |
| 文本配置 | intermediate_size | 3584 | MLP 中间层维度 |
| 文本配置 | num_attention_heads | 8 | 全注意力层 Query Heads 数量 |
| 文本配置 | num_key_value_heads | 2 | GQA 分组查询注意力,显著减少 KV-Cache |
| 文本配置 | head_dim | 256 | 注意力头维度 |
| 文本配置 | vocab_size | 248320 | 词表大小(较大,支持多模态 token) |
| 文本配置 | max_position_embeddings | 262144 | 最大上下文长度 ≈ 262K tokens(极强) |
| 文本配置 | use_cache | true | 支持 KV-Cache,用于流式生成 |
| 文本配置 | hidden_act | silu | 激活函数 |
| 混合注意力核心 | layer_types | 3×linear_attention + 1×full_attention(重复) | Hybrid Attention 机制(最重要创新) |
| 混合注意力核心 | full_attention_interval | 4 | 每 4 层出现 1 次传统全注意力 |
| 混合注意力核心 | linear_conv_kernel_dim | 4 | 线性注意力卷积核尺寸 |
| RoPE 配置 | rope_theta | 10000000 | 超大 theta,适合超长上下文 |
| RoPE 配置 | mrope_interleaved | true | 支持多模态 RoPE(图像/视频位置编码) |
| RoPE 配置 | mrope_section | [11, 11, 10] | 多模态 RoPE 分段设置 |
| 多模态 Token | image_token_id | 248056 | 图像占位 token |
| 多模态 Token | video_token_id | 248057 | 视频占位 token |
| 多模态 Token | vision_start_token_id | 248053 | 视觉内容开始标记 |
| 多模态 Token | vision_end_token_id | 248054 | 视觉内容结束标记 |
| 视觉配置 | vision_config.depth | 12 | Vision Transformer 层数 |
| 视觉配置 | vision_config.hidden_size | 768 | 视觉编码器隐藏维度 |
| 视觉配置 | vision_config.num_heads | 12 | 视觉注意力头数 |
| 视觉配置 | vision_config.patch_size | 16 | 图像 Patch 大小 |
| 视觉配置 | vision_config.temporal_patch_size | 2 | 视频时间维度 Patch 大小(减少视频 token) |
| 视觉配置 | vision_config.spatial_merge_size | 2 | 空间合并尺寸,降低分辨率 token 数量 |
| 视觉配置 | vision_config.out_hidden_size | 1024 | 视觉特征输出维度(与文本对齐) |
Qwen3.5 核心技术亮点:
| 参数名称 | 值 | 如何理解参数 | 说明 |
|---|---|---|---|
| layer_types | 大部分是 linear_attention,少部分是 full_attention | 模型大部分层用了“轻量模式”,每4层才用一次“完整模式” | 这是 Qwen3.5 最聪明的地方。 轻量模式速度快、吃显存少;完整模式思考更仔细。 两者搭配,让模型又快又聪明,特别适合处理很长的内容。 |
| max_position_embeddings | 262144(约 26 万 tokens) | 模型支持的上下文 | 长上下文能力。 意味着它可以一次性处理很长很长的文章、整本书、长时间视频等,而不会轻易“忘掉”前面内容。 |
| num_key_value_heads | 2 | 模型在记录“记忆”时用了更节省的方式 | 省显存的关键。 长对话或长文章时,模型需要记住很多内容,这个参数让它记住的东西占用的显存大幅减少,跑起来更省资源。 |
| hidden_size | 1024 | 模型的“脑容量”大小 | 决定模型整体大小。 1024 属于中等偏小的脑容量,模型不算特别大,因此部署时相对容易,对显卡要求没那么高。 |
| num_hidden_layers | 24 | 模型一共有 24 层 | 模型的深度。 层数越多通常思考能力越强,24 层属于中等深度,平衡了能力和效率。 |
| mrope_interleaved + mrope_section | 开启多模态位置编码 | 模型能正确理解图片和视频在什么位置 | 让图片和视频更好用。 没有这个,模型很难把图片、视频和文字正确对应起来。 |
| vision_config(视觉部分) | patch_size=16, temporal_patch_size=2 等 | 模型看图片和视频的方式 | 让模型原生支持看图和看视频。 尤其是 temporal_patch_size=2,让视频不会产生太多 token,处理视频更高效。 |
# 4.3 模型权重文件
# 4.3.1 权重格式详解
模型权重是模型最核心的部分,存储了神经网络中所有参数的值。常见的权重格式有:
SafeTensors格式(.safetensors ):
- Hugging Face推出的新格式
- 优点:加载快(无需反序列化整个文件)、内存安全(按需加载)、安全性高
- 强烈推荐使用此格式
PyTorch格式(.bin, .pt):
- 传统的PyTorch模型存储格式
- 优点:兼容性好
- 缺点:文件大,安全性一般
GGUF格式(.gguf):
- 由llama.cpp团队推出
- 专为CPU推理设计
- 支持多种量化精度
- 适合在消费级硬件上运行
# 4.3.2 小参数模型 vs 大参数模型的权重
小参数模型
model.safetensors # 单个文件,约1.7GB
大参数模型
model-00001-of-00002.safetensors # 分片1
model-00002-of-00002.safetensors # 分片2
model.safetensors.index.json # 索引文件
2
3
Git LFS对单个文件大小有限制(通常5GB),因此大模型的权重会被分成多个文件。
model.safetensors.index.json 文件记录了每个分片包含哪些层的权重:
{
"metadata": {
"total_size": 13989145600
},
"weight_map": {
"model.embed_tokens.weight": "model-00001-of-00002.safetensors",
"model.layers.0.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
"model.layers.0.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
...
"model.layers.31.lm_head.weight": "model-00002-of-00002.safetensors"
}
}
2
3
4
5
6
7
8
9
10
11
12
# 4.3.3 权重张量结构
模型权重本质上是一个个多维张量(Tensor)。以Qwen3.5为例,主要包含:
- embedding表:
model.embed_tokens.weight,形状为[151936, 896] - 注意力QKV权重:每个attention层有q_proj、k_proj、v_proj
- Q投影:
[896, 896](14个头 × 64维) - K投影:
[128, 896](2个头 × 64维) - V投影:
[128, 896](2个头 × 64维)
- Q投影:
- 注意力输出权重:
o_proj.weight,形状为[896, 896] - FFN权重:包含gate_proj、up_proj、down_proj
- 层归一化权重:input_layernorm和post_attention_layernorm
- LM Head权重:
lm_head.weight,形状为[151936, 896]
# 4.4 分词器(Tokenizer)相关文件
分词器是将文本转换为模型可以处理的数字序列的关键组件。Qwen3.5使用的是BBPE(Byte-level BPE)分词器,基于SentencePiece框架实现。
# 4.4.1 Qwen分词器的特点
BBPE(Byte-level BPE):
- 基于字节的BPE
- 避免OOV(Out of Vocabulary)问题
- 可以处理任意Unicode字符,包括中文、emoji等
- Qwen系列使用
与LLaMA BPE的区别:
- LLaMA:基于原始UTF-8字节
- Qwen:基于Unicode码点,更适合多语言
# 4.4.2 tokenizer.json
这是分词器的完整配置,包含词表和分词规则。
- 决定了文字是怎么被切成 token 的。
- 里面存着模型认识的所有“单词”(词表)和切词的规则。
- 如果没有这个文件,模型就不知道该怎么把你的中文、英文切成数字。
看具体文件
# 4.4.3 tokenizer_config.json
这个文件包含分词器的运行时配置:
- 告诉 Transformers 库应该怎么使用上面的 tokenizer。
- 比如:对话时要在开头加什么 token?结束时加什么?聊天格式用什么模板?是否要自动加空格清理?
看具体文件
# 4.4.4 vocab.json 和 merges.txt
vocab.json:
- 词表文件,包含所有token到ID的映射
- Qwen3.5有248043个token
merges.txt:
- BPE合并规则
- 定义哪些字节对应该合并为一个token
# 4.4.5 中文和tokens之间的关系
- 很多常用中文词(如“你好”、“今天”、“人工”、"智能")会被整词或较大子词作为一个 Token(效率高)。
- 生僻字或长词可能会被拆成 2~3 个子 Token。
- Qwen3.5 对中文优化较好,平均 1 个 Token ≈ 1.5~1.8 个中文字符(比英文更高效)。
# 4.5 generation_config.json - 生成配置
Qwen3.5不再带有这个配置,让推理层去控制参数
Qwen3有这个配置文件,这个文件定义了模型推理时的默认参数。
{
"bos_token_id": 151643,
"do_sample": true,
"eos_token_id": 151645,
"max_length": 32768,
"max_new_tokens": 2048,
"min_length": 1,
"pad_token_id": 151643,
"repetition_penalty": 1.1,
"temperature": 0.6,
"top_k": 20,
"top_p": 0.95,
"transformers_version": "4.48.0",
"use_cache": true
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
关键参数解释:
| 参数 | 含义 | Qwen3.5-0.8B的默认值 |
|---|---|---|
temperature | 控制随机性,值越大越随机 | 0.6 |
top_k | 限制采样范围到概率最高的k个token | 20 |
top_p | 核采样,累积概率达到p的token | 0.95 |
repetition_penalty | 惩罚重复生成 | 1.1 |
max_new_tokens | 最大生成token数 | 2048 |
max_length | 输入+输出的最大长度 | 32768 |
# 4.6 特殊文件类型
# 4.6.1 Qwen3.5新增文件:chat_template.jinja
Qwen3.5 使用新的 Jinja 格式对话模板:
https://huggingface.co/Qwen/Qwen3.5-0.8B/blob/main/chat_template.jinja
# 4.6.2 多模态模型特有文件
对于视觉语言模型(VLM),还会有额外的配置文件:
// preprocessor_config.json
{
"image_processor": {...}
}
//video_preprocessor_config.json
2
3
4
5
# 5. 显存评估方法
# 5.1 显存消耗的三个主要部分
运行大模型时,GPU显存主要被三个部分占用:
| 模块 | 作用 | 占用特点 | 典型占比(仅参考) | 备注 |
|---|---|---|---|---|
| 📦 模型权重 (Model Weights) | 存储所有神经网络参数 | 固定占用,与模型大小成正比 | 60%–70%(短上下文) | 7B FP16 ≈ 14GB;上下文变长时占比会下降 |
| 📦 KV Cache (键值缓存) | 存储 Attention 的 Key / Value | 随 batch size 和 序列长度 线性增长 | 20%–30%(短上下文) | 长上下文 / 高并发时可达 50%–70%+ |
| 📦 激活值 (Activations) | 前向传播中的临时计算结果 | 推理阶段占用较小 | 5%–10% | 训练时会大幅增加(可达 30%–60%) |
# 5.2 模型权重的显存计算
# 5.2.1 基础公式
模型权重的显存消耗由参数数量和数据类型决定:
显存(GB) = (参数总量 × 精度字节数) / 1024³
精度类型对照表:
| 精度名称 | 数据类型 | 字节数 | 数值范围 | 适用场景 |
|---|---|---|---|---|
| FP32 | float32 | 4 | ±3.4e38 | 训练(高精度) |
| FP16 | float16 | 2 | ±65504 | 推理 / 混合精度训练 |
| BF16 | bfloat16 | 2 | ±3.39e38 | 推理(更稳定,推荐) |
| FP8 | float8 | 1 | 非固定(取决于格式) | 推理加速(H100等) |
| INT8 | int8 | 1 | -128 ~ 127 | 量化推理 |
| INT4 | int4 | 0.5 | -8 ~ 7 | 高压缩量化推理 |
# 5.2.3 常见模型规模的显存需求
| 模型规模 | FP16 (2字节) | BF16 (2字节) | INT8 (1字节) | INT4 (0.5字节) |
|---|---|---|---|---|
| 1B | 1.86 GB | 1.86 GB | 0.93 GB | 0.47 GB |
| 3B | 5.59 GB | 5.59 GB | 2.79 GB | 1.40 GB |
| 7B | 13.04 GB | 13.04 GB | 6.52 GB | 3.26 GB |
| 13B | 24.22 GB | 24.22 GB | 12.11 GB | 6.06 GB |
| 34B | 63.35 GB | 63.35 GB | 31.68 GB | 15.84 GB |
| 70B | 130.39 GB | 130.39 GB | 65.19 GB | 32.60 GB |
| 100B | 186.26 GB | 186.26 GB | 93.13 GB | 46.57 GB |
# 5.3 KV Cache 显存计算
KV Cache是自回归模型推理特有的内存消耗。在生成过程中,每个新token都需要关注之前所有token的Key和Value向量。
# 5.3.1 计算公式
KV Cache显存 ≈ 2 × batch_size × seq_len × num_layers × (head_dim × num_kv_heads) × dtype_bytes
其中:
- head_dim = hidden_size / num_attention_heads
- 2 表示 K 和 V 两个矩阵
2
3
4
5
# 5.3.2 简化估算
对于标准Transformer模型,可以用一个经验公式快速估算:
KV ≈ batch × seq_len × num_layers × hidden_size × (2 × dtype_bytes)
# 5.3.3 具体示例
以LLaMA 2 7B为例:
- num_layers = 32
- hidden_size = 4096
- num_attention_heads = 32
- head_dim = 4096 / 32 = 128
- num_kv_heads = 32
单token的KV Cache:
单token KV = 2 × 32 × 128 × 2 / 1024³ ≈ 0.00049 GB ≈ 0.5 MB
不同上下文长度的KV Cache:
| 上下文长度 | Batch=1 | Batch=4 | Batch=16 |
|---|---|---|---|
| 512 | 0.25 GB | 1 GB | 4 GB |
| 1024 | 0.5 GB | 2 GB | 8 GB |
| 2048 | 1 GB | 4 GB | 16 GB |
| 4096 | 2 GB | 8 GB | 32 GB |
# 5.4 激活值显存
激活值是前向传播过程中产生的临时结果,其大小取决于:
推理阶段:
激活值显存 ≪ KV Cache
通常可以忽略(<10%)
训练阶段:
激活值显存 ≈ batch × seq × hidden × layers × dtype_bytes × 多倍系数
# 5.5 完整推理显存估算
# 5.5.1 综合公式
总显存 = 模型权重 + KV Cache + 激活值(推理时可忽略) + 预留空间
≈ 参数 × dtype
+ batch × seq × layers × hidden × (2 × dtype)
+ 预留(1~3GB)
2
3
4
# 5.5.2 实用估算表
上下文 4K
| 模型 | FP16 | INT8 | INT4 |
|---|---|---|---|
| 7B | 14GB + 1~2GB KV | 8~10GB | 5~7GB |
| 13B | 26GB + 2~4GB KV | 14~18GB | 9~12GB |
| 34B | 68GB + 4~8GB KV | 35~45GB | 18~25GB |
| 70B | 140GB + 8~16GB KV | 70~90GB | 40~60GB |
上下文 128K
| 模型 | FP16 | INT8 | INT4 |
|---|---|---|---|
| 7B | 14GB + ~32~64GB KV 总计 约 50~85GB | 8~10GB + ~16~32GB KV 总计 约 25~45GB | 5~7GB + ~8~16GB KV 总计 约 15~25GB |
| 13B | 26GB + ~64~128GB KV 总计 约 100~160GB | 14~18GB + ~32~64GB KV 总计 约 50~85GB | 9~12GB + ~16~32GB KV 总计 约 30~50GB |
| 34B | 68GB + ~128~256GB KV 总计 约 200~330GB | 35~45GB + ~64~128GB KV 总计 约 100~180GB | 18~25GB + ~32~64GB KV 总计 约 55~95GB |
| 70B | 140GB + ~256~512GB KV 总计 约 400~670GB | 70~90GB + ~128~256GB KV 总计 约 200~350GB | 40~60GB + ~64~128GB KV 总计 约 110~200GB |
Qwen3.5 采用了 混合(Hybrid)注意力机制,在相同上下文长度下,KV Cache 占用显著降低(有时能省 50%~80% 以上。
#
# 6. 本地部署方案:vLLM
# 6.1 vLLM 简介
vLLM 是目前最主流的高吞吐量大模型推理引擎,由加州大学伯克利分校开发并持续维护(2026年已迭代至 v0.18.x 版本)。
其核心创新包括:
- PagedAttention(分页注意力):将 KV Cache 像操作系统内存分页一样管理,避免内存碎片,大幅提升显存利用率(通常提升 2-4 倍)。
- Continuous Batching(连续批处理):动态添加请求,无需等待整个批次完成,大幅提高并发吞吐量。
- CUDA Graph + FlashInfer 内核优化:减少内核启动开销,进一步加速推理。
2026年重要支持:
- 原生 MoE 模型(Qwen3.5-MoE、DeepSeek、Llama 4 等)
- 多模态模型(图像 + 文本、视频、音频,支持 Qwen3.5-VL、Llama 4 等)
- 结构化输出(JSON 模式、工具调用)
- Multi-LoRA(同时服务多个微调适配器,尤其适合 MoE 模型)
优势:生态成熟、模型支持最广泛、生产环境稳定、跨硬件支持较好(NVIDIA / AMD ROCm 等)。
# 6.2 安装与启动
基础安装:
pip install vllm
命令行启动 OpenAI 兼容 API 服务:
vllm serve Qwen/Qwen3.5-0.8B-Instruct \
--dtype auto \ # 自动选择 BF16/FP16
--max-model-len 262144 \ # 支持 Qwen3.5 的 262K 上下文
--gpu-memory-utilization 0.9 \ # 显存利用率,建议 0.85~0.95
--port 8000 \
--quantization awq \ # 常用量化:awq / gptq / fp8
--enable-prefix-caching # 开启前缀缓存(2026新增增强)
2
3
4
5
6
7
常用参数说明:
- --dtype auto:推荐,自动使用 BF16(更稳定)或 FP16。
- --quantization fp8:2026年新卡(H100/Blackwell/RTX 50系列)强烈推荐,质量接近 BF16,速度和显存都有明显优势。
- --tensor-parallel-size 2:多 GPU 张量并行。
- --max-num-seqs 256:最大并发请求数。
Python API 使用示例(支持多模态):
Python
from vllm import LLM, SamplingParams
from vllm.multimodal import MultiModalData
llm = LLM(
model="Qwen/Qwen3.5-0.8B-Instruct",
dtype="auto",
max_model_len=262144,
gpu_memory_utilization=0.9,
quantization="awq", # 或 "fp8"
trust_remote_code=True
)
sampling_params = SamplingParams(temperature=0.7, max_tokens=512)
# 多模态输入示例
prompts = [{
"prompt": "描述这张图片的内容",
"multi_modal_data": {"image": "https://example.com/image.jpg"} # 或本地路径
}]
outputs = llm.generate(prompts, sampling_params)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
多 GPU 部署:支持 tensor-parallel-size(张量并行)和 pipeline-parallel-size(流水线并行)。
量化支持:AWQ、GPTQ、FP8(W8A8)、SqueezeLLM 等。