- Authors

- Name
- Youngju Kim
- @fjvbn20031
目录
- 为什么选择开源 LLM?
- 主要模型家族
- 模型架构深入剖析
- 本地推理工具
- 用 vLLM 做生产级服务
- 用 LoRA 与 QLoRA 做微调
- Hugging Face 生态
- 量化技术
- 选对模型
- 开源 vs 闭源:何时用什么
1. 为什么选择开源 LLM?
1.1 为什么要用开放模型
几年前,GPT-4、Claude 这类闭源模型在质量上还占绝对优势。但这个差距正在急剧缩小。到 2025~2026 年,最顶尖的开源模型在大多数基准测试上已经能与闭源模型分庭抗礼,在部分专业领域甚至反超。
选择开源 LLM 的理由:
| 理由 | 说明 |
|---|---|
| 数据隐私 | 数据不会离开自己的基础设施 |
| 大规模成本 | 没有按 token 计费;GPU 成本可分摊 |
| 可定制性 | 可用自有领域数据做微调 |
| 合规要求 | 医疗、金融、法律领域常有本地部署的要求 |
| 延迟可控 | 可将模型与应用部署在同一基础设施上 |
| 摆脱厂商锁定 | 无需改动 API 即可切换模型 |
| 研究与透明性 | 可直接检视权重、架构与训练数据 |
1.2 定义:Open vs Open-Weight vs 真正的开源
在 LLM 社区里,"开源"这个词的用法相当宽松。
- 真正的开源:权重、训练代码、训练数据全部公开的模型(例:OLMo、Pythia)
- 开放权重(Open-Weight):权重可下载,但训练数据或代码不公开的模型(例:Llama 3、Mistral、Gemma)
- 有限制的开放权重:权重公开,但使用目的受到限制的模型(例:Llama 的社区许可证将大型商业提供商排除在外)
大多数所谓"开源"模型实际上是开放权重模型。在法律和研究层面,这个区分很重要。
2. 主要模型家族
2.1 Meta Llama
Llama 系列是 Meta AI 公开的最具统治力的开放权重模型系列。
Llama 3.1 / 3.2 / 3.3(2024~2025)
| 模型 | 参数量 | 上下文 | 备注 |
|---|---|---|---|
| Llama 3.1 8B | 8B | 128K | 小型模型中的最佳选择 |
| Llama 3.1 70B | 70B | 128K | 在多种任务上可与 GPT-4o 匹敌 |
| Llama 3.1 405B | 405B | 128K | 最大规模,接近前沿水准的品质 |
| Llama 3.2 1B / 3B | 1B、3B | 128K | 边缘端部署,多模态 |
| Llama 3.2 11B / 90B | 11B、90B | 128K | 视觉-语言模型 |
| Llama 3.3 70B | 70B | 128K | 相较 3.1 70B 有所改进 |
核心优势:强大的推理能力、代码能力、多语言支持(8 种语言)。70B 模型在大多数应用中都是值得信赖的选择。
许可证:Llama 社区许可证 — 在大多数使用场景下免费。月活跃用户超过 7 亿的产品需要获得 Meta 批准。
2.2 Mistral AI
Mistral 推出的高效模型,以更少的参数量实现出色的性能。
| 模型 | 参数量 | 备注 |
|---|---|---|
| Mistral 7B v0.3 | 7B | 初代高效模型,经过指令微调 |
| Mistral NeMo 12B | 12B | 与 NVIDIA 合作,编程能力突出 |
| Mistral Small 3 | 24B | 高效的商用级模型 |
| Codestral | 22B | 代码专用,支持 80 余种语言 |
| Mixtral 8x7B | 56B(激活 12.9B) | 混合专家模型,推理速度快 |
| Mixtral 8x22B | 141B(激活 39B) | 最强的 MoE 通用模型 |
许可证:基础模型采用 Apache 2.0(宽松,对商业友好)。
Mistral 的核心创新:混合专家(Mixture of Experts, MoE) 架构在每个 token 只激活部分参数,能以 7B 活跃参数的推理成本,逼近 70B 模型的品质。
2.3 Google Gemma
Gemma 是 Google 基于 Gemini 技术推出的开放权重模型系列。
| 模型 | 参数量 | 备注 |
|---|---|---|
| Gemma 2 2B | 2B | 2B 级别中的最佳选择 |
| Gemma 2 9B | 9B | 在多项基准测试上超过 Llama 3.1 8B |
| Gemma 2 27B | 27B | 强大且高效的 27B 模型 |
| CodeGemma 7B | 7B | 代码专用 |
| PaliGemma | 3B | 视觉-语言模型 |
许可证:Gemma 使用条款 — 宽松,但不是 Apache 2.0。允许商业使用。
2.4 Qwen(阿里巴巴)
阿里云的 Qwen 系列已经成为顶级的开放权重家族之一。
| 模型 | 参数量 | 备注 |
|---|---|---|
| Qwen2.5 0.5B~72B | 多种规格 | 强大的多语言支持(中文/英文) |
| Qwen2.5-Coder 7B~32B | 7B、32B | 出色的代码生成能力 |
| Qwen2.5-Math 7B~72B | 7B、72B | 数学推理 |
| QwQ 32B | 32B | 推理模型,o1 风格的思维链 |
| Qwen2-VL | 7B、72B | 强大的视觉-语言能力 |
许可证:大多数模型采用 Apache 2.0。
Qwen 模型在中文任务和多语言应用中格外突出。
2.5 DeepSeek
DeepSeek 用高效的训练方式,交出了令人惊叹的模型。
| 模型 | 参数量 | 备注 |
|---|---|---|
| DeepSeek-V2 | 236B MoE(激活 21B) | 推理成本极其划算 |
| DeepSeek-V3 | 671B MoE(激活 37B) | 接近 GPT-4 的品质,开放权重 |
| DeepSeek-R1 | 多种规格 | 展示思考过程的推理模型 |
| DeepSeek-Coder-V2 | 236B MoE | 强大的代码生成能力 |
许可证:DeepSeek 模型许可证 — 对大多数商业用途宽松。
DeepSeek 的核心成就:以远低于竞争对手的算力成本,训练出前沿级品质的模型。
2.6 其他值得关注的模型
| 模型 | 组织 | 优势 |
|---|---|---|
| Phi-3 / Phi-4 | Microsoft | 在小尺寸(3.8B~14B)上表现强劲 |
| Command R+ | Cohere | 检索增强类任务 |
| Falcon 180B | TII | 大型开放模型 |
| Yi 34B | 01.AI | 强大的多语言能力 |
| Orca 3 | Microsoft | 指令遵循 |
| SOLAR 10.7B | Upstage | 韩语/英语双语 |
3. 模型架构深入剖析
3.1 分组查询注意力(Grouped Query Attention, GQA)
大多数现代 LLM 用 GQA 取代了标准的多头注意力(MHA)。GQA 通过对查询分组、共享键值头,在不明显损失品质的前提下大幅降低 KV 缓存内存占用。
Multi-Head Attention (MHA):
Q heads: 32 K heads: 32 V heads: 32
KV cache: 2 × 32 × seq_len × d_head
Grouped Query Attention (GQA):
Q heads: 32 K heads: 8 V heads: 8
KV cache: 2 × 8 × seq_len × d_head (4× 减少!)
Multi-Query Attention (MQA):
Q heads: 32 K heads: 1 V heads: 1
KV cache: 2 × 1 × seq_len × d_head (32× 减少,有一定品质损失)
3.2 旋转位置编码(Rotary Position Embeddings, RoPE)
RoPE 不是把位置嵌入加到 token 嵌入上,而是通过旋转变换,把位置信息编码进查询、键向量中。主要优点:
- 可以外推到训练时未见过的更长序列
- 高效的相对位置计算
- 可通过 YaRN、LongRoPE 扩展到极长的上下文
3.3 混合专家(Mixture of Experts, MoE)
MoE 用多个"专家"网络取代密集的前馈层,由路由器为每个 token 只挑选其中一部分。
# MoE 层的概念示意(简化版)
class MoELayer:
def __init__(self, num_experts=8, top_k=2, d_model=4096, d_ff=14336):
self.experts = [FeedForward(d_model, d_ff) for _ in range(num_experts)]
self.router = nn.Linear(d_model, num_experts)
self.top_k = top_k # 每个 token 只激活 top_k 个专家
def forward(self, x):
# 路由器选出 top-k 个专家
logits = self.router(x)
weights, indices = logits.topk(self.top_k)
weights = F.softmax(weights, dim=-1)
# 对被选中专家的输出做加权求和
output = sum(
weights[:, i] * self.experts[indices[:, i]](x)
for i in range(self.top_k)
)
return output
Mixtral 8x7B 每层拥有 8 个专家,每个 token 激活其中 2 个。总参数量达到 56B,但推理时的活跃参数只有约 12.9B——比一个 56B 的密集模型快得多。
3.4 KV 缓存与上下文长度
KV(键-值)缓存保存此前 token 的注意力键、值,让自回归生成时不必重新计算整个序列。
KV 缓存内存占用:
KV cache size = 2 × num_layers × num_kv_heads × head_dim × seq_len × dtype_bytes
示例:Llama 3.1 8B,fp16,128K 上下文
= 2 × 32 × 8 × 128 × 131072 × 2 bytes
= 约 17.2 GB(仅 KV 缓存)
这正是长上下文请求会消耗大量内存的原因,也是量化 KV 缓存、滑动窗口注意力如此重要的原因。
4. 本地推理工具
4.1 Ollama
Ollama 是在本地运行 LLM 最简单的方式。一条命令就能下载并运行模型。
# 安装(macOS/Linux)
curl -fsSL https://ollama.com/install.sh | sh
# 交互式运行模型
ollama run llama3.1:8b
# 运行特定量化版本
ollama run llama3.1:70b-instruct-q4_K_M
# 仅下载不运行
ollama pull mistral:7b
# 列出已安装的模型
ollama list
# 作为 API 服务器运行(兼容 OpenAI!)
ollama serve # 在 localhost:11434 启动
Ollama 提供兼容 OpenAI 的 API,因此可以直接使用 OpenAI SDK:
from openai import OpenAI
# 连接本地 Ollama
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # 必填,但会被忽略
)
response = client.chat.completions.create(
model="llama3.1:8b",
messages=[{"role": "user", "content": "简单说明一下 Transformer。"}]
)
print(response.choices[0].message.content)
4.2 llama.cpp
llama.cpp 是用于 GGUF 量化模型的 C++ 推理引擎。它可以运行在 CPU、GPU 或两者之上,同时也是 Ollama 底层的推理引擎。
# 构建
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build -DLLAMA_CUDA=ON # 支持 CUDA GPU
cmake --build build --config Release -j
# 下载 GGUF 模型(示例)
# 来自 Hugging Face:bartowski/Meta-Llama-3.1-8B-Instruct-GGUF
# 运行推理
./build/bin/llama-cli \
-m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf \
-n 512 \
--prompt "说明一下 Transformer 中的注意力机制。"
# 作为兼容 OpenAI 的服务器运行
./build/bin/llama-server \
-m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-ngl 35 # 加载到 GPU 上的层数
4.3 Transformers(Hugging Face)
Hugging Face 的 transformers 库是在 Python 中运行模型最灵活的方式:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto", # 自动分散到可用 GPU 上
)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "什么是 Transformer 架构?"}
]
input_ids = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
with torch.no_grad():
outputs = model.generate(
input_ids,
max_new_tokens=512,
temperature=0.7,
do_sample=True,
pad_token_id=tokenizer.eos_token_id,
)
response = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
print(response)
4.4 本地推理工具对比
| 工具 | 最适合场景 | 是否需要 GPU | 上手难度 | 性能 |
|---|---|---|---|---|
| Ollama | 开发者、快速上手 | 不需要(CPU 也可) | 非常简单 | 良好 |
| llama.cpp | CPU 推理、embedding | 可选 | 中等 | 优秀 |
| Transformers | 研究、自定义代码 | 建议使用 | 简单~中等 | 良好 |
| vLLM | 生产级服务 | 需要 | 中等 | 优秀 |
| TGI | 生产级服务 | 需要 | 中等 | 优秀 |
| ExLlamaV2 | 高吞吐量 GPU 场景 | 需要 | 中等~困难 | 优秀 |
5. 用 vLLM 做生产级服务
5.1 为什么选 vLLM?
vLLM 是面向生产场景的领先开源 LLM 服务引擎。其核心创新:
- PagedAttention:像操作系统虚拟内存一样管理 KV 缓存,大幅提升吞吐量。
- 连续批处理(Continuous Batching):动态地把新请求加入正在运行的批次,最大化 GPU 利用率。
- 张量并行:把模型无缝拆分到多个 GPU 上。
- 兼容 OpenAI 的 API:可直接替换 OpenAI API。
5.2 启动 vLLM 服务器
# 安装
pip install vllm
# 启动服务器(单 GPU)
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--dtype bfloat16 \
--max-model-len 32768 \
--port 8000
# 用张量并行做多 GPU(4 块 GPU)
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3.1-70B-Instruct \
--dtype bfloat16 \
--tensor-parallel-size 4 \
--max-model-len 32768 \
--port 8000
# 应用量化(AWQ)
python -m vllm.entrypoints.openai.api_server \
--model TheBloke/Llama-3-70B-Instruct-AWQ \
--quantization awq \
--dtype float16 \
--tensor-parallel-size 2
5.3 使用 vLLM 服务器
vLLM 提供兼容 OpenAI 的 API,因此客户端代码完全一致:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-8B-Instruct",
messages=[{"role": "user", "content": "什么是 PagedAttention?"}],
max_tokens=256,
temperature=0.7,
)
print(response.choices[0].message.content)
# 流式输出
with client.chat.completions.stream(
model="meta-llama/Meta-Llama-3.1-8B-Instruct",
messages=[{"role": "user", "content": "详细说明一下 RAG。"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
5.4 在 Docker 中运行 vLLM
# Dockerfile
FROM vllm/vllm-openai:latest
ENV HUGGING_FACE_HUB_TOKEN=""
CMD ["--model", "meta-llama/Meta-Llama-3.1-8B-Instruct", \
"--dtype", "bfloat16", \
"--max-model-len", "16384"]
docker run --gpus all \
-p 8000:8000 \
-e HUGGING_FACE_HUB_TOKEN=hf_xxx \
-v ~/.cache/huggingface:/root/.cache/huggingface \
my-vllm-server
6. 用 LoRA 与 QLoRA 做微调
6.1 什么时候需要微调
微调并不总是必要的。先尝试提示词工程和 RAG。以下情况可以考虑微调:
- 需要一种很难通过提示词诱导出来的特定输出格式
- 领域中存在基础模型没能充分体现的术语或惯例
- 延迟很关键,希望把指令内化进模型权重
- 拥有数千个高质量样本,希望获得一致的行为
6.2 LoRA:低秩适配(Low-Rank Adaptation)
LoRA 冻结预训练模型权重,在每个注意力层中加入小规模的可训练矩阵(适配器)。可训练参数量减少 1000 倍以上。
from peft import LoraConfig, get_peft_model, TaskType
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
# LoRA 配置
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # 适配矩阵的秩
lora_alpha=32, # 缩放因子
lora_dropout=0.05,
target_modules=[ # 要适配的层
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
],
bias="none",
)
peft_model = get_peft_model(model, lora_config)
peft_model.print_trainable_parameters()
# trainable params: 83,886,080 || all params: 8,114,474,240 || trainable%: 1.03%
6.3 QLoRA:量化版 LoRA
QLoRA 把 4 比特量化与 LoRA 结合,让单块 A100 GPU 就能微调 70B 模型:
from transformers import BitsAndBytesConfig
from peft import prepare_model_for_kbit_training
# 4 比特量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto"
)
# 为 k 比特训练做准备(将层归一化转为 fp32 等)
model = prepare_model_for_kbit_training(model)
# 在量化后的模型上应用 LoRA
peft_model = get_peft_model(model, lora_config)
6.4 用 SFTTrainer 做全量微调
from trl import SFTTrainer, SFTConfig
from datasets import load_dataset
dataset = load_dataset("your-org/your-dataset", split="train")
def format_example(example):
return {
"text": f"<|user|>\n{example['instruction']}\n<|assistant|>\n{example['output']}"
}
dataset = dataset.map(format_example)
trainer = SFTTrainer(
model=peft_model,
tokenizer=tokenizer,
train_dataset=dataset,
args=SFTConfig(
output_dir="./checkpoints",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_ratio=0.03,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
save_steps=100,
dataset_text_field="text",
max_seq_length=2048,
),
)
trainer.train()
trainer.model.save_pretrained("./fine-tuned-model")
6.5 把 LoRA 适配器合并回基础模型
from peft import PeftModel
# 加载基础模型
base_model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="cpu"
)
# 加载并合并 LoRA 权重
model = PeftModel.from_pretrained(base_model, "./fine-tuned-model")
merged_model = model.merge_and_unload()
# 保存合并后的模型(标准 HF 格式,可配合 vLLM 等使用)
merged_model.save_pretrained("./merged-model")
tokenizer.save_pretrained("./merged-model")
7. Hugging Face 生态
7.1 Hub:探索模型
Hugging Face Hub 托管了 80 万个以上的模型。几个关键的查找技巧:
from huggingface_hub import list_models, model_info
# 搜索模型
models = list_models(
filter="text-generation",
sort="downloads",
direction=-1,
limit=10
)
for m in models:
print(m.id, m.downloads)
# 查看模型信息
info = model_info("meta-llama/Meta-Llama-3.1-8B-Instruct")
print(info.tags)
print(info.cardData)
7.2 模型卡与许可证
在生产环境中使用模型之前,务必先阅读模型卡。需要确认的内容:
- 许可证类型(Apache 2.0、Llama 社区许可证、MIT、自定义)
- 预期用途,以及超出范围的用途
- 已知的偏见与局限性
- 评测结果
7.3 GGUF 模型仓库
面向 llama.cpp / Ollama,可以找可信量化提供者发布的 GGUF 模型:
- bartowski — 高质量 GGUF 模型,提供多种量化档位
- TheBloke — 目录规模庞大,目前维护活跃度有所下降
- lmstudio-community — 面向 LM Studio 精选的模型
GGUF 命名规则:
Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf
│ │
└─ 模型名 └─ 量化方式
常见的量化后缀:
Q4_K_M - 4 比特,品质/速度的均衡选择(多数场景下推荐)
Q5_K_M - 5 比特,品质更高,占用更多内存
Q6_K - 6 比特,接近无损,内存占用较高
Q8_0 - 8 比特,几乎无损
Q2_K - 2 比特,品质很低,内存占用极小
IQ4_XS - 4 比特"重要性量化",品质优于 Q4_K_M
7.4 Spaces:在浏览器中运行模型
通过 Hugging Face Spaces,可以在下载前先体验模型:
# 通过 API 调用 Space
from gradio_client import Client
client = Client("meta-llama/Llama-3.1-8B-Instruct")
result = client.predict(
message="说明一下 Transformer 的注意力机制",
api_name="/chat"
)
print(result)
8. 量化技术
8.1 为什么要量化
用 bfloat16 运行 Llama 3.1 70B 需要约 140GB 的 GPU 内存——单张消费级 GPU 根本无法承载。量化以轻微的品质损失为代价,减少内存占用并加快推理速度。
Llama 3.1 70B 的内存对比:
| 精度 | 内存 | 品质 | 使用场景 |
|---|---|---|---|
| bfloat16 | 约 140GB | 基准 | 多卡 A100 |
| int8 | 约 70GB | -0.1% | 1 张 A100 80GB |
| Q4_K_M(GGUF) | 约 43GB | -0.5% | 2 张 24GB 消费级 GPU |
| int4(AWQ/GPTQ) | 约 35GB | -1.0% | 1 张 A100 40GB |
| Q2_K | 约 24GB | -5%+ | 不建议用于生产环境 |
8.2 GPTQ:训练后量化
from transformers import AutoModelForCausalLM, GPTQConfig
# 一次性量化(需要校准数据)
quantization_config = GPTQConfig(
bits=4,
dataset="c4",
block_size=128
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3.1-8B-Instruct",
quantization_config=quantization_config,
device_map="auto"
)
model.save_pretrained("./llama-3.1-8b-gptq")
8.3 AWQ:感知激活的权重量化
在准确率上,AWQ 通常比 GPTQ 更受青睐:
# 安装
pip install autoawq
# 量化
python -c "
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = 'meta-llama/Meta-Llama-3.1-8B-Instruct'
quant_path = './llama-3.1-8b-awq'
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
quant_config = {'zero_point': True, 'q_group_size': 128, 'w_bit': 4, 'version': 'GEMM'}
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
print('量化完成')
"
8.4 用 bitsandbytes(BnB)做训练时量化
对于微调场景(尤其是 QLoRA),bitsandbytes 提供无需单独量化步骤的运行时量化:
# 已在上面的 QLoRA 小节中展示
# 使用 load_in_4bit=True 的 BitsAndBytesConfig
# NF4 量化最适合 QLoRA 微调
9. 选对模型
9.1 决策框架
┌──────────────────────┐
│ 你的任务是? │
└──────────┬───────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
代码生成 多语言处理 通用对话
│ │ │
Qwen2.5-Coder Qwen2.5 / Llama Llama 3.1 8B
DeepSeek-Coder / Mistral NeMo Mistral 7B
CodeGemma Gemma 2 9B
│
▼
是否需要
本地运行?
│
┌─────┴─────┐
│是 │否
▼ ▼
内存够吗? 使用 vLLM
│ + Llama 70B
┌─┴──┐ 或 405B
│ │
<=8GB >8GB
│ │
8B 70B
Q4 Q4_K_M
9.2 硬件要求
| 模型 | 最低 GPU 内存 | 建议配置 | 量化方式 |
|---|---|---|---|
| Gemma 2 2B | 3GB | RTX 3060 | fp16 |
| Llama 3.1 8B | 5GB | RTX 3060 12GB | Q4_K_M |
| Mistral 7B | 5GB | RTX 3060 12GB | Q4_K_M |
| Gemma 2 27B | 16GB | RTX 3090 | Q4_K_M |
| Llama 3.1 70B | 40GB | 2 张 A6000 | Q4_K_M |
| Mixtral 8x7B | 26GB | A100 40GB | Q4_K_M |
| Llama 3.1 405B | 200GB | 4 张 A100 80GB | Q4_K_M |
9.3 基于基准测试的选型(2026 年 3 月)
选择生产模型时,可把 LMSYS Chatbot Arena 和 Open LLM Leaderboard 当作起点,但一定要自己跑领域内的评测。每有新模型发布,基准排名就会变化。
大致的指引:
- 最佳小型模型(8B 以下):Llama 3.1 8B 或 Gemma 2 9B
- 最佳中型模型(7B~30B):Llama 3.3 70B 或 Mistral Small 3
- 最佳开放权重整体表现:DeepSeek-V3 或 Llama 3.1 405B
- 最佳代码模型:Qwen2.5-Coder 32B 或 DeepSeek-Coder-V2
- 最佳推理模型:QwQ 32B 或 DeepSeek-R1
10. 开源 vs 闭源:何时用什么
10.1 正面对比
| 维度 | 开源 | 闭源 |
|---|---|---|
| 品质上限 | 略低(2026 年差距已经很小) | 在前沿任务上更高 |
| 大规模成本 | 低(只需承担硬件成本) | 按 token 计费,成本较高 |
| 数据隐私 | 完全掌控 | 数据会离开自己的基础设施 |
| 部署复杂度 | 高 | 低(只需 API key) |
| 可定制性 | 完整(微调、提示词) | 有限(提示词,部分微调) |
| 可靠性 | 自行负责 | 由服务商提供 SLA |
| 延迟 | 取决于自有基础设施 | 不固定(共享资源) |
| 上下文窗口 | 最长 128K+ | 最长 200K+ |
| 多模态 | 有限(最强模型多为纯文本) | 强大(GPT-4o、Claude 3.5) |
10.2 什么时候该选开源
强烈建议选开源的情况:
- 处理敏感数据(医疗、法律、金融、个人信息)
- 大规模、成本敏感型应用(日均超过 100 万 token)
- 合规要求数据留在本地
- 需要针对特定领域做微调
- 想要避免厂商锁定
强烈建议选闭源的情况:
- 开箱即用的最高品质至关重要
- 需要最新的多模态能力
- 团队缺乏 MLOps 经验
- 需要快速做原型(API 上手更快)
- 任务需要极长的上下文(超过 128K token)
10.3 混合策略
许多生产系统会把两者结合起来使用:
def route_request(request: dict) -> str:
"""根据需求把请求路由到开源或闭源模型。"""
# 敏感数据始终使用开源
if request.get("contains_pii") or request.get("confidential"):
return "local_llama_70b"
# 大规模的简单任务使用开源
if request.get("task_type") in ["classification", "extraction", "summarization"]:
if request.get("volume") == "high":
return "local_llama_8b"
# 复杂推理或多模态使用闭源
if request.get("requires_vision") or request.get("complexity") == "high":
return "gpt_4o"
# 默认:为控制成本使用本地模型
return "local_llama_70b"
总结
2026 年的开源 LLM 生态提供了前所未有的能力水准:
| 层级 | 最佳选择 |
|---|---|
| 小型模型(8B 以下) | Llama 3.1 8B、Gemma 2 9B、Phi-4 |
| 中型(8B~30B) | Mistral Small 3、Qwen2.5 32B、Gemma 2 27B |
| 大型(70B+) | Llama 3.1 70B、Qwen2.5 72B |
| 前沿 | DeepSeek-V3、Llama 3.1 405B |
| 代码 | Qwen2.5-Coder 32B、DeepSeek-Coder-V2 |
| 推理 | DeepSeek-R1、QwQ 32B |
| 本地推理 | Ollama、llama.cpp |
| 生产级服务 | vLLM、TGI |
| 微调 | LoRA + SFTTrainer、QLoRA |
从 2024 年到 2026 年,最重要的变化是与闭源模型的品质差距被大幅拉近。在 RAG、聊天机器人、代码生成、信息抽取等大多数应用场景中,最顶尖的开源模型已经足以和 GPT-4 或 Claude 一较高下。隐私、成本、可定制性——选择开源的理由,比以往任何时候都更充分。
知识检验测验
Q1. "开放权重"模型和"真正的开源"模型有什么区别?
开放权重模型公开了模型权重,但不公开训练数据、训练代码或完整的训练方法(例:Llama 3、Mistral、Gemma)。真正的开源模型将权重、训练代码、训练数据全部公开(例:OLMo、Pythia)。这个区分在可复现性、研究,以及理解数据污染方面都很重要。
Q2. 什么是混合专家(MoE)?它对推理效率有什么影响?
MoE 用多个"专家"子网络取代密集的前馈层,路由器每次只为每个 token 挑选其中少数几个(例如 8 个里挑 2 个)。这意味着模型可以拥有比同等推理成本的密集模型多得多的总参数量。例如 Mixtral 8x7B 总参数量为 56B,但每个 token 的活跃参数只有约 12.9B,能以约 13B 的推理成本,获得接近 70B 水准的品质。
Q3. 什么是 QLoRA?它解决了什么硬件限制?
QLoRA 把 4 比特量化(通过 bitsandbytes 的 NF4)与 LoRA 适配器结合起来。基础模型被量化为 4 比特,内存占用降低 4 倍,而可训练的 LoRA 适配器仍保持较高精度。这使得在单张 80GB A100 GPU 上微调 70B 模型成为可能——若采用全精度微调,仅模型与优化器状态就需要约 280GB,根本无法实现。
Q4. vLLM 的 PagedAttention 是什么?它解决了什么问题?
PagedAttention 借鉴操作系统虚拟内存管理中的分页机制来管理 KV 缓存。传统的 LLM 服务器会为每个请求按最大长度预先分配固定的内存块,当序列比最大长度短时就会造成内存浪费。PagedAttention 按需以小页为单位分配内存,并且可以在请求之间共享页面,从而大幅提高 GPU 内存利用率,在相同硬件上实现更高的吞吐量。