第十二章:推理与部署
学习目标
- 理解推理(Inference)的基本概念及其与训练的区别
- 掌握模型压缩三大技术:量化、剪枝、知识蒸馏
- 了解KV Cache、Flash Attention、批处理推理等推理优化技术
- 认识主流推理框架(vLLM、TensorRT-LLM、ONNX Runtime、llama.cpp)
- 能够使用llama.cpp本地运行模型和使用vLLM部署API服务
前置要求
建议先学习第七章:训练,了解模型训练的基本流程和概念,以便更好地理解推理与训练的区别和联系。
什么是推理(Inference)?
推理(Inference)是指将训练好的模型用于实际预测的过程。训练阶段模型不断学习参数,而推理阶段则利用已学到的参数对新数据进行预测或生成。
简单理解
训练就像学生上课学习知识,推理就像考试时运用学到的知识来答题。训练需要大量时间和算力,推理则需要快速、高效地给出结果。
推理 vs 训练对比
| 维度 | 训练(Training) | 推理(Inference) |
|---|---|---|
| 目标 | 学习模型参数(权重和偏置) | 使用已学参数进行预测/生成 |
| 数据 | 需要大量标注数据 | 只需要输入数据(无需标注) |
| 计算量 | 非常大(前向+反向传播) | 较小(仅前向传播) |
| 频率 | 一次性(或定期更新) | 频繁(每次用户请求) |
| 关键指标 | 损失值、准确率 | 延迟(Latency)、吞吐量(Throughput) |
| 典型耗时 | 数小时到数周 | 毫秒到秒级 |
推理的关键指标
| 指标 | 说明 | 单位 |
|---|---|---|
| 首Token延迟(TTFT) | 从发送请求到生成第一个Token的时间 | 毫秒(ms) |
| Token生成速度 | 每秒生成的Token数量 | tokens/s |
| 吞吐量 | 单位时间内处理的请求数量 | requests/s |
| 显存占用 | 推理过程中GPU显存的使用量 | GB |
常见的部署方式
| 部署方式 | 说明 | 适用场景 |
|---|---|---|
| 云端部署 | 在云服务器(AWS、Azure、阿里云等)上部署模型 | 高并发、需要弹性伸缩的生产环境 |
| 本地部署 | 在本地电脑或服务器上运行模型 | 数据隐私要求高、离线使用场景 |
| 边缘部署 | 在手机、IoT设备等终端上运行模型 | 实时性要求高、带宽受限场景 |
| API服务 | 通过HTTP API调用远程模型 | 快速集成、无需管理基础设施 |
模型压缩技术
1. 量化(Quantization)
量化是将模型参数从高精度数值格式转换为低精度格式的过程,从而减少模型大小和计算量。
| 精度格式 | 位数 | 模型大小(相对) | 精度损失 | 推理速度 | 适用场景 |
|---|---|---|---|---|---|
| FP32 | 32位浮点 | 100%(基准) | 无 | 基准 | 训练、高精度推理 |
| FP16 | 16位浮点 | ~50% | 极小 | ~2x加速 | GPU推理(推荐) |
| INT8 | 8位整数 | ~25% | 较小 | ~4x加速 | 生产部署、移动端 |
| INT4 | 4位整数 | ~12.5% | 中等 | ~8x加速 | 极端资源受限场景 |
案例:Llama-2-70B量化
Llama-2-70B原始模型(FP32)需要约 140GB 显存,几乎无法在单卡GPU上运行。通过INT4量化后,模型大小降至约 35-40GB,可以在两张24GB的A100或四张RTX 4090上运行,使得大模型的本地部署成为可能。
2. 剪枝(Pruning)
剪枝是移除模型中不重要的参数或神经元,使模型变得更轻量。就像修剪树枝一样,去掉不重要的部分,保留核心结构。
剪枝的主要方法:
- 非结构化剪枝:移除单个权重参数(稀疏化),需要特殊硬件/软件支持才能加速
- 结构化剪枝:移除整个通道或层,可以直接加速推理,兼容性好
- 迭代剪枝:训练→剪枝→微调→再剪枝,逐步减少模型参数
3. 知识蒸馏(Knowledge Distillation)
知识蒸馏是将大模型(教师模型)的知识转移到小模型(学生模型)的技术,让学生模型在保持较小体积的同时获得接近教师模型的性能。
教师模型与学生模型
教师模型(Teacher Model):体积大、精度高、计算成本高的大模型,如GPT-4、Llama-2-70B。
学生模型(Student Model):体积小、速度快、适合部署的小模型,如GPT-3.5、Llama-2-7B。
蒸馏过程:学生模型学习教师模型的输出分布(软标签),而不仅仅是真实标签(硬标签),从而学到更丰富的"知识"。
推理优化技术
KV Cache
KV Cache是Transformer模型推理中的关键优化技术。在自回归生成中,每个新Token的生成都需要计算所有之前Token的注意力。KV Cache将之前计算过的Key和Value缓存起来,避免重复计算,大幅提升推理速度。
没有KV Cache时,生成第N个Token需要重新计算前N-1个Token的注意力,复杂度为 \(O(N^2)\)。使用KV Cache后,只需计算新Token与之前Token的注意力,复杂度降为 \(O(N)\)。
Flash Attention
Flash Attention是一种通过优化GPU内存访问模式来加速注意力计算的算法。传统注意力计算需要将巨大的注意力矩阵存储在显存中,而Flash Attention通过分块计算(Tiling)技术,减少了显存读写次数,实现了:
- 计算速度提升 2-4x
- 显存占用降低 5-20x
- 支持更长的上下文序列
批处理推理(Batched Inference)
批处理推理是将多个请求合并为一个批次同时处理的技术。在服务端部署时,通过动态批处理(Dynamic Batching)可以将等待中的请求打包,充分利用GPU并行计算能力,大幅提升吞吐量。
- 静态批处理:固定批次大小,简单但可能浪费GPU资源
- 动态批处理:根据当前请求量动态调整批次大小,效率更高
- 连续批处理(Continuous Batching):请求到达即可加入批次,无需等待批次填满
推理框架对比
| 框架 | 开发者 | 核心特点 | 量化支持 | 适用场景 |
|---|---|---|---|---|
| vLLM | UC Berkeley | PagedAttention、高效显存管理、高吞吐量 | AWQ、GPTQ、FP8 | 在线服务、高并发API |
| TensorRT-LLM | NVIDIA | 深度优化NVIDIA GPU、极致性能 | INT8、INT4、FP8 | NVIDIA GPU生产部署 |
| ONNX Runtime | Microsoft | 跨平台、跨硬件、生态丰富 | INT8、INT4 | 多平台部署、边缘设备 |
| llama.cpp | Georgi Gerganov | 纯C/C++实现、CPU/GPU混合推理、极低门槛 | GGUF(Q4/Q5/Q8) | 本地运行、CPU推理 |
使用llama.cpp本地运行模型
llama.cpp是最流行的本地推理工具之一,支持在CPU和GPU上运行量化后的LLM模型。
# 1. 安装llama.cpp(需要先编译)
# git clone https://github.com/ggerganov/llama.cpp
# cd llama.cpp && make
# 2. 下载GGUF格式模型(以Qwen2.5-7B为例)
# 从Hugging Face下载:Qwen/Qwen2.5-7B-Instruct-GGUF
# 3. 命令行运行模型进行交互式对话
# ./llama-cli -m models/qwen2.5-7b-instruct-q4_k_m.gguf \
# -c 4096 \
# -n 512 \
# --temp 0.7 \
# --top-p 0.9 \
# -i -p "你好,请介绍一下你自己"
# 参数说明:
# -m : 模型文件路径
# -c : 上下文窗口大小(token数)
# -n : 最大生成token数
# --temp : 温度参数(0-2,越高越随机)
# --top-p : 核采样概率阈值
# -i : 交互模式
# -p : 初始提示词
使用vLLM部署API服务
vLLM可以快速将模型部署为兼容OpenAI API格式的HTTP服务。
# 1. 安装vLLM
# pip install vllm
# 2. 启动API服务(命令行)
# python -m vllm.entrypoints.openai.api_server \
# --model Qwen/Qwen2.5-7B-Instruct \
# --tensor-parallel-size 1 \
# --max-model-len 4096 \
# --port 8000
# 3. 客户端调用API服务
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed" # vLLM本地服务不需要API Key
)
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[
{"role": "system", "content": "你是一个有帮助的AI助手。"},
{"role": "user", "content": "请用Python写一个快速排序算法。"}
],
temperature=0.7,
max_tokens=1024
)
print(response.choices[0].message.content)
本章小结
- 推理是使用训练好的模型对新数据进行预测/生成的过程,关键指标包括首Token延迟、Token生成速度和吞吐量。
- 模型压缩三大技术——量化(降低精度)、剪枝(移除冗余参数)、知识蒸馏(大模型教小模型)——是让大模型高效运行的核心手段。
- KV Cache通过缓存注意力计算结果避免重复计算,Flash Attention通过优化内存访问加速注意力计算,批处理推理通过并行处理提升吞吐量。
- 主流推理框架各有优势:vLLM适合高并发在线服务,TensorRT-LLM适合NVIDIA GPU极致优化,llama.cpp适合本地CPU/GPU推理。
- llama.cpp和vLLM使得大模型的本地运行和API服务部署变得简单高效,是AI应用落地的重要工具。
练习题
-
以下关于推理和训练的说法,哪项是正确的?
A. 推理需要反向传播来计算梯度
B. 训练只需要前向传播
C. 推理仅需前向传播,训练需要前向+反向传播
D. 推理和训练的计算量基本相同答案:C。推理只需要前向传播即可得到预测结果,而训练需要前向传播计算输出、反向传播计算梯度来更新参数。
-
将一个FP32的70B参数模型量化为INT4后,模型参数的显存需求大约变为多少?
A. 140GB → 70GB
B. 140GB → 35GB
C. 140GB → 17.5GB
D. 140GB → 8.75GB答案:C。INT4是4位,相比FP32的32位,精度降低了8倍,因此模型参数的显存需求从140GB降至约17.5GB。
-
vLLM框架的核心创新技术是什么?
A. Flash Attention
B. PagedAttention
C. Knowledge Distillation
D. Structured Pruning答案:B。vLLM的核心创新是PagedAttention技术,它借鉴了操作系统的虚拟内存分页机制来管理KV Cache的显存,实现了高效的显存利用和更高的吞吐量。