vLLM - 高性能LLM推理引擎
前言
大型语言模型(LLM)部署工具对比
工具名称 | 性能表现 | 易用性 | 适用场景 | 硬件需求 | 模型支持 | 部署方式 | 系统支持 |
---|---|---|---|---|---|---|---|
SGLang v0.4 | 零开销批处理提升1.1倍吞吐量,缓存感知负载均衡提升1.9倍,结构化输出提速10倍 | 需一定技术基础,但提供完整API和示例 | 企业级推理服务、高并发场景、需要结构化输出的应用 | 推荐A100/H100,支持多GPU部署 | 全面支持主流大模型,特别优化DeepSeek等模型 | Docker、Python包 | Linux |
Ollama | 继承 llama.cpp 的高效推理能力,提供便捷的模型管理和运行机制,并发处理能力相对有限 | 简单安装,易于使用,跨平台支持,广泛的模型适配,支持 REST API | 个人开发者创意验证、辅助学习、日常问答、创意写作等轻量级应用场景 | 与 llama.cpp 相同,但提供更简便的资源管理,内存占用少 | 模型库丰富,涵盖 1700 多款,支持一键下载安装 | 独立应用程序、Docker、REST API | Windows、macOS、Linux |
VLLM | 借助 PagedAttention 和 Continuous Batching 技术,多 GPU 环境下性能优异,充分利用多核CPU和GPU资源 | 需要一定技术基础,配置相对复杂 | 大规模在线推理服务、高并发场景 | 要求 NVIDIA GPU,推荐 A100/H100,相对ollama显存占用更大 | 支持主流 Hugging Face 模型 | Python包、OpenAI兼容API、Docker | 仅支持 Linux |
LLaMA.cpp | 多级量化支持,跨平台优化,高效推理 | 命令行界面直观,提供多语言绑定 | 边缘设备部署、移动端应用、本地服务 | CPU/GPU 均可,针对各类硬件优化 | GGUF格式模型,广泛兼容性 | 命令行工具、API服务器、多语言绑定 | 全平台支持 |
综合来看:
- 如果您是专业的科研团队,拥有强大的计算资源,追求极致的推理速度,那么 SGLang 无疑是首选,它能像一台超级引擎,助力前沿科研探索;
- 要是您是个人开发者,或是中小型项目的原型开发,可在本地轻松玩转大模型,Ollama 就如同贴心伙伴,随时响应您的创意需求;
- 对于需要搭建大规模在线服务,面对海量用户请求的开发者而言,VLLM 则是坚实后盾,以高效推理确保服务的流畅稳定;
- 而要是您手头硬件有限,只是想在小型设备上浅尝大模型的魅力,或者快速验证一些简单想法,LLaMA.cpp 就是那把开启便捷之门的钥匙,让 AI 触手可及。
Ollama和vLLM的一些选型建议
Ollama和vLLM各有优劣,具体选择应依据实际需求而定,以下是一些选型建议:
1、简单易用与快速部署:
若您需要一个简单易操作、能够快速部署的LLM解决方案,且对推理速度要求不高,Ollama会是不错的选择。其跨平台支持和低内存占用的特点,使其非常适合资源受限的设备,能够快速搭建起基础的模型应用环境。
例如,对于个人开发者进行小型项目的原型开发、小型团队的内部工具搭建或者非技术人员的日常办公辅助等场景,Ollama的简单性和便捷性能够快速满足需求,降低开发和使用门槛。
2、高性能推理与资源充分利用:
如果您追求高性能的LLM推理,并且具备一定的技术基础和硬件资源,vLLM则更为合适。它的高推理速度和出色的资源利用率,使其能够胜任处理大量并发请求的企业级应用场景,为用户提供高效、稳定的推理服务。
比如,大型互联网公司的核心业务应用、需要高并发处理能力的在线服务平台以及对推理性能有严格要求的科研项目等,vLLM能够充分发挥其优势,提升系统的整体性能和响应速度。
3、技术基础与维护成本:
对于技术基础较弱的用户,Ollama的易用性更具吸引力,无需过多的技术知识和配置经验即可上手使用。而对于有一定技术基础且愿意投入时间进行配置和优化的用户,vLLM提供的高性能和灵活性则更有优势,能够根据具体需求进行深度定制和优化。
例如,初创企业在技术团队尚未成熟时,可能更倾向于选择Ollama来快速实现产品的初步功能;而有一定技术积累的成熟企业,在面对复杂的业务场景和高性能要求时,会选择vLLM并投入相应的技术人力进行深入优化和维护。
4、特定场景需求:
在资源受限的环境中,如个人开发、小型项目等,Ollama的低资源占用和简单部署使其成为首选。而在对性能要求极高、需要处理大规模并发请求的场景下,如大型企业的智能客服系统、在线问答平台等,vLLM凭借其高性能推理和分布式部署能力,能够更好地满足业务需求。
综上所述,Ollama和vLLM各有所长,在选择时应综合考虑项目的具体需求、技术基础和资源状况等因素,以便做出最合适的决策。
vLLM 简介
vLLM 是一个 Python 库,包含预编译的 C++ 和 CUDA (12.1) 二进制文件。
依赖环境
- 操作系统:Linux
- Python:3.8 - 3.12
- GPU:计算能力 7.0 或更高(例如 V100、T4、RTX20xx、A100、L4、H100 等)
vLLM 框架是一个高效的大语言模型推理和部署服务系统,具备以下特性:
- 高效的内存管理:通过 PagedAttention 算法,vLLM 实现了对 KV 缓存的高效管理,减少了内存浪费,优化了模型的运行效率。
- 高吞吐量:vLLM 支持异步处理和连续批处理请求,显著提高了模型推理的吞吐量,加速了文本生成和处理速度。
- 易用性:vLLM 与 HuggingFace 模型无缝集成,支持多种流行的大型语言模型,简化了模型部署和推理的过程。兼容 OpenAI 的 API 服务器。
- 分布式推理:框架支持在多 GPU 环境中进行分布式推理,通过模型并行策略和高效的数据通信,提升了处理大型模型的能力。
- 开源共享:vLLM 由于其开源的属性,拥有活跃的社区支持,这也便于开发者贡献和改进,共同推动技术发展。
vLLM 安装部署
使用 pip 安装
您可以使用 pip 安装 vLLM(建议采用 conda 虚拟环境进行安装):
#(推荐)创建一个新的 conda 环境。
conda create -n myenv python=3.10 -y
conda activate myenv
# 安装带有 CUDA 12.1 的 vLLM。
pip install vllm
遇到的问题解决
1、CondaError: Run 'conda init' before 'conda activate'
如有如下报错:
root@docker-container-f45247-46ba4c:~# conda activate myenv
CondaError: Run 'conda init' before 'conda activate'
CondaError: Run 'conda init' before 'conda activate' 则表明尝试激活 Conda 环境时,Conda 的初始化尚未完成。这通常是因为 Conda 的脚本尚未正确加载到 shell 中。
解决方法:
1、运行 conda init
,进行初始化 Conda。这个命令会将 Conda 的脚本添加到 shell 配置文件中,确保 Conda 命令可以在任何地方使用。
2、在运行 conda init
后,需要重新加载 shell 配置文件,或者重新打开终端窗口。需运行 source ~/.bashrc
。
3、初始化成功后,再次激活环境 conda activate myenv
。
HuggingFace 获取模型
huggingface-cli 下载模型
huggingface-cli
隶属于 huggingface_hub 库,不仅可以下载模型、数据,还可以可以登录huggingface、上传模型、数据等。huggingface-cli 属于官方工具,其长期支持肯定是最好的。优先推荐!
安装依赖
pip install -U huggingface_hub
注意:huggingface_hub 依赖于 Python>=3.8,此外需要安装 0.17.0 及以上的版本,推荐0.19.0+。
下载模型
huggingface-cli
下载命令参数格式:
huggingface-cli download <model_id> --local-dir <path>
• <model_id> :Hugging Face Hub 上的模型 ID,例如 bigscience/bloom-560m 。
• --local-dir <path> :指定下载的模型文件将被保存到本地的目录路径。
• 默认情况下,Hugging Face 的模型文件会保存在当前用户主目录下的 .cache/huggingface/hub 文件夹中,即 ~/.cache/huggingface/hub/
目录。
hf_transfer 加速
hf_transfer
依附并兼容 huggingface-cli ,是 hugging face 官方专门为提高下载速度基于 Rust 开发的一个模块,开启后在带宽充足的机器上可以跑到 500MB/s。
开启方法:
(1) 安装依赖
pip install -U hf-transfer
(2) 设置 HF_HUB_ENABLE_HF_TRANSFER
HF_HUB_ENABLE_HF_TRANSFER 是一个环境变量,用于启用 Hugging Face Hub 的 hf_transfer 功能。开启 hf-transfer 需设置 HF_HUB_ENABLE_HF_TRANSFER
环境变量为 1。
# Linux
export HF_HUB_ENABLE_HF_TRANSFER=1
# Windows Powershell
$env:HF_HUB_ENABLE_HF_TRANSFER = 1
(3) 开启后使用方法同 huggingface-cli
,如:
huggingface-cli download bigscience/bloom-560m --local-dir bloom-560m
注意:
- 开启 hf-transfer 后,下载速度提升十分明显,但网络会不稳定且默认的断点续传会失效。
设置镜像站
方式一
直接访问镜像站,获取文件URL下载链接。
镜像站地址: https://hf-mirror.com。
方式二
设置 HF_ENDPOINT 环境变量。
HF_ENDPOINT
该变量是 HF 相关库官方支持的一个环境变量,设置后,相关库会尊重该变量指定的主机名,替换 huggingface.co 域名进行模型、数据集的下载和上传,从而做到无需修改 python 的 transformers 代码,即可利用上镜像站来加载模型。具体支持以下库:
huggingface-cli
snapshot_download
from_pretrained
hf_hub_download
timm.create_model
设置方法:
以下介绍各种环境下如何设置环境变量,以及如何将环境变量的配置命令写入到终端的配置文件中,使得终端自动加载该环境变量,免去每次手动执行命令的麻烦。
Linux/Mac OS
export HF_ENDPOINT="https://hf-mirror.com"
Linux 写入到~/.bashrc
中:
echo 'export HF_ENDPOINT="https://hf-mirror.com"' >> ~/.bashrc
Windows Powershell
$env:HF_ENDPOINT = "https://hf-mirror.com"
用以下命令写入到 ~\Documents\WindowsPowerShellMicrosoft.PowerShell_profile.ps1
中:
Add-Content -Path $PROFILE -Value '$env:HF_ENDPOINT = "https://hf-mirror.com"'
Python
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
注意os.environ
得在 import huggingface 库相关语句之前执行。
下载使用示例
以下载 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B 模型为例:
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir /root/model-tmp/huggingface/deepseek7b
#或
export HF_HUB_ENABLE_HF_TRANSFER=1
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir /root/model-tmp/huggingface/deepseek7b
参考文章:
如何快速下载huggingface模型——全方法总结 - 知乎
vLLM 大模型部署推理
OpenAI 兼容服务器
vLLM 可以作为一个实现了 OpenAI API 协议的服务器进行部署。这使得 vLLM 可以直接替代使用 OpenAI API 的应用程序。默认情况下,它在 http://localhost:8000 启动服务器。您可以使用 --host
和--port
参数指定地址。当前,该服务器一次仅托管一个模型(在下面的命令中为 OPT-125M),并实现了模型列表 (list models)、创建聊天补全 (create chat completion) 和创建完成 (create completion) 端点。
启动服务器
vLLM 提供了一个实现 OpenAI Completions 和 Chat API 的 HTTP 服务器。您可以使用 vllm serve、Python 或 Docker 启动服务器。
vllm serve 启动服务器
# 启动示例
vllm serve NousResearch/Meta-Llama-3-8B-Instruct --dtype auto --api-key token-abc123
启动 HTTP 服务器如下图所示:
默认情况下,服务器使用存储在 tokenizer 中的预定义聊天模板。您可以使用 --chat-template
参数覆盖此模板:
vllm serve facebook/opt-125m --chat-template ./examples/template_chatml.jinja
如需要调用服务器,您可以使用官方的 OpenAI Python 客户端库,或任何其他 HTTP 客户端。
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="token-abc123",
)
completion = client.chat.completions.create(
model="NousResearch/Meta-Llama-3-8B-Instruct",
messages=[
{"role": "user", "content": "Hello!"}
]
)
print(completion.choices[0].message)
使用 python 启动服务器
# 使用 python 代码调用OpenAI兼容的HTTP服务器
python -m vllm.entrypoints.openai.api_server --model <download-model-dir> --served-model-name <download-model-name>
使用 Docker 启动服务器
vLLM 提供了一个官方 Docker 镜像用于部署。该镜像可用于运行与 OpenAI 兼容服务器,并且可在 Docker Hub 上以 vllm/vllm-openai 的形式获取。
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HUGGING_FACE_HUB_TOKEN=<secret>" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model mistralai/Mistral-7B-v0.1
API 参考
vllm serve 参数
vllm serve
默认会在 http://localhost:8000 启动服务器。服务器当前一次托管一个模型,并实现列表模型、completions 和 chat completions 端口。
- completions:是基本的文本生成任务,模型会在给定的提示后生成一段文本。这种类型的任务通常用于生成文章、故事、邮件等。
- chat completions:是面向对话的任务,模型需要理解和生成对话。这种类型的任务通常用于构建聊天机器人或者对话系统。
在创建服务器时,我们可以指定模型名称、模型路径、聊天模板等参数。
- --host 和 --port 参数指定链接及端口。
- --model :指定需要下载的模型名称或已经下载好的本地模型目录。
- --chat-template :参数指定聊天模板。
- --served-model-name :指定服务模型的名称。
- --max-model-len :指定模型的最大序列长度(上下文长度)。
- --gpu_memory_utilization :显存利用率参数,控制显存的使用比例。
通过 curl 命令请求
该服务器可以按照与 OpenAI API 相同的格式进行查询。例如,列出模型:
curl http://localhost:8000/v1/models
使用 curl
命令测试 OpenAI Completions API
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer token-abc123" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-R1-Distill-Qwen-1.5B",
"messages": [
{"role": "user", "content": "你是谁?"}
]
}'
更多信息请参考官方文档。
————————————————