基于vLLM的DeepSeek模型部署与接口调用实践

1. 背景

大语言模型(LLM)的崛起,尤其是开源模型如 DeepSeek-LLM,正在重塑自然语言处理(NLP)的格局。 其强大的能力正被越来越多的公司和机构所青睐,用于提升生产力,优化工作流程。

对于软件开发工程师而言,掌握大模型应用开发已成为一项必备技能。 无论是构建智能对话系统、开发个性化推荐引擎,还是实现自动化文本生成,DeepSeek-LLM 等开源模型都为你提供了强大的工具和无限的可能性。

本篇文章将介绍如何基于 vLLM 部署 DeepSeek-LLM 模型,并通过 OpenAI 兼容 API 进行接口调用。

Ollama 提供了一种便捷的大模型部署方式,而 vLLM 则更贴近企业级需求。 因此,本文将重点介绍 vLLM 的部署和使用。关于 Ollama 和 vLLM 的具体区别,建议读者自行查阅资料进行分析和判断。

2. 环境准备

机器硬件

我使用的机器配置如下:

  • 操作系统:Ubuntu-server-22
  • 显卡:RTX 2080Ti 11GB
  • 内存:32GB

低一些的显卡也没问题,我这里是部署了最小的1.5B 的 deepseek 模型。

软件准备

CUDA 安装

vLLM 依赖 CUDA 进行 GPU 加速。首先安装 CUDA 。
参考官方文档:https://developer.nvidia.com/cuda-downloads
根据自己的机器和系统选择对应的命令进行安装。

我使用的安装命令如下:

1
2
3
4
5
6
7
8
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb

sudo dpkg -i cuda-keyring_1.1-1_all.deb

sudo apt-get update

sudo apt-get -y install cuda-toolkit-12-8

安装完成后,重启机器。

miniconda 安装

Miniconda 是一个轻量级的 Anaconda 发行版,专注于核心功能:包管理和环境管理。 主要功能是用来做 python 环境隔离,防止你电脑中其它项目使用的 python 版本和依赖与当前项目冲突。

miniconda 的安装包可以使用清华大学提供的镜像仓库,找到符合自己要求的安装包下载安装。

清华大学仓库地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda

我这边的安装命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 下载 conda 安装脚本,这里是从官网找到的地址,用清华的也一样
curl -0 https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# 执行脚本安装 miniconda
sh Miniconda3-latest-Linux-x86_64.sh

# 初始化,这里根据自己conda的安装路径来执行,我安装的目录是 ~/miniconda3/
~/miniconda3/bin/conda init

# 配置刷新
source ~/.bashrc

# 创建一个名称为deepseek的环境
conda create -n deepseek python=3.11.0

# 激活环境
conda activate deepseek

# 设置pip国内源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


vLLM 安装

直接使用 pip 安装 vllm 的 sdk 即可。

1
2
# 安装 vllm sdk
pip install vllm

3. 下载和准备 DeepSeek 模型

DeepSeek 提供了开源的大模型,你可以通过 Hugging Face 或 DeepSeek 官方渠道下载模型。

huggingface 是国外流行的模型社区,但是国内访问比较麻烦。在国内我们可以在魔塔社区上找对应的大模型,然后使用魔塔的 sdk 进行下载。

魔塔社区地址:https://modelscope.cn/models

首先安装魔塔的 sdk:

1
2
# 下载 modelscope sdk
pip install modelscope

然后再魔塔社区找到自己需要的大模型 id,比如我这里使用了DeepSeek-R1-Distill-Qwen-1.5B 模型,模型 id 是:deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

模型下载:

新建一个 download.py 脚本文件,内容如下:

1
2
3
4
5
6
7
8
from modelscope.hub.snapshot_download import snapshot_download

# 下载deepseek模型
# model_id 模型的id
# cache_dir 缓存到本地的路径
model_dir = snapshot_download(
model_id='deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B',
cache_dir='/root/model')

执行脚本开始下载模型,时间和网络有关系。

1
2
# 执行脚本,下载deepseek模型
python download.py

4. 使用 vLLM 启动 deepseek

模型下载完毕后,就可以运行 vLLM 命令来部署 deepseek 了。

vLLM 是一个高效的推理加速库,它支持大语言模型的高吞吐量推理。你可以用以下命令启动 vLLM 服务器:

1
2
3
4
5
6
7
8
9
10
11
python -m vllm.entrypoints.openai.api_server \
--served-model-name deepseek-r1 \
--model /root/model/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
--trust-remote-code \
--host 0.0.0.0 \
--port 8080 \
--max-model-len 2048 \
--tensor-parallel-size 1 \
--gpu_memory_utilization 0.8 \
--enforce-eager \
--dtype float16

基本参数说明:

  • --model:指定加载的模型路径
  • --host:限制服务请求的 ip 地址,0表示不限制。
  • --port:服务端口, 我们指定了8080.
  • --tensor-parallel-size:设置模型张量并行的 GPU 数量,适用于多 GPU 环境。
  • --gpu-memory-utilization:控制 GPU 显存的使用率,避免显存溢出。
  • --dtype:指定精度,精度太高,显卡可能支持不了。

