
> 作者:李剑锋
1. 前言
在中,我们基于百度智能云平台搭建了云端服务器,完成了 vLLM 的环境配置,并成功通过 vLLM 离线运行了 Qwen3-0.6B 模型。至此,我们已经能够在服务器上调用模型并获得回答。
但如果希望在自己的电脑上,甚至在其他应用程序中直接使用这个模型,难道每次都要登录服务器、编写代码来完成调用吗?
显然这种方式就非常复杂麻烦,也很不现实。为了解决这个问题,我们就需要去了解 vLLM 的另一项重要能力——服务化部署。
我们平时使用 DeepSeek、阿里云百炼等平台的大模型 API 时,并不需要关心模型究竟运行在哪台服务器上,只需要向指定的接口发送请求,就能获得模型返回的结果。
而借助 vLLM,我们也可以将自己部署的开源模型变成这样的 API 服务,让其他程序通过网络直接调用,而不必在每个应用中重复下载和部署模型。

那么,具体应该如何实现呢?本节课我们就以 Qwen3-0.6B 为例,从启动 vLLM 推理服务开始,一步步完成 API 接口调用与远程访问,看看如何将一个运行在云端服务器上的开源模型,真正变成一个可以供其他应用使用的大模型服务。
2. 服务启动及使用
这里我们继续使用之前在百度智能云创建的服务器。如果大家还没有完成环境配置,可以先参考上一节课的内容。当然,百度智能云只是本文采用的演示平台,使用 AutoDL 或其他支持 GPU 的云服务器,同样可以完成本次实验。
2.1 初始服务启动
首先,我们需要重新连接到云端服务器,打开终端,并激活之前创建的 vLLM 虚拟环境:
source /root/venvs/vllm/bin/activate
完成环境激活后,就可以使用 vLLM 提供的 vllm serve 命令来启动模型服务:
vllm serve /root/models/Qwen3-0.6B \
--served-model-name Qwen3-0.6B \
--host 127.0.0.1 \
--port 8000 \
--dtype half \
--max-model-len 4096 \
--max-num-seqs 8 \
--gpu-memory-utilization 0.5 \
--enforce-eager
与上一节通过 Python 脚本执行离线推理不同,vllm serve 会启动一个持续运行的推理服务,使模型能够通过 HTTP 接口接收请求并返回结果。
在这条命令中,我们指定了需要加载的模型路径,并通过 --served-model-name 将服务中的模型名称设置为 Qwen3-0.6B。同时,使用 --host 127.0.0.1 和 --port 8000,让服务暂时只监听服务器自身的 8000 端口。其余参数主要用于控制模型的运行精度、上下文长度、并发处理能力以及 GPU 显存使用情况,我们将在后续内容中进一步介绍。
执行命令后,vLLM 会开始加载模型、初始化推理引擎,并完成服务启动所需的各项准备工作。终端中也会陆续输出对应的运行日志。

当模型加载完成、服务成功启动后,终端中会显示相应的启动信息。此时,vLLM 已经开始监听我们指定的端口,等待接收 API 请求。

需要注意的是,当前的 vLLM 服务运行在前台,因此不要关闭这个终端,也不要中断正在运行的进程。接下来的测试,我们可以通过另一个终端来完成。
2.2 检查服务是否正常运行
虽然终端已经显示服务启动成功,但我们还需要确认 API 接口是否能够正常访问。为此,可以在 VS Code 中重新打开一个终端(点击 + 进行新建),同时不要关闭刚才启动的 vLLM 服务。

接下来,我们先通过 curl 命令访问 vLLM 提供的健康检查接口:
curl -i http://127.0.0.1:8000/health
这里的 /health 是 vLLM 提供的健康检查接口,主要用于确认服务当前是否能够正常响应。如果返回的 HTTP 状态码为 200 OK,就说明健康检查已经通过。

