模型量化部署教程¶
概述¶
模型量化是将模型参数从高精度(FP32)转换为低精度(INT8/INT4)的技术,能够大幅减少模型大小和推理时间,是模型部署的关键技术。
为什么需要量化¶
# 量化的优势
1. 减小模型大小
- FP32 → INT8:大小减少4倍
- FP32 → INT4:大小减少8倍
2. 加速推理
- 低精度计算更快
- 显存占用更少
3. 降低成本
- 硬件要求降低
- 部署成本减少
量化类型¶
训练后量化(PTQ)¶
量化感知训练(QAT)¶
常用量化方法¶
GPTQ¶
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
# 量化配置
quantization_config = GPTQConfig(
bits=4, # 4bit量化
dataset="c4", # 校准数据集
group_size=128,
desc_act=True
)
# 加载量化模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=quantization_config,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")
AWQ¶
from transformers import AutoModelForCausalLM, AWQConfig
# AWQ量化配置
quantization_config = AWQConfig(
bits=4,
fuse_max_seq_len=2048,
do_fuse=True
)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
"model_name",
quantization_config=quantization_config,
device_map="auto"
)
GGML/GGUF(llama.cpp)¶
# 使用llama.cpp量化
# 1. 转换模型
python convert.py model_dir --outtype f16
# 2. 量化
./quantize model-f16.bin model-q4_0.bin q4_0
# 3. 推理
./main -m model-q4_0.bin -p "你好"
使用BitsAndBytes¶
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
import torch
# 4bit量化配置
bnb_config_4bit = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True
)
# 8bit量化配置
bnb_config_8bit = BitsAndBytesConfig(
load_in_8bit=True
)
# 加载4bit模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config_4bit,
device_map="auto"
)
# 模型大小对比
# FP32: ~16GB
# INT8: ~8GB
# INT4: ~4GB
Ollama本地部署¶
安装Ollama¶
# Windows
# 下载安装包:https://ollama.com/download
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.com/install.sh | sh
下载和运行模型¶
# 下载模型
ollama pull llama3.1:8b
ollama pull qwen2.5:7b
ollama pull deepseek-coder:6.7b
# 运行模型
ollama run llama3.1:8b
# 列出已下载模型
ollama list
API调用¶
import requests
import json
def ollama_chat(prompt, model="llama3.1:8b"):
url = "http://localhost:11434/api/generate"
data = {
"model": model,
"prompt": prompt,
"stream": False
}
response = requests.post(url, json=data)
return response.json()["response"]
# 使用示例
result = ollama_chat("请解释什么是机器学习")
print(result)
OpenAI兼容API¶
from openai import OpenAI
# Ollama提供OpenAI兼容API
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # 任意值
)
response = client.chat.completions.create(
model="llama3.1:8b",
messages=[
{"role": "user", "content": "你好"}
]
)
print(response.choices[0].message.content)
vLLM高性能推理¶
安装配置¶
启动服务¶
from vllm import LLM, SamplingParams
# 加载模型
llm = LLM(
model="meta-llama/Llama-3.1-8B",
tensor_parallel_size=1, # GPU数量
max_model_len=4096
)
# 生成
prompts = ["你好,请介绍一下自己"]
sampling_params = SamplingParams(temperature=0.7, max_tokens=512)
outputs = llm.generate(prompts, sampling_params)
print(outputs[0].outputs[0].text)
OpenAI兼容服务¶
# 启动API服务器
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.1-8B \
--host 0.0.0.0 \
--port 8000
TensorRT-LLM¶
# NVIDIA TensorRT-LLM
# 1. 构建引擎
python convert_checkpoint.py \
--model_dir ./model \
--output_dir ./trt_checkpoint
trtllm-build \
--checkpoint_dir ./trt_checkpoint \
--output_dir ./trt_engine \
--gemm_plugin float16
# 2. 推理
python run.py \
--tokenizer_dir ./model \
--engine_dir ./trt_engine \
--max_output_len 256
部署架构¶
单机部署¶
服务化部署¶
# 使用FastAPI部署
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI
app = FastAPI()
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"
)
class ChatRequest(BaseModel):
message: str
model: str = "llama3.1:8b"
@app.post("/chat")
async def chat(request: ChatRequest):
response = client.chat.completions.create(
model=request.model,
messages=[{"role": "user", "content": request.message}]
)
return {"response": response.choices[0].message.content}
分布式部署¶
性能优化¶
推理优化技巧¶
# 1. 批量推理
- 合并多个请求
- 提高GPU利用率
# 2. KV Cache
- 缓存历史计算
- 减少重复计算
# 3. Continuous Batching
- 动态批处理
- 提高吞吐量
# 4. 量化
- INT8/INT4量化
- 减少计算量
基准测试¶
import time
def benchmark_inference(llm, prompt, n_runs=10):
times = []
for _ in range(n_runs):
start = time.time()
llm.generate([prompt], SamplingParams(max_tokens=100))
times.append(time.time() - start)
avg_time = sum(times) / len(times)
tokens_per_second = 100 / avg_time
print(f"平均延迟: {avg_time:.2f}s")
print(f"吞吐量: {tokens_per_second:.2f} tokens/s")
硬件选择¶
# 显存需求参考
模型大小 FP32 FP16 INT8 INT4
7B 28GB 14GB 7GB 4GB
13B 52GB 26GB 13GB 7GB
70B 280GB 140GB 70GB 35GB
# 推荐硬件
个人开发
- RTX 4060/4070 (8-12GB)
- 适合7B模型INT4量化
专业开发
- RTX 4090 (24GB)
- 适合13B模型INT4量化
企业部署
- A100/H100 (40-80GB)
- 适合大模型全精度