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 模型。

二、环境准备:构建坚实基础

在开始部署之前,我们需要准备一个合适的环境。以下是推荐的配置和步骤:

  1. 硬件要求:

    • GPU: 建议使用 NVIDIA GPU,具有足够的显存(至少 24GB,建议 48GB 或更多,具体取决于模型大小和批处理大小)。推荐使用 A100、H100 等高性能 GPU。
    • CPU: 具有足够核心数的 CPU,以支持数据预处理和后处理。
    • 内存: 足够的系统内存,以支持模型加载和运行。
  2. 软件要求:

    • 操作系统: 推荐使用 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

  3. 环境验证:

    • 运行 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会自动帮你下载并且转换,但你也可以选择先下载后转换.

  1. 模型下载:

    从 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

  2. 模型加载(可选)
    如果选择手动转换,使用以下代码来加载模型:

    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 提供了两种启动在线服务的方式:

  1. 使用 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 OpenAI

    client = 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)
    ```

  2. 使用 vLLM 的 LLM 类:

    您也可以直接在 Python 代码中使用 vLLM 的 LLM 类来构建自定义的在线服务。

    ```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)

    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 的性能,我们可以采取以下优化策略:

  1. 调整 tensor_parallel_size

    tensor_parallel_size 参数控制模型并行度,即使用多少个 GPU 来运行模型。根据您的 GPU 数量进行调整。通常,更多的 GPU 可以带来更高的吞吐量,但也会增加通信开销。需要根据实际情况进行测试和调整。

  2. 优化 SamplingParams

    SamplingParams 中的参数对生成文本的质量和多样性有很大影响。
    * temperature:控制生成文本的随机性。较高的值会产生更多样化的输出,但可能降低准确性。较低的值会产生更可预测的输出,但可能缺乏创造性。
    * top_p:控制生成文本的多样性。它只考虑概率最高的几个 token,并从中选择一个。
    * max_tokens:限制生成文本的最大长度。
    * presence_penaltyfrequency_penalty: 鼓励模型生成不同的内容
    根据您的应用场景进行调整。

  3. 启用 FlashAttention (如果支持):
    如果您的 GPU 和 CUDA 版本支持 FlashAttention,请确保已安装 flash-attn 包。vLLM 会自动使用 FlashAttention 来加速注意力计算。DeepSeek本身也使用了FlashAttention

  4. 使用更大的批处理大小:

    在显存允许的情况下,尽可能使用更大的批处理大小。这可以提高 GPU 利用率并增加吞吐量。但请注意,过大的批处理大小可能会增加延迟。

  5. 启用连续批处理(Continuous Batching):

    vLLM 默认启用连续批处理。确保您没有禁用它。

  6. 监控 GPU 利用率:

    使用 nvidia-smi 或其他 GPU 监控工具来监控 GPU 利用率、显存使用情况和温度。如果 GPU 利用率较低,可以尝试增加批处理大小或 tensor_parallel_size。如果显存不足,可以尝试减小批处理大小或使用更小的模型。

  7. 使用异步推理:

    vLLM 支持异步推理,允许您在等待结果的同时提交新的请求,提高系统的吞吐量。

    ```python
    import asyncio
    from vllm import LLM, SamplingParams

    llm = 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].text

    async 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())
    ```

  8. 使用DeepSeek提供的优化版本
    DeepSeek官方可能已经提供了量化版本或者优化版本,可以关注DeepSeek的代码仓库以获取最新信息。

六、常见问题解答

  1. 显存不足:

    • 减小批处理大小。
    • 减小 max_tokens
    • 使用更小的模型(如 deepseek-coder-1.3b-instruct)。
    • 启用模型量化(如果可用)。
  2. 推理速度慢:

    • 增加 tensor_parallel_size
    • 使用更大的批处理大小。
    • 确保已启用 FlashAttention。
    • 检查 GPU 利用率,确保 GPU 没有成为瓶颈。
  3. 生成文本质量差:

    • 调整 SamplingParams 中的 temperaturetop_p
    • 尝试使用不同的提示(prompt)。
  4. 安装 vLLM 失败

  5. vLLM可能与某些特定版本的CUDA, PyTorch不兼容, 请仔细检查版本要求.
  6. 某些依赖可能需要手动安装.

七、总结与展望

通过本文的详细介绍,您应该已经掌握了使用 vLLM 部署 DeepSeek 模型的方法,并了解了如何进行性能优化。vLLM 的 PagedAttention、连续批处理和优化的 CUDA 内核等特性,使其成为部署 DeepSeek 等大型语言模型的理想选择。

未来,随着 LLM 技术的不断发展,我们可以期待 vLLM 和 DeepSeek 在性能、功能和易用性方面持续改进。我们可以关注以下几个方面:

  • 更高效的推理算法: 研究人员正在不断探索新的推理算法,以进一步提高 LLM 的推理速度和效率。
  • 模型量化和压缩: 模型量化和压缩技术可以减小模型大小,降低显存需求,并提高推理速度。
  • 更强大的硬件支持: 随着 GPU 和其他加速器的不断发展,我们可以期待 LLM 在性能上取得更大的突破。
  • 更易用的部署工具: vLLM 等部署工具将继续改进,提供更丰富的功能和更友好的用户体验。

希望本文能为您提供有价值的参考,祝您在 LLM 部署的道路上取得成功!

THE END