Ollama / vLLM / LMDeploy 模型部署推理
它的设计理念是"开箱即用",让普通用户也能轻松在本地运行各种AI模型。请求队列 → 调度器 → 连续批处理器 → PagedAttention引擎 → 模型执行。用户界面/API → Ollama核心引擎 → 模型推理后端 → 硬件资源。:传统部署LLM需要复杂的环境配置,Ollama通过一键安装解决。:自动处理模型量化、内存管理,让大模型能在消费级硬件上运行。:对中文任务使用LMDeploy,对
1. Ollama - 本地模型部署的瑞士军刀
1.1 Ollama 是什么?
1.1 核心概念解析
Ollama是什么?
Ollama是一个专门为在个人电脑上运行大型语言模型而设计的工具。它的设计理念是"开箱即用",让普通用户也能轻松在本地运行各种AI模型。
核心设计思想:
-
简化部署:传统部署LLM需要复杂的环境配置,Ollama通过一键安装解决
-
资源优化:自动处理模型量化、内存管理,让大模型能在消费级硬件上运行
-
统一接口:无论什么模型,都提供相同的使用方式
1.2 架构和工作原理
Ollama的架构层次:
text
用户界面/API → Ollama核心引擎 → 模型推理后端 → 硬件资源
关键组件详解:
-
模型管理器
-
负责下载、验证和管理模型文件
-
自动处理模型依赖关系
-
支持模型版本控制
-
-
推理引擎
-
基于优化的C++后端(使用llama.cpp等)
-
自动选择最适合的运行模式(CPU/GPU)
-
实现内存分页和动态加载
-
-
API网关
-
提供统一的REST API接口
-
处理并发请求
-
管理会话状态
-
1.3 核心特性深度解析
模型格式支持:
-
GGUF格式:专为CPU推理优化的格式
-
量化支持:4位、5位、8位量化,平衡精度和性能
-
分层加载:只加载当前需要的模型部分到内存
内存管理机制:
-
智能缓存:频繁使用的模型层保留在内存
-
动态卸载:不活跃的模型部分及时释放
-
内存映射:通过内存映射文件减少内存占用
1.2 Ollama 安装和基本使用
安装 Ollama:奥拉玛
# macOS
brew install ollama
# Linux (一键安装)
curl -fsSL https://ollama.ai/install.sh | sh
# Windows
# 从官网下载安装包:https://ollama.ai/download
基本命令使用(windows也可以直接打开这个应用程序,有个界面可以设置):
# 启动 Ollama 服务
ollama serve
# 拉取模型(以 Llama2 为例)
ollama pull llama2
# 运行模型进行对话
ollama run llama2
# 查看已安装的模型
ollama list
# 删除模型
ollama rm llama2
只要打开就是启动服务
1.3 Ollama Python 集成
Ollama启动后会在本地生成API端口,直接调用就是在调用模型
import requests
import json
class OllamaClient:
def __init__(self, base_url="http://localhost:11434"):
self.base_url = base_url
def generate(self, model, prompt, **kwargs):
"""生成文本"""
data = {
"model": model,
"prompt": prompt,
"stream": False,
**kwargs
}
response = requests.post(
f"{self.base_url}/api/generate",
json=data
)
return response.json()
def chat(self, model, messages, **kwargs):
"""聊天模式"""
data = {
"model": model,
"messages": messages,
"stream": False,
**kwargs
}
response = requests.post(
f"{self.base_url}/api/chat",
json=data
)
return response.json()
def list_models(self):
"""列出所有模型"""
response = requests.get(f"{self.base_url}/api/tags")
return response.json()
# 使用示例
def ollama_demo():
client = OllamaClient()
# 检查可用模型
models = client.list_models()
print("可用模型:", [model["name"] for model in models.get("models", [])])
# 文本生成
response = client.generate(
model="llama2",
prompt="为什么天空是蓝色的?",
options={
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 500
}
)
print("生成结果:", response["response"])
# 聊天模式
messages = [
{"role": "user", "content": "你好,请介绍一下你自己"}
]
chat_response = client.chat(
model="llama2",
messages=messages
)
print("聊天回复:", chat_response["message"]["content"])
# 运行演示
# ollama_demo()