确认服务能够正常访问后,我们还可以进一步查看当前服务中有哪些可用模型。只需要访问 /v1/models 接口即可:
curl http://127.0.0.1:8000/v1/models
执行后,服务会返回一段 JSON 数据,其中包含当前已经加载的模型信息。以本次实验为例,我们能够在返回结果中看到 Qwen3-0.6B,同时还可以查看模型路径、最大上下文长度等信息。
{
"object": "list",
"data": [
{
"id": "Qwen3-0.6B",
"object": "model",
"created": 1792569653,
"owned_by": "vllm",
"root": "/root/models/Qwen3-0.6B",
"parent": null,
"max_model_len": 4096,
"permission": [
{
"id": "modelperm-aec2889bf704d82c",
"object": "model_permission",
"created": 1792569653,
"allow_create_engine": false,
"allow_sampling": true,
"allow_logprobs": true,
"allow_search_indices": false,
"allow_view": true,
"allow_fine_tuning": false,
"organization": "*",
"group": null,
"is_blocking": false
}
]
}
]
}
到这里,我们已经确认 vLLM 服务成功启动,并且能够通过 API 接口获取模型信息。不过,这还只是验证了服务的基本状态。接下来,我们尝试向模型发送一条真正的对话请求,看看它能否正常生成回答。
2.3 通过 API 接口调用模型
前面我们使用的 /health 和 /v1/models 接口,分别用于检查服务状态和获取模型信息。如果希望让模型回答问题,则需要使用 /v1/chat/completions 接口。
例如,我们可以继续使用 curl,向模型发送一个简单的问题:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-0.6B",
"messages": [
{
"role": "user",
"content": "请解释什么是大模型服务化部署"
}
],
"max_tokens": 256,
"chat_template_kwargs": {
"enable_thinking": false
}
}'
这段命令看起来比之前稍微复杂一些,但实际上并不难理解。我们通过 curl 向模型服务发送了一个 HTTP 请求,并在请求中提供了模型名称、对话内容以及生成参数。其中,messages 用来描述发送给模型的对话消息,max_tokens 用于限制本次最多生成多少个 Token,而 enable_thinking 设置为 false,则表示本次关闭 Qwen3 的思考模式,让模型直接生成回答。
执行后,我们就能够在终端中看到模型返回的结果:
{
"id": "chatcmpl-8b225d3bc6301345",
"object": "chat.completion",
"created": 1792569741,
"model": "Qwen3-0.6B",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "“大模型服务化部署”是指将大型语言模型(LLM)等生成式模型从传统的“本地部署”向“服务化部署”转变,使其能够通过API接口提供服务,从而实现可扩展、可管理、可集成的部署模式。\n\n### 服务化部署的核心特点:\n\n1. **API接口** \n 将大模型封装为RESTful API、GraphQL等标准接口,供外部调用,无需本地服务器。\n\n2. **微服务架构** \n 将模型拆分为多个独立的服务(如推理服务、缓存服务、数据服务等),提升系统的灵活性和可维护性。\n\n3. **容器化与云原生** \n 使用Docker、Kubernetes等技术,将模型部署在容器化环境中,支持弹性扩展和高可用性。\n\n4. **边缘计算与分布式部署** \n 结合边缘计算技术,模型可以在本地节点运行,减少云端依赖,提高响应速度。\n\n5. **安全性与可扩展性** \n 通过安全的API接口和细粒度的权限控制,确保模型的使用安全,同时支持大规模并发请求。\n\n### 服务化部署的优势:\n\n- **降低开发和运维成本** \n-",
"refusal": null,
"annotations": null,
"audio": null,
"function_call": null,
"reasoning": null
},
"logprobs": null,
"finish_reason": "length",
"stop_reason": null,
"token_ids": null,
"routed_experts": null
}
],
"service_tier": null,
"system_fingerprint": "vllm-0.31.0-1153e6d8",
"usage": {
"prompt_tokens": 20,
"total_tokens": 276,
"completion_tokens": 256,
"prompt_tokens_details": null,
"completion_tokens_details": null
},
"prompt_logprobs": null,
"prompt_token_ids": null,
"prompt_text": null,
"kv_transfer_params": null,
"ec_transfer_params": null,
"metrics": null
}
可以看到,模型已经根据我们提供的问题生成了相应的回答,并通过 JSON 格式将结果返回给客户端。这里可以重点关注 choices 字段,其中的 message.content 就是模型实际生成的回答,而 usage 则记录了本次请求消耗的 Token 数量。
另外,本次返回结果中的 finish_reason 为 length,表示模型生成的内容达到了我们设置的 max_tokens=256 上限,因此回答被截断了。如果希望模型输出更加完整的解释,可以适当提高这个参数。
通过这次测试,我们已经完成了一次完整的 API 调用。与之前直接在 Python 程序中加载模型不同,现在模型始终运行在 vLLM 服务中,而我们只需要向指定接口发送请求,就能够获得模型的回答。