其他参数大家可参考 vLLM 相关文档。

下图是成功启动模型后的示例:

5. 接口调用示例

vLLM 提供了 OpenAI 兼容的 API,可以直接在 apifox 进行接口调用测试:

http 接口示例:

1
2
3
4
5
6
7
8
9
10
11
curl --location --request POST 'http://127.0.0.1:8080/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "deepseek-r1",
"messages": [
{
"role": "user",
"content": "我是谁"
}
]
}'

接口响应结果示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"id": "chatcmpl-957834efdc504c37b8865fee02f3bb10",
"object": "chat.completion",
"created": 1741089755,
"model": "deepseek-r1",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": null,
"content": "好,用户问“我是谁”,这是一个常见的自我介绍。我不知道用户是谁,可能是学生、刚加入某个组织的人,或者只是单纯想知道是否能自我介绍一次。我需要简洁明了地回答,然后给出进一步的信息,让自己易于理解和喜欢。首先,自我介绍一般包括性别、年龄、兴趣爱好、荣誉和成就等。比如,用户是男性,18岁,喜欢阅读,曾获得Math竞赛冠军,主修统计学,还有学生组织成员。这样可以全面展示一个人的多方面情况。此外,建议用户提供更多信息可以更准确地回答。最后,保持语气友好,采用这样的回复应该能够满足用户的需求。\n</think>\n\n您好!您是想找找自我介绍吗?自我介绍通常包括您自己的性别、年龄、职业、学历等信息。以下是一个简单的自我介绍示例:\n\n**自我介绍**\n您好!我是XXX,是一个18岁的男性,而在2007年被评为某著名跑到�次的著名选手。曾主修统计学,并在Marshallworld上注册为御 hamburger。我希望这段自我介绍能帮助到您,感谢您访问我。\n\n如果您有更多关于您自己或您的问题,随时告诉我哦!(如果您还有其他问题,欢迎提出)。",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 7,
"total_tokens": 265,
"completion_tokens": 258,
"prompt_tokens_details": null
},
"prompt_logprobs": null
}

6. 开发一个简单的文本翻译接口

假设我们要使用大模型,提供一个文本翻译的接口。

需求:把输入的中文,翻译成英文。

我们需要使用 python 开发一个 http 服务,提供翻译接口。

首先安装相关 sdk。

1
2
# 安装openai,fastapi,uvicorn依赖
pip install openai fastapi uvicorn[standard]

因为我不需要 deepseek 的思考过程 (<think> 前面的相关内容”), 可以重新部署 deepseek ,添加参数 reasoning-parser 来关闭响应中的思考文本:

1
2
3
4
5
6
7
8
9
10
11
12
13
python -m vllm.entrypoints.openai.api_server \
--served-model-name deepseek-r1 \
--model /root/model/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
--trust-remote-code \
--host 0.0.0.0 \
--port 8080 \
--max-model-len 2048 \
--tensor-parallel-size 1 \
--gpu_memory_utilization 0.8 \
--enforce-eager \
--dtype float16 \
--enable-reasoning \
--reasoning-parser deepseek_r1

好,下面可以开始进行 python 脚本的开发工作了。

新建一个脚本文件 deepseek-server.py,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from openai import OpenAI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import re

app = FastAPI()

# 配置DeepSeek客户端
client = OpenAI(
api_key="xxx", # 没有设置key校验,所以这里随便写一个就行
base_url="http://localhost:8080/v1" # DeepSeek服务api地址
)

class TranslationRequest(BaseModel):
text: str # 接收待翻译的中文文本

@app.post("/translate")
async def translate(request: TranslationRequest):
try:
response = client.chat.completions.create(
model="deepseek-r1", # 指定模型‌
messages=[
{"role": "system", "content": "你是一名专业翻译,需将中文准确翻译为英文,保持原意且语法正确"},
{"role": "user", "content": request.text}
],
temperature=0.3 # 控制输出稳定性‌
)
# <think>没有了,但是响应结果开头还有两个/n/n,这里进行字符截取
response_txt = response.choices[0].message.content[2:]
return {"translation": response_txt}
except Exception as e:
print(e)
raise HTTPException(status_code=500, detail=str(e))

使用 uvicorn 启动服务,端口设置为8000:

1
uvicorn deepseek-server:app --port 8000 --log-level debug

使用 postman 测试翻译接口:

这样一个基于 deepseek 大模型的,简单的翻译接口就开发完成了。

7. 总结

写这篇文章的目的,主要还是让自己能够了解大模型使用的一个基本流程,为后续了解更多的大模型开发知识打个基础。

本人水平有限,如有错误,恳请指正。

8. 参考资料

04-DeepSeek-R1-Distill-Qwen-7B vLLM 部署调用.md.

vLLM CPU和GPU模式署和推理 Qwen2 等大语言模型详细教程

vLLM 部署 DeepSeek-R1

各个系统官方文档和 deepseek 。


基于vLLM的DeepSeek模型部署与接口调用实践
https://wydpp.com/posts/a75cb552.html
作者
老段
发布于
2025年3月5日
许可协议