2. vLLM - 高性能推理引擎
2.1 vLLM 是什么?
vLLM 是一个高性能、易用的 LLM 推理和服务引擎,特点:
-
极致性能:使用 PagedAttention 技术,吞吐量提升 24 倍
-
生产就绪:支持连续批处理、内存优化
-
OpenAI 兼容:完全兼容 OpenAI API
-
易用性:简单几行代码即可部署服务
2.1 核心创新:PagedAttention
传统Attention的问题:
在标准的Transformer推理中,键值缓存(KV Cache)的管理存在严重问题:
-
内存碎片化:不同序列长度导致内存分配不均
-
内存浪费:为最坏情况预留内存,实际使用率低
-
限制并发:由于内存限制,无法同时处理太多请求
PagedAttention的革命性设计:
vLLM的核心创新是将操作系统的虚拟内存和分页概念引入到Attention机制中:
-
分块管理:将KV Cache分成固定大小的块(如16个token)
-
虚拟地址:每个序列拥有自己的"虚拟KV Cache空间"
-
物理映射:实际物理块按需分配,可以非连续
-
碎片整理:通过重映射解决内存碎片问题
2.2 架构深度解析
vLLM的系统架构:
text
请求队列 → 调度器 → 连续批处理器 → PagedAttention引擎 → 模型执行
关键组件详解:
-
连续批处理器(Continuous Batching)
-
传统方法:等待整个批次完成才开始下一批
-
vLLM方法:完成的请求立即离开,新请求立即加入
-
效果:GPU利用率从30-40%提升到70-80%
-
-
内存管理池
-
块分配器:管理KV Cache块的生命周期
-
垃圾回收:自动回收不再使用的内存块
-
预分配策略:减少运行时内存分配开销
-
-
调度算法
-
优先级调度:VIP请求优先处理
-
公平调度:防止大请求阻塞系统
-
延迟优化:权衡吞吐量和响应时间
-
2.3 性能优势分析
吞吐量提升原理:
-
消除内存浪费:PagedAttention减少60-80%的内存浪费
-
提高并发度:相同硬件可以处理更多并发请求
-
减少等待时间:连续批处理减少空闲等待
实际性能表现:
-
相比传统方法,吞吐量提升2-24倍
-
在A100 GPU上,可以同时服务数百个用户
-
响应时间更加稳定,减少长尾延迟
2.2 vLLM 安装和基本使用
安装 vLLM
# 使用 pip 安装
pip install vllm
# 或者从源码安装(支持最新特性)
pip install git+https://github.com/vllm-project/vllm.git
# 如果需要 GPU 支持,确保安装正确版本的 PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
离线推理示例
from vllm import LLM, SamplingParams
class vLLMInference:
def __init__(self, model_name="facebook/opt-125m"):
# 初始化模型
self.llm = LLM(
model=model_name,
tensor_parallel_size=1, # GPU 数量
gpu_memory_utilization=0.9, # GPU 内存使用率
max_model_len=2048, # 最大序列长度
trust_remote_code=True # 信任远程代码
)
def generate_text(self, prompts, **sampling_params):
"""生成文本"""
# 设置采样参数
params = SamplingParams(
temperature=0.8,
top_p=0.95,
max_tokens=256,
stop=["</s>", "\n\n"],
**sampling_params
)
# 批量生成
outputs = self.llm.generate(prompts, params)
# 整理结果
results = []
for output in outputs:
results.append({
"prompt": output.prompt,
"generated_text": output.outputs[0].text,
"token_count": len(output.outputs[0].token_ids),
"finish_reason": output.outputs[0].finish_reason
})
return results
def streaming_generate(self, prompt, **kwargs):
"""流式生成(适用于长文本)"""
params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512,
stream=True,
**kwargs
)
# 流式输出
for output in self.llm.generate([prompt], params):
if output.outputs:
yield output.outputs[0].text
# 使用示例
def vllm_demo():
# 初始化推理引擎
inference = vLLMInference("facebook/opt-125m") # 使用小模型演示
# 批量生成
prompts = [
"人工智能的未来是",
"机器学习的主要应用包括",
"深度学习与传统机器学习的区别是"
]
results = inference.generate_text(prompts)
for i, result in enumerate(results):
print(f"Prompt {i+1}: {result['prompt']}")
print(f"Generated: {result['generated_text']}")
print(f"Tokens: {result['token_count']}")
print("-" * 50)
# 流式生成演示
print("流式生成演示:")
for chunk in inference.streaming_generate("请详细解释一下神经网络的工作原理:"):
print(chunk, end="", flush=True)
print()
# vllm_demo()
2.3 vLLM 服务器部署
# 启动 vLLM 服务器的命令行
# vllm serve facebook/opt-125m --host 0.0.0.0 --port 8000
# 或者使用 Python 代码启动
from vllm.entrypoints import api_server
import argparse
import asyncio
def start_vllm_server():
"""启动 vLLM API 服务器"""
parser = argparse.ArgumentParser()
parser.add_argument("--model", type=str, default="facebook/opt-125m")
parser.add_argument("--host", type=str, default="0.0.0.0")
parser.add_argument("--port", type=int, default=8000)
parser.add_argument("--gpu-memory-utilization", type=float, default=0.9)
args = parser.parse_args()
# 启动服务器
asyncio.run(api_server.serve(
model=args.model,
host=args.host,
port=args.port,
gpu_memory_utilization=args.gpu_memory_utilization
))
# 客户端调用示例
import openai
class vLLMClient:
def __init__(self, base_url="http://localhost:8000/v1"):
self.client = openai.OpenAI(
base_url=base_url,
api_key="token-abc123" # vLLM 不需要真实的 API key
)
def chat_completion(self, messages, **kwargs):
"""聊天补全"""
response = self.client.chat.completions.create(
model="facebook/opt-125m", # 需要与服务器模型匹配
messages=messages,
**kwargs
)
return response
def text_completion(self, prompt, **kwargs):
"""文本补全"""
response = self.client.completions.create(
model="facebook/opt-125m",
prompt=prompt,
**kwargs
)
return response
# 使用客户端
def test_vllm_client():
client = vLLMClient()
# 聊天模式
messages = [
{"role": "system", "content": "你是一个有用的助手。"},
{"role": "user", "content": "请解释一下机器学习"}
]
response = client.chat_completion(
messages,
temperature=0.7,
max_tokens=500
)
print("AI回复:", response.choices[0].message.content)
# 文本补全模式
completion = client.text_completion(
"人工智能的未来发展方向包括",
temperature=0.8,
max_tokens=200
)
print("补全结果:", completion.choices[0].text)
# test_vllm_client()
3. LMDeploy - 一站式推理部署工具包
3.1 LMDeploy 是什么?
LMDeploy 是上海人工智能实验室开发的一站式 LLM 推理部署工具包,特点:
-
全面优化:支持量化、推理加速、服务部署
-
多后端支持:支持 TurboMind、TensorRT 等推理后端
-
丰富功能:支持对话、代码解释、知识库问答等
-
中文优化:对中文模型有更好的支持
3.1 设计哲学:全链路优化
LMDeploy的核心理念:
不是单一组件的优化,而是从模型到服务的全链路优化:
text
模型 → 转换 → 量化 → 推理 → 服务 → 监控
与其他框架的区别:
-
Ollama:侧重易用性,适合个人用户
-
vLLM:侧重推理性能,适合技术团队
-
LMDeploy:覆盖完整生命周期,适合企业部署
3.2 核心组件详解
1. TurboMind推理引擎
-
专为LLM设计的推理后端
-
支持多种计算模式:FP16、INT8、INT4
-
自动内核选择:根据硬件选择最优计算内核
2. 量化工具箱
-
权重量化:将模型权重从FP16压缩到INT4/INT8
-
激活量化:动态量化中间激活值
-
KV Cache量化:压缩注意力机制的键值缓存
-
混合精度:关键层保持高精度,次要层使用低精度
3. 服务化框架
-
多协议支持:HTTP、gRPC、WebSocket
-
负载均衡:自动分发请求到多个推理实例
-
健康检查:实时监控服务状态
-
弹性伸缩:根据负载自动调整资源
3.3 量化技术深度解析
为什么量化如此重要?
-
内存节省:4-bit量化减少75%的内存占用
-
计算加速:整数运算比浮点运算更快
-
能效提升:减少数据搬运,降低功耗
LMDeploy的量化策略:
-
AWQ(激活感知的权重量化)
-
原理:根据激活分布决定哪些权重更重要
-
优势:保持精度的同时实现高效压缩
-
适用场景:对精度要求较高的生产环境
-
-
GPTQ(基于梯度的后训练量化)
-
原理:使用少量校准数据优化量化参数
-
优势:量化质量高,通用性强
-
适用场景:通用模型量化
-
-
KV8量化
-
原理:将注意力机制的KV Cache从FP16压缩到INT8
-
优势:显著减少内存占用,支持更长上下文
-
适用场景:长文本处理、多轮对话
-
3.2 LMDeploy 安装和使用
安装 LMDeploy
# 使用 pip 安装
pip install lmdeploy
# 如果需要所有功能
pip install lmdeploy[all]
# 或者从源码安装
git clone https://github.com/InternLM/lmdeploy.git
cd lmdeploy
pip install -e .
离线推理示例
from lmdeploy import pipeline, GenerationConfig, TurbomindEngineConfig
class LMDeployInference:
def __init__(self, model_path, backend="turbomind"):
# 配置推理引擎
backend_config = TurbomindEngineConfig(
model_name="internlm", # 模型名称
model_format="hf", # 模型格式
tp=1, # 张量并行
cache_max_entry_count=0.8, # KV缓存比例
quant_policy=0, # 量化策略
)
# 创建管道
self.pipe = pipeline(
model_path,
backend_config=backend_config
)
def generate(self, prompts, **generation_config):
"""生成文本"""
# 生成配置
gen_config = GenerationConfig(
top_p=0.8,
temperature=0.7,
max_new_tokens=512,
**generation_config
)
# 批量生成
if isinstance(prompts, str):
prompts = [prompts]
results = []
for prompt in prompts:
response = self.pipe([prompt], gen_config=gen_config)
results.append({
"prompt": prompt,
"response": response[0].text,
"token_count": response[0].generate_token_len
})
return results
def chat(self, messages, **kwargs):
"""聊天模式"""
response = self.pipe.chat(
messages,
**kwargs
)
return response
# 使用示例
def lmdeploy_demo():
# 初始化推理引擎(需要先下载模型)
# inference = LMDeployInference("internlm/internlm2-chat-7b")
# 演示用伪代码
print("LMDeploy 推理示例:")
print("1. 支持多种量化方式: 4bit, 8bit, weight-only")
print("2. 支持 TensorRT 加速")
print("3. 支持多模型格式: HF, AWQ, GPTQ")
print("4. 中文优化良好")
# lmdeploy_demo()
3.3 LMDeploy 服务化部署
# 启动 LMDeploy 服务器的命令行示例
# lmdeploy serve api_server internlm/internlm2-chat-7b --server-port 8000 --tp 1
# 客户端调用
import requests
import json
class LMDeployClient:
def __init__(self, base_url="http://localhost:8000"):
self.base_url = base_url
def chat_completion(self, messages, **kwargs):
"""聊天补全"""
data = {
"model": "internlm2-chat-7b",
"messages": messages,
"temperature": 0.7,
"top_p": 0.8,
"max_tokens": 512,
**kwargs
}
response = requests.post(
f"{self.base_url}/v1/chat/completions",
json=data,
headers={"Content-Type": "application/json"}
)
return response.json()
def get_models(self):
"""获取模型列表"""
response = requests.get(f"{self.base_url}/v1/models")
return response.json()
# 使用示例
def test_lmdeploy_client():
client = LMDeployClient()
# 获取模型信息
models = client.get_models()
print("可用模型:", models)
# 聊天对话
messages = [
{"role": "system", "content": "你是一个有用的AI助手。"},
{"role": "user", "content": "请介绍一下深度学习"}
]
response = client.chat_completion(messages)
print("AI回复:", response["choices"][0]["message"]["content"])
# test_lmdeploy_client()
3.4 LMDeploy 量化部署
# 模型量化示例(命令行)
"""
# W4A16 量化
lmdeploy lite auto_awq internlm/internlm2-chat-7b --work-dir ./internlm2-chat-7b-4bit
# 部署量化模型
lmdeploy serve api_server ./internlm2-chat-7b-4bit --server-port 8000
# KV8 量化(进一步减少显存)
lmdeploy convert internlm/internlm2-chat-7b ./quantized-model --kv-bits 8
"""
4. 三大框架对比分析
4.1 技术架构对比
| 维度 | Ollama | vLLM | LMDeploy |
|---|---|---|---|
| 核心创新 | 易用性设计 | PagedAttention | 全链路优化 |
| 内存管理 | 智能缓存 | 分页KV Cache | 多层次量化 |
| 并发处理 | 基础并发 | 连续批处理 | 分布式推理 |
| 量化支持 | 基础量化 | 有限量化 | 全面量化方案 |
4.2 适用场景深度分析
Ollama适合:
-
个人用户:想在个人电脑上体验AI能力
-
快速原型:需要快速验证想法,不关心极致性能
-
教育学习:学习LLM原理和应用的入门工具
-
开发测试:本地调试和测试模型行为
vLLM适合:
-
高并发服务:需要同时服务大量用户的在线应用
-
生产环境:对吞吐量和响应时间有严格要求
-
技术团队:有专门的运维和开发团队
-
成本敏感:需要在有限硬件上服务更多用户
LMDeploy适合:
-
企业部署:需要完整的解决方案而非单个组件
-
中文场景:主要处理中文任务,需要专门优化
-
资源受限:硬件资源有限,需要极致压缩
-
端到端需求:从模型转换到服务监控的全流程需求
4.3 性能特征对比
内存使用效率:
-
Ollama:中等,适合个人使用
-
vLLM:优秀,通过PagedAttention大幅优化
-
LMDeploy:极佳,通过量化实现最大压缩
部署复杂度:
-
Ollama:非常简单,几分钟即可上手
-
vLLM:中等,需要一定的技术背景
-
LMDeploy:复杂,但提供完整工具链
生态系统:
-
Ollama:活跃的社区,丰富的预构建模型
-
vLLM:技术领先,得到学术界和工业界认可
-
LMDeploy:中文生态完善,企业级功能丰富
5. 选择指南和最佳实践
5.1 根据需求选择框架
决策流程:
text
1. 确定使用场景(个人/生产/企业) 2. 评估技术能力(新手/专家/团队) 3. 分析资源约束(硬件/预算/时间) 4. 考虑扩展需求(用户量/功能复杂度)
具体建议:
-
如果你是学生或个人开发者:从Ollama开始,快速上手积累经验
-
如果你要构建高并发Web服务:选择vLLM,获得最佳性能
-
如果你在企业环境中部署中文应用:选择LMDeploy,获得完整解决方案
-
如果你资源极度受限:LMDeploy的量化能力是最佳选择
5.2 混合使用策略
在实际项目中,可以混合使用这些框架:
-
开发阶段:使用Ollama快速迭代和测试
-
性能测试:使用vLLM验证高并发性能
-
生产部署:根据具体需求选择vLLM或LMDeploy
-
特定场景:对中文任务使用LMDeploy,对其他任务使用vLLM
5.3 未来发展趋势
Ollama:向更易用、更多模型支持方向发展
vLLM:继续优化性能,支持更多硬件和模型架构
LMDeploy:加强企业级功能,完善生态系统
更多推荐



所有评论(0)