2.4 通过 OpenAI SDK 调用模型
虽然使用 curl 可以方便地测试 API 接口,但在实际开发应用时,我们通常还是会使用 Python 来完成模型调用。
很方便的是 vLLM 提供了与 OpenAI API 兼容的接口。这意味着,我们不仅可以直接发送 HTTP 请求,还可以使用熟悉的 OpenAI Python SDK 来调用自己部署的模型,而不必重新编写复杂的接口请求逻辑。
我们可以在之前创建的 vllm-demo 文件夹中,新建一个名为 openai_chat.py 的 Python 文件。如果当前环境尚未安装 OpenAI SDK,可以先执行 pip install openai。随后,将以下代码写入文件:
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="EMPTY",
)
response = client.chat.completions.create(
model="Qwen3-0.6B",
messages=[
{"role": "user", "content": "用两句话介绍 vLLM"}
],
max_tokens=256,
extra_body={
"chat_template_kwargs": {"enable_thinking": False}
},
)
print(response.choices[0].message.content)
这段代码与平时调用 OpenAI API 的方式基本一致。我们首先创建一个 OpenAI 客户端,只不过这里的 base_url 不再指向 OpenAI 官方服务,而是指向刚才在云服务器上启动的 vLLM 接口。

由于我们目前没有为 vLLM 服务配置 API 密钥验证,因此这里暂时使用 EMPTY 作为占位值。它并不是真正的访问密钥,主要是为了满足 OpenAI SDK 创建客户端时的参数要求。后续我们可以通过设置参数的方式设置密钥。
接下来,调用 client.chat.completions.create() 方法,指定模型名称与对话内容,就能够向 vLLM 发送请求。最后,通过 response.choices[0].message.content 提取模型生成的文本,而不必手动处理完整的 JSON 响应。
完成代码编写后,我们打开终端,进入对应的虚拟环境和项目目录,再运行刚才创建的 Python 文件:
source /root/venvs/vllm/bin/activate
cd /root/vllm-demo
python openai_chat.py
如果服务正常运行,我们就能够直接在终端中看到模型生成的回答。

至此,我们不仅成功启动了 vLLM 推理服务,还分别通过 curl 和 OpenAI SDK 完成了模型调用。整个过程中,模型只需要在服务器上加载一次,后续请求都可以通过 API 接口发送给正在运行的服务,而不需要每次都重新加载模型。
不过,细心的同学可能已经注意到,目前无论是 curl 还是 Python 代码,我们使用的服务地址都是 127.0.0.1:8000。这里的 127.0.0.1 实际上指向的是服务器自身,因此当前的接口还只能在服务器内部访问。如果希望在自己的电脑上,甚至让其他应用程序通过网络访问这个模型,我们又应该如何配置呢? 这就需要进一步解决服务的网络访问问题,接下来我们可以进一步来看看如何实现。
3. 本地程序接入
在前面的实验中,我们已经成功启动了 vLLM 推理服务,并通过 curl 和 OpenAI SDK 完成了模型调用。不过,到目前为止,这些操作都是在云端服务器内部完成的。既然我们已经将模型部署成了 API 服务,那么能否直接在自己的电脑上调用它呢?答案当然是可以的。接下来,我们就尝试两种不同的访问方式:第一种是通过 SSH 连接,在本地访问云服务器中的模型;第二种则是通过公网 IP,让其他设备也能够直接调用这个模型。
3.1 通过 SSH 在本地访问模型
在上一节课中,我们已经使用 VS Code 通过 SSH 连接到了云端服务器。实际上,除了远程管理服务器以外,我们还可以借助 SSH 的端口转发功能,将云服务器上的模型服务映射到自己的电脑上。
还记得前面启动 vLLM 时设置的 --host 127.0.0.1 吗?这个地址表示服务只监听服务器自身的本地网络接口,正常情况下,其他电脑无法直接通过网络访问。
不过,如果我们通过 SSH 建立一条端口转发通道,就可以将云服务器的 8000 端口映射到自己电脑的某个端口。这样一来,即使模型实际运行在云服务器上,我们也可以使用本地地址访问它。

