1. 环境准备
1
| wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
|
1
| bash Miniforge3-$(uname)-$(uname -m).sh
|
1
2
| echo "export PATH=$HOME/miniforge3/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
|
1
| conda create -n vllm python=3.12
|
目前 vllm 要求 Python 3.9+
2. 推理测试
2.1 模型准备
海外
1
| export MODEL_REPO=https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat
|
国内
1
| export MODEL_REPO=https://hf-mirror.com/Qwen/Qwen1.5-1.8B-Chat
|
1
| nerdctl run --rm -v ./:/runtime registry.cn-beijing.aliyuncs.com/shaowenchen/git lfs clone $MODEL_REPO
|
2.2 单卡
1
| export CUDA_VISIBLE_DEVICES=1
|
1
2
3
4
5
6
7
| python3 -m vllm.entrypoints.openai.api_server \
--model Qwen1.5-1.8B-Chat \
--served-model-name Qwen1.5-1.8B-Chat \
--trust-remote-code \
--dtype=half \
--host 0.0.0.0 \
--port 30000
|
由于测试设备是 V100,这里使用 half 精度。
1
2
3
4
5
6
7
8
9
10
11
12
| curl http://127.0.0.1:30000/v1/models | jq .
{
"object": "list",
"data": [
{
"id": "Qwen1.5-1.8B-Chat",
"object": "model",
"owned_by": "vllm",
...
}
]
}
|
1
2
3
4
5
6
7
8
9
| curl http://127.0.0.1:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen1.5-1.8B-Chat",
"messages": [
{"role": "user", "content": "什么是大模型"}
],
"max_tokens": 1024
}'
|
查看 Metrics 指标
1
| curl http://127.0.0.1:30000/metrics
|
2.3 多卡
指定卡号
1
| export CUDA_VISIBLE_DEVICES=1,3
|
如果单个卡无法加载模型,可以进行张量拆分到多个卡上。
1
2
3
4
5
6
7
8
| python3 -m vllm.entrypoints.openai.api_server \
--model Qwen1.5-1.8B-Chat \
--served-model-name Qwen1.5-1.8B-Chat \
--tensor-parallel-size 2 \
--trust-remote-code \
--dtype=half \
--host 0.0.0.0 \
--port 30000
|
2.4 向量化 Embed
RAG 应用中,需要将数据进行向量化,用于检索召回,这里测试一下向量化的功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| from vllm import LLM
model = LLM(
model="Qwen1.5-1.8B-Chat",
task="embed",
enforce_eager=True,
dtype="half",
)
datas = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
outputs = model.embed(datas)
[output.prompt_token_ids for output in outputs]
|
使用 embed 可以将数据批量向量化:
1
2
3
4
| [[9707, 11, 847, 829, 374],
[785, 4767, 315, 279, 3639, 4180, 374],
[785, 6722, 315, 9625, 374],
[785, 3853, 315, 15235, 374]]
|
3. Lora 支持
3.1 模型准备
海外
1
| export MODEL_REPO=https://huggingface.co/Speeeed/Qwen1.5-1.8B-Chat-wsc-lora
|
国内
1
| export MODEL_REPO=https://hf-mirror.com/Speeeed/Qwen1.5-1.8B-Chat-wsc-lora
|
除了刚才的基座模型,额外再下载一个 lora 模型。
1
| nerdctl run --rm -v ./:/runtime registry.cn-beijing.aliyuncs.com/shaowenchen/git lfs clone $MODEL_REPO
|
3.2 加载 lora
1
| export CUDA_VISIBLE_DEVICES=1
|
1
2
3
4
5
6
7
8
9
| python3 -m vllm.entrypoints.openai.api_server \
--model Qwen1.5-1.8B-Chat \
--served-model-name Qwen1.5-1.8B-Chat \
--trust-remote-code \
--dtype=half \
--host 0.0.0.0 \
--port 30000 \
--enable-lora \
--lora-modules wsc-lora=Qwen1.5-1.8B-Chat-wsc-lora
|
1
2
3
4
5
6
| curl http://127.0.0.1:30000/v1/models | jq . | grep id
"id": "Qwen1.5-1.8B-Chat",
"id": "modelperm-9d467dd1a39b4c81bf412255a9cc8729",
"id": "wsc-lora",
"id": "modelperm-137c35f3ad7d427a9d754e8ff87e953f",
|
1
2
3
4
5
6
7
8
9
| curl http://127.0.0.1:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "wsc-lora",
"messages": [
{"role": "user", "content": "什么是大模型"}
],
"max_tokens": 1024
}'
|
3.3 动态 lora
vLLM 允许通过 API 动态加载和卸载 lora,而不需要重启服务。
1
2
| export CUDA_VISIBLE_DEVICES=1
export VLLM_ALLOW_RUNTIME_LORA_UPDATING=True
|
1
2
3
4
5
6
7
8
| python3 -m vllm.entrypoints.openai.api_server \
--model Qwen1.5-1.8B-Chat \
--served-model-name Qwen1.5-1.8B-Chat \
--trust-remote-code \
--dtype=half \
--host 0.0.0.0 \
--port 30000 \
--enable-lora
|
此时在 curl http://127.0.0.1:30000/v1/models
中只有一个模型 Qwen1.5-1.8B-Chat
。
1
2
3
4
5
6
| curl -X POST http://localhost:30000/v1/load_lora_adapter \
-H "Content-Type: application/json" \
-d '{
"lora_name": "wsc-lora",
"lora_path": "Qwen1.5-1.8B-Chat-wsc-lora"
}'
|
返回 Success: LoRA adapter 'wsc-lora' added successfully.
表示加载成功。此时在 ‘/v1/models’ 中会出现 wsc-lora
模型。
1
2
3
4
5
| curl -X POST http://localhost:30000/v1/unload_lora_adapter \
-H "Content-Type: application/json" \
-d '{
"lora_name": "wsc-lora"
}'
|
返回 Success: LoRA adapter 'wsc-lora' removed successfully.
表示卸载成功。
4. vLLm vs Triton Inference Server
4.1 性能指标
指标 | vLLM | Triton Inference Server |
---|
吞吐量 | vLLM 实现了高吞吐量,特别是在多用户场景中,由于其高效的 GPU 内存利用。 | Triton 在与某些后端配对时表现出强大的吞吐量。然而,它通常无法达到 vLLM 所展示的峰值性能。 |
延迟 | vLLM 具有低延迟,在处理较长输出时表现更优。 | Triton 表现出低延迟,尽管它比 vLLM 的延迟相对较高,主要是由于缺少 vLLM 中的专门优化。 |
TTFT | vLLM 针对大型语言模型进行了优化,可以更快地生成初始令牌,从而降低 TTFT。 | Triton 也具有低 TTFT,但它可能因配置不同而有所变化,这间接地影响了 TTFT。 |
4.2 功能
功能 | vLLM | Triton Inference Server |
---|
支持的模型 | vLLM 支持大多数开源 LLM、混合专家和多模态模型如 LLaVA。 | Triton 支持多种框架和后端,允许部署各种模型类型,包括 LLM。 |
量化选项 | vLLM 支持 AWQ、GPTQ、Marlin(结合 GPTQ、AWQ 和 FP8)、INT8(W8A8)、FP8(W8A8)、AQLM、bitsandbytes、DeepSpeedFP 和 GGUF。 | Triton 支持多种框架和后端,能够适应广泛的量化技术,包括 vLLM 支持的技术。 |
LoRA 适配器 | vLLM 具有强大的 LoRA 支持,允许在运行时动态加载和卸载适配器。提供灵活的模型切换能力。 | Triton 通过自定义后端支持 LoRA,并且可以同时管理多个模型版本。 |
批处理能力 | vLLM 支持连续批处理,新请求动态添加到现有批次中。 | Triton 具有动态批处理算法,将单个请求组合成优化的批次以提高吞吐量。 |
流式支持 | vLLM 提供内置的流式输出支持,实现与 LLM 的实时交互。 | Triton 通过 gRPC 和 HTTP/REST API 支持流式推理,适用于实时应用。 |
API 兼容性 | vLLM 提供实现 OpenAI 的 Completions 和 Chat API 的 HTTP 服务器。 | Triton 提供 RESTful API 和 gRPC 端点,支持各种客户端集成。 |
社区与支持 | vLLM 拥有活跃的 GitHub 和专门的 Discord 社区。vLLM 团队通过定期聚会促进参与。 | Triton 通过 NVIDIA 论坛和 GitHub 仓库获得社区支持。 |
文档 | vLLM 文档涵盖安装、配置、高级用法如模型量化和分布式推理,提供教程和示例。 | Triton 具有广泛的文档,但用户常常因其功能和配置的复杂性而感到不知所措。 |
4.3 易用性
易用性 | vLLM | Triton Inference Server |
---|
安装 | vLLM 可以通过 pip 和 Docker 轻松安装。 | Triton 可以通过 Docker 安装,但由于不同模型框架的各种配置要求和依赖关系,过程可能较为复杂。 |
4.4 GPU 并行性
方面 | vLLM | Triton Inference Server |
---|
GPU 并行性 | vLLM 通过其创新的张量和流水线并行性在最大化 GPU 并行性方面表现出色。 | Triton 支持使用自定义后端进行多 GPU 和多节点部署。它具有可用于流水线并行性的模型集成功能。 |
4.5 硬件兼容性和云部署选项
方面 | vLLM | Triton Inference Server |
---|
硬件兼容性 | vLLM 支持多种选项,包括 Nvidia CUDA GPU、AMD ROCm GPU、AWS Neuron、CPU、OpenVINO、TPU 和 XPU。 | Triton 兼容 Nvidia CUDA GPU 和 Intel CPU。 |
云部署选项 | vLLM 设计为云无关,提供在各种云提供商中部署的灵活性。 | Triton 可以部署在任何云平台上,并与 Kubernetes 集成,以实现可扩展的微服务架构。 |
来源 https://www.inferless.com/learn/vllm-vs-triton-inference-server-choosing-the-best-inference-library-for-large-language-models
5. 与 Triton Inference Server 集成
Triton Server 是一个推理框架,提供以下功能:
vLLM 与 Triton Server 集成,由 https://github.com/triton-inference-server/vllm_backend 提供,vLLM 也是 Triton Server 支撑的后端之一。
6. 总结
本篇主要是测试 vLLM 的推理功能,包括单卡、多卡、向量化 Embed、Lora 支持、动态 Lora。
同时,整理了一下 vLLM 与 Triton Inference Server 的对比,包括性能指标、功能、易用性、GPU 并行性、硬件兼容性和云部署选项等。
与之前测试 Triton Inference Server 相比,vLLM 的易用性更好,很快就能部署起来。如果能作为,私有化、公有云的统一推理框架,将会给部署带来极大便利
7. 参考