VLLM部署DeepSeek:详细教程与性能优化
使用 vLLM 部署 DeepSeek:详细教程与性能优化
DeepSeek 凭借其卓越的性能和开源特性,已成为大语言模型 (LLM) 领域的一颗新星。然而,要充分发挥 DeepSeek 的潜力,高效的部署至关重要。vLLM 作为一个专为 LLM 服务设计的快速、高效的推理和服务引擎,为 DeepSeek 的部署提供了理想的解决方案。
本文将深入探讨如何使用 vLLM 部署 DeepSeek 模型,涵盖从环境准备、模型转换、服务启动到性能优化的全过程。我们将提供详细的步骤说明、代码示例和实用技巧,帮助您轻松完成部署并实现最佳性能。
一、vLLM 简介:为 LLM 而生
在深入部署细节之前,我们先来了解一下 vLLM 及其核心优势:
- PagedAttention: vLLM 的核心创新是 PagedAttention 算法。它通过将注意力键和值存储在非连续内存空间中,解决了传统注意力机制的内存碎片化问题,显著提高了内存利用率和吞吐量。
- 连续批处理(Continuous Batching): vLLM 支持连续批处理,这意味着它可以动态地将新的请求添加到正在运行的批次中,而无需等待当前批次完成。这大大减少了延迟并提高了整体吞吐量。
- 优化的 CUDA 内核: vLLM 采用了高度优化的 CUDA 内核,充分利用 GPU 的计算能力,进一步提升了推理速度。
- 易于使用: vLLM 提供了简洁的 API 和丰富的工具,使得部署和管理 LLM 服务变得非常容易。
- 与 Hugging Face 集成: vLLM 与 Hugging Face Transformers 库无缝集成,可以轻松加载和使用各种 Hugging Face 模型。
二、环境准备:构建坚实基础
在开始部署之前,我们需要准备一个合适的环境。以下是推荐的配置和步骤:
-
硬件要求:
- GPU: 建议使用 NVIDIA GPU,具有足够的显存(至少 24GB,建议 48GB 或更多,具体取决于模型大小和批处理大小)。推荐使用 A100、H100 等高性能 GPU。
- CPU: 具有足够核心数的 CPU,以支持数据预处理和后处理。
- 内存: 足够的系统内存,以支持模型加载和运行。
-
软件要求:
- 操作系统: 推荐使用 Linux 发行版(如 Ubuntu 20.04 或更高版本)。
- CUDA: 安装与您的 GPU 兼容的 CUDA Toolkit(建议 11.8 或更高版本)。
- cuDNN: 安装与 CUDA 版本匹配的 cuDNN 库。
- Python: 安装 Python 3.8 或更高版本。
- PyTorch: 安装与 CUDA 版本兼容的 PyTorch(建议 2.0 或更高版本)。
-
vLLM: 通过 pip 安装 vLLM:
bash
pip install vllm
* DeepSeek模型: 安装DeepSeek所需要的依赖
bash
pip install transformers>=4.39.0
pip install flash-attn
-
环境验证:
- 运行
nvidia-smi
确认 GPU 正常工作。 -
运行以下 Python 代码验证 PyTorch 和 CUDA 是否正确安装:
python
import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
- 运行
三、模型获取与转换
通常,你可以直接从 Hugging Face Hub 下载 DeepSeek 模型,vLLM会自动帮你下载并且转换,但你也可以选择先下载后转换.
-
模型下载:
从 Hugging Face Hub 下载 DeepSeek 模型(例如
deepseek-ai/deepseek-coder-6.7b-instruct
):bash
git lfs install
git clone https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct -
模型加载(可选)
如果选择手动转换,使用以下代码来加载模型:python
from vllm import LLM, SamplingParams
# 第一次使用,会自动从 Hugging Face Hub 下载模型并进行转换
llm = LLM(model="deepseek-ai/deepseek-coder-6.7b-instruct")
四、使用 vLLM 部署 DeepSeek
vLLM 提供了两种主要的部署方式:在线服务(Online Serving)和离线批处理(Offline Batching)。
4.1 在线服务:实时响应
在线服务适用于需要实时响应的场景,如聊天机器人、实时翻译等。vLLM 提供了两种启动在线服务的方式:
-
使用 OpenAI 兼容的 API 服务器:
vLLM 可以启动一个与 OpenAI API 兼容的服务器,这意味着您可以使用任何与 OpenAI API 兼容的客户端(如
openai
Python 包)来与 vLLM 服务交互。bash
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/deepseek-coder-6.7b-instruct \
--tensor-parallel-size 1 # 根据你的GPU数量进行调整启动成功后,您可以使用以下代码进行测试:
```python
from openai import OpenAIclient = OpenAI(api_key="EMPTY", base_url="http://localhost:8000/v1")
completion = client.chat.completions.create(
model="deepseek-ai/deepseek-coder-6.7b-instruct",
messages=[
{"role": "user", "content": "Hello, who are you?"}
]
)
print(completion.choices[0].message.content)
``` -
使用 vLLM 的
LLM
类:您也可以直接在 Python 代码中使用 vLLM 的
LLM
类来构建自定义的在线服务。```python
from vllm import LLM, SamplingParamsllm = LLM(model="deepseek-ai/deepseek-coder-6.7b-instruct")
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=256)def generate(prompt):
outputs = llm.generate([prompt], sampling_params)
return outputs[0].outputs[0].text构建你自己的服务逻辑,例如使用 Flask 或 FastAPI 框架
print(generate("Explain the difference between lists and tuples in Python."))
```
4.2 离线批处理:高效吞吐
离线批处理适用于需要处理大量请求但不要求实时响应的场景,如批量翻译、文本摘要等。
```python
from vllm import LLM, SamplingParams
llm = LLM(model="deepseek-ai/deepseek-coder-6.7b-instruct")
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=256)
prompts = [
"What is the capital of France?",
"Translate 'Hello' to Spanish.",
"Summarize the plot of Hamlet."
]
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated text: {output.outputs[0].text}")
print("-" * 20)
```
五、性能优化:榨干每一滴算力
为了充分发挥 vLLM 和 DeepSeek 的性能,我们可以采取以下优化策略:
-
调整
tensor_parallel_size
:tensor_parallel_size
参数控制模型并行度,即使用多少个 GPU 来运行模型。根据您的 GPU 数量进行调整。通常,更多的 GPU 可以带来更高的吞吐量,但也会增加通信开销。需要根据实际情况进行测试和调整。 -
优化
SamplingParams
:SamplingParams
中的参数对生成文本的质量和多样性有很大影响。
*temperature
:控制生成文本的随机性。较高的值会产生更多样化的输出,但可能降低准确性。较低的值会产生更可预测的输出,但可能缺乏创造性。
*top_p
:控制生成文本的多样性。它只考虑概率最高的几个 token,并从中选择一个。
*max_tokens
:限制生成文本的最大长度。
*presence_penalty
和frequency_penalty
: 鼓励模型生成不同的内容
根据您的应用场景进行调整。 -
启用 FlashAttention (如果支持):
如果您的 GPU 和 CUDA 版本支持 FlashAttention,请确保已安装flash-attn
包。vLLM 会自动使用 FlashAttention 来加速注意力计算。DeepSeek本身也使用了FlashAttention -
使用更大的批处理大小:
在显存允许的情况下,尽可能使用更大的批处理大小。这可以提高 GPU 利用率并增加吞吐量。但请注意,过大的批处理大小可能会增加延迟。
-
启用连续批处理(Continuous Batching):
vLLM 默认启用连续批处理。确保您没有禁用它。
-
监控 GPU 利用率:
使用
nvidia-smi
或其他 GPU 监控工具来监控 GPU 利用率、显存使用情况和温度。如果 GPU 利用率较低,可以尝试增加批处理大小或tensor_parallel_size
。如果显存不足,可以尝试减小批处理大小或使用更小的模型。 -
使用异步推理:
vLLM 支持异步推理,允许您在等待结果的同时提交新的请求,提高系统的吞吐量。
```python
import asyncio
from vllm import LLM, SamplingParamsllm = LLM(model="deepseek-ai/deepseek-coder-6.7b-instruct", asynchronous=True)
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=256)async def generate(prompt):
outputs = await llm.generate([prompt], sampling_params)
return outputs[0].outputs[0].textasync def main():
tasks = [
generate("What is the capital of France?"),
generate("Translate 'Hello' to Spanish."),
]
results = await asyncio.gather(*tasks)
for result in results:
print(result)asyncio.run(main())
``` -
使用DeepSeek提供的优化版本:
DeepSeek官方可能已经提供了量化版本或者优化版本,可以关注DeepSeek的代码仓库以获取最新信息。
六、常见问题解答
-
显存不足:
- 减小批处理大小。
- 减小
max_tokens
。 - 使用更小的模型(如
deepseek-coder-1.3b-instruct
)。 - 启用模型量化(如果可用)。
-
推理速度慢:
- 增加
tensor_parallel_size
。 - 使用更大的批处理大小。
- 确保已启用 FlashAttention。
- 检查 GPU 利用率,确保 GPU 没有成为瓶颈。
- 增加
-
生成文本质量差:
- 调整
SamplingParams
中的temperature
和top_p
。 - 尝试使用不同的提示(prompt)。
- 调整
-
安装 vLLM 失败
- vLLM可能与某些特定版本的CUDA, PyTorch不兼容, 请仔细检查版本要求.
- 某些依赖可能需要手动安装.
七、总结与展望
通过本文的详细介绍,您应该已经掌握了使用 vLLM 部署 DeepSeek 模型的方法,并了解了如何进行性能优化。vLLM 的 PagedAttention、连续批处理和优化的 CUDA 内核等特性,使其成为部署 DeepSeek 等大型语言模型的理想选择。
未来,随着 LLM 技术的不断发展,我们可以期待 vLLM 和 DeepSeek 在性能、功能和易用性方面持续改进。我们可以关注以下几个方面:
- 更高效的推理算法: 研究人员正在不断探索新的推理算法,以进一步提高 LLM 的推理速度和效率。
- 模型量化和压缩: 模型量化和压缩技术可以减小模型大小,降低显存需求,并提高推理速度。
- 更强大的硬件支持: 随着 GPU 和其他加速器的不断发展,我们可以期待 LLM 在性能上取得更大的突破。
- 更易用的部署工具: vLLM 等部署工具将继续改进,提供更丰富的功能和更友好的用户体验。
希望本文能为您提供有价值的参考,祝您在 LLM 部署的道路上取得成功!