对于使用 VS Code Remote-SSH 的同学来说,这个过程非常简单。VS Code 本身就支持端口转发,有时还会自动检测并转发远程服务的端口。我们可以在 VS Code 的“端口(Ports)”面板中查看转发情况,如果没有自动转发,只需要手动添加远程服务器的 8000 端口即可。
完成端口转发后,我们可以打开自己电脑上的终端,例如 Windows 的 PowerShell 或 macOS 的终端,输入:
curl http://127.0.0.1:8000/v1/models
如果端口转发成功,并且本地映射使用的是 8000 端口,就能够得到与云服务器上相同的模型信息。

如果 VS Code 分配了其他本地端口,则需要将命令中的 8000 修改为实际转发的端口。当然,即使不使用 VS Code,我们也可以直接通过 SSH 命令建立这样的连接。例如,在本地终端执行:
ssh -N -L 8000:127.0.0.1:8000 root@YOUR_SERVER_IP
这里需要将 YOUR_SERVER_IP 替换为自己的云服务器公网 IP,并使用之前配置的 SSH 身份验证方式。如果采用密钥登录,还需要按照实际情况指定私钥文件。
其中,-L 表示建立本地端口转发,将自己电脑的 8000 端口连接到云服务器的 127.0.0.1:8000,而 -N 表示只建立 SSH 连接,不执行远程命令。保持这条 SSH 连接运行,我们就可以在本地的另一个终端访问模型服务。
由此可见,我们并不需要将模型下载到自己的电脑上,也不需要在本地安装 vLLM,只需要建立一条网络连接,就能够调用运行在云服务器上的模型。
不过,这种方式仍然依赖 SSH 连接。如果希望把模型接口提供给其他同学,甚至让不同设备和应用程序直接通过网络访问,每个使用者都建立 SSH 连接显然不够方便。因此,接下来我们进一步尝试通过公网 IP 访问模型服务。
3.2 通过公网 IP 访问模型
3.2.1 重启服务
要让其他设备直接访问云服务器上的模型,我们首先需要调整 vLLM 服务的监听地址。之前启动服务时,我们将 --host 设置为 127.0.0.1,这意味着服务只接受服务器本机的连接请求。如果希望让服务能够接收来自外部网络的请求,就需要将监听地址修改为 0.0.0.0。
首先,回到之前启动 vLLM 服务的终端,使用 Ctrl + C 停止当前运行的服务,然后重新执行启动命令:
source /root/venvs/vllm/bin/activate
vllm serve /root/models/Qwen3-0.6B \
--served-model-name Qwen3-0.6B \
--host 0.0.0.0 \
--port 8000 \
--dtype half \
--max-model-len 4096 \
--max-num-seqs 8 \
--gpu-memory-utilization 0.5 \
--enforce-eager
与之前相比,这条命令只修改了一个关键参数:将 --host 127.0.0.1 改为了 --host 0.0.0.0。这里的 0.0.0.0 表示让 vLLM 监听服务器上所有可用的 IPv4 网络接口,而不再局限于本地回环地址。不过,这并不代表外部设备已经能够直接访问模型。因为对于云服务器而言,除了程序本身的监听地址,还需要考虑云平台的网络访问控制。
在百度智能云中,我们可以通过安全组来管理外部网络能够访问服务器的哪些端口。因此,接下来还需要为 vLLM 使用的 8000 端口配置对应的访问规则。

