在服务器上部署兼容 OpenAI API 的 LLM 的 vLLM 方案
我们在使用 LLM 进行实验时,最开始都是调用商用 API 来获取 LLM 服务的,如果我们要本地部署 LLM,并且要兼容原先实验代码的 API 调用,则需要采取如兼容 OpenAI API 的 LLM 的本地部署方案,这里我选用 vLLM 方案实现。
采用 vLLM 方案的优势
vLLM 是伯克利大学开发的高性能推理引擎,通过 PagedAttention 技术显著减少显存占用,吞吐量比 Hugging Face Transformers 高 10-24 倍,并且原生提供 OpenAI 兼容 API,是目前生产环境的首选方案。
在 AutoDL 上的具体部署步骤
1. 创建实例并配置环境
AutoDL 平台已提供预装 vLLM 的社区镜像,可直接使用。登录 AutoDL 后,选择 RTX 4090 或 3090 实例,然后选择社区镜像 datawhalechina/self-llm/Qwen3:v1,该镜像预装了 Python 3.12、vLLM、modelscope 等必要依赖。 另外,建议在容器实例所属地区的文件存储处,进行初始化文件存储,并将后续模型下载到此处。这样后续在同地区下更换容器实例时,就不用重新下载。该文件存储在实例中的挂载目录为:/root/autodl-fs,后续步骤我们将下载的模型下载到该目录。
2. 下载模型
建议在无卡模式下开机来下载模型,因为下载模型需要花费较多时间,无卡模式开机下载会划算一些。我们通过 ModelScope 下载模型 Qwen 系列模型。在 JupyterLab 终端中执行:
bash
# 安装 modelscope(已经安装)
pip install modelscope
# 下载模型(这里以 Qwen3-8B 为例,可替换为你需要的模型)
modelscope download --model Qwen/Qwen3-8B --local_dir /root/autodl-fs/models/Qwen/Qwen3-8B
3. 启动兼容 OpenAI 的 API 服务
bash
# 启动 vLLM 服务器,暴露 OpenAI 兼容 API
VLLM_USE_MODELSCOPE=true vllm serve /root/autodl-fs/models/Qwen/Qwen3-8B \
--served-model-name Qwen3-8B \
--max_model_len 8192 \
--host 0.0.0.0 \
--port 8000
服务默认监听 http://0.0.0.0:8000,已兼容 OpenAI API。vLLM 支持 Chat Completions API (/v1/chat/completions)、Completions API (/v1/completions) 和 Models API (/v1/models)。
host 和 port 的区别
在部署 API 服务时,--host 和 --port 这两个参数分工明确:
- host(主机地址):决定服务"监听在哪个网络接口上"
- port(端口号):决定服务"占用哪个数字通道"
用现实比喻理解
把服务器想象成一栋大楼:
- Host 就是大楼的"地址"(决定只让楼内的人访问,还是让任何来找这栋楼的人都能进门)
- Port 就是大楼里的"房间号"(不同服务使用不同房间,互不干扰)
详细解释------Host 常见的取值和含义
| 值 | 含义 | 谁能访问 |
|---|---|---|
127.0.0.1 / localhost |
仅监听本机回环地址 | 只能在本机内部访问,外部无法连接 |
0.0.0.0 |
监听所有网络接口 | 能被同一网络中的任何设备访问(包括通过公网 IP 或隧道) |
具体 IP(如 192.168.1.5) |
只监听该 IP 对应的网卡 | 只有通过该 IP 访问的请求才会被接受 |
在 AutoDL 等云服务器上部署时,几乎总是要用
--host 0.0.0.0,否则即使做了端口转发,外部也无法连接到容器内的 API。
详细解释------Port 的常见知识
- 是一个 0 ~ 65535 的数字,通常使用 1024 ~ 49151 的范围
- 每个端口同一时间只能被一个程序占用
- 不同服务默认端口不同,例如:
- HTTP 常用
80 - vLLM 常设为
8000 - Ollama 用
11434
- HTTP 常用
核心区别
- Host 管"范围" → 谁能找到这个服务
- Port 管"入口" → 找到后从哪个门进来
示例命令:
bash
vllm serve /path/to/model --host 0.0.0.0 --port 8000
含义: "在本机的所有网络接口上,开放 8000 端口,提供模型推理服务。"
同一个环境中,不能有两个服务同时占用同一个 host:port 组合,但可以通过改变端口在同台机器上启动多个服务(例如 8000、8001 各一个)。
4. 测试 API
注意,如果是在无卡模式下,下载模型后需要重新进入非无卡模式来测试和调用本地模型。
bash
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-8B",
"messages": [
{"role": "user", "content": "你好,请介绍一下你自己"}
]
}'
5. 使用 OpenAI SDK 调用本地模型
Python
from openai import OpenAI
# 设置 base_url 指向本地服务,api_key 可任意填写
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="sk-not-needed"
)
response = client.chat.completions.create(
model="Qwen3-8B",
messages=[{"role": "user", "content": "你好!"}]
)
print(response.choices[0].message.content)