3.2.2 配置云服务器安全组
首先,打开百度智能云控制台,找到之前创建的云服务器实例,并查看它关联的安全组。

进入安全组管理页面后,选择当前实例实际关联的安全组。如果之前使用的是默认安全组,就可以直接进入对应的默认安全组进行配置。

接下来,找到安全组的入站规则,点击“添加规则”,为模型服务开放对应端口。

本次实验需要配置的主要内容如下:
协议: TCP 端口: 8000 来源: 建议填写自己电脑的公网 IP,并指定 /32,仅允许该地址访问。如果需要让多个同学访问,可以分别添加对应来源规则。备注: 可以填写“vLLM 模型接口”,方便后续识别和管理。

需要特别说明的是,有些同学可能会直接将来源设置为 all,表示允许任意公网地址连接这个端口。虽然这样方便测试,但也意味着任何能够访问服务器公网 IP 的设备,都可能尝试调用我们的模型。由于当前实验还没有配置完善的身份验证和访问控制,因此不建议长期向所有公网地址开放接口。所以在实验结束应该及时删除或收紧对应的安全组规则。
3.2.3 通过公网 IP 调用模型
完成安全组配置后,如果服务器已经绑定并正确配置了公网 IP,我们就可以尝试从其他电脑访问模型了。首先,在百度智能云控制台中找到当前实例的公网 IP,然后在另一台电脑的终端输入:
curl http://120.48.157.26:8000/v1/models
同样,需要将 YOUR_SERVER_IP 替换为实际的公网 IP 地址。如果服务运行正常,并且安全组允许当前设备访问,就可以看到与之前相同的 JSON 返回结果,其中包含我们部署的 Qwen3-0.6B 模型。

不过,查询模型列表只是验证了接口的可访问性。实际上,我们还可以像之前一样,通过 /v1/chat/completions 接口向模型发送问题并获得回答。对于 Python 开发而言,甚至不需要修改之前的主要调用逻辑,只需要将 OpenAI SDK 中的 base_url 改成云服务器对应的公网地址即可:
from openai import OpenAI
client = OpenAI(
base_url="http://YOUR_SERVER_IP:8000/v1",
api_key="EMPTY",
)
response = client.chat.completions.create(
model="Qwen3-0.6B",
messages=[
{"role": "user", "content": "用两句话介绍 vLLM"}
],
max_tokens=256,
extra_body={
"chat_template_kwargs": {"enable_thinking": False}
},
)
print(response.choices[0].message.content)
这里的 EMPTY 仍然只是占位值,并不提供实际的安全保护。因此,上面的代码只适用于已经通过网络访问规则限制来源的实验环境。
不过如果准备将这个模型服务长期提供给其他用户,还需要进一步配置 HTTPS、身份验证和访问限制,例如通过反向代理统一管理外部请求,而不能简单地把未经保护的 vLLM 接口直接暴露在公网上。
4. 总结
至此,我们已经分别通过 SSH 端口转发和公网 IP 两种方式,完成了对云端模型服务的远程访问。回顾整个过程,其实模型本身始终运行在云服务器上,并没有发生变化。我们只是在不同的访问场景下,调整了客户端与模型服务之间的连接方式。这也正是大模型服务化部署的重要意义:模型只需要部署在服务器上,其他程序就可以通过统一的 API 接口调用它,而不必在每台设备上重新安装、加载和运行模型。
现在,我们已经能够像调用第三方大模型 API 一样,调用自己部署的 Qwen3-0.6B 模型了。而有了这个基础,后续无论是开发聊天应用、搭建知识库,还是将模型接入智能体系统,都可以直接使用这个 API 服务来完成模型推理。
-- 完 --
关注机智流并加入 AI 技术交流群,不仅能和来自大厂名校的 AI 开发者、爱好者一起进行技术交流,同时还有与、、、、等。
cc | 大模型技术交流群 hf | HuggingFace 高赞论文分享群 lc|LangChain 技术交流群 code | AI Coding 交流群 具身 | 具身智能交流群 硬件 | AI 硬件交流群 推理 | AI 推理框架交流群 智能体 | Agent 技术交流群