在自己的服务器上搭建VLLM 以Qwen3.5-0.8B与Qwen3.5-4B为模型基础

总目录 大模型安全研究论文整理 2026年版:https://blog.csdn.net/WhiffeYF/article/details/159047894

b站视频:https://www.bilibili.com/video/BV1Tot66eESd/

在自己的服务器上搭建 vLLM:以 Qwen3.5-0.8B 和 Qwen3.5-4B 为例

文章目录

  • [在自己的服务器上搭建 vLLM:以 Qwen3.5-0.8B 和 Qwen3.5-4B 为例](#在自己的服务器上搭建 vLLM:以 Qwen3.5-0.8B 和 Qwen3.5-4B 为例)
    • [1 检查服务器环境](#1 检查服务器环境)
    • [2 创建独立的 Conda 环境](#2 创建独立的 Conda 环境)
    • [3 检查磁盘空间并安装 uv](#3 检查磁盘空间并安装 uv)
    • [4 安装 vLLM](#4 安装 vLLM)
    • [5 确认模型目录](#5 确认模型目录)
    • [6 启动 Qwen3.5-0.8B](#6 启动 Qwen3.5-0.8B)
    • [7 测试接口](#7 测试接口)
    • [8 切换到 Qwen3.5-4B](#8 切换到 Qwen3.5-4B)

这篇文章记录一次实际的 vLLM 部署过程。使用的服务器有 6 张 RTX 3090,系统通过 Conda 管理 Python 环境,模型已经提前下载到本地磁盘。

本文先用 Qwen3.5-0.8B 完成服务启动和接口测试。Qwen3.5-4B 的目录也一并列出,切换模型时只需要调整模型路径和服务名称。

1 检查服务器环境

先查看显卡、驱动和当前显存占用情况:

bash 复制代码
nvidia-smi

这台服务器的情况如下:

  • NVIDIA 驱动版本为 575.64.03
  • 驱动最高支持 CUDA 12.9
  • 共有 6 张 RTX 3090,每张显存 24GB
  • GPU 4 当时基本空闲,因此后面的单卡测试使用 GPU 4

nvidia-smi 中显示的 CUDA 12.9,表示当前驱动能够支持的最高 CUDA 版本,不等同于系统中安装的 CUDA Toolkit 版本。

再确认 Conda 可以正常使用:

bash 复制代码
conda --version

本次使用的版本是:

bash 复制代码
conda 24.9.2

2 创建独立的 Conda 环境

为了避免 vLLM、PyTorch 和现有项目互相影响,单独创建一个 Python 3.12 环境:

bash 复制代码
conda create -n vllm python=3.12 -y

创建完成后激活:

bash 复制代码
conda activate vllm

检查 Python 版本和路径:

bash 复制代码
python --version

本次输出为:

bash 复制代码
Python 3.12.14
bash 复制代码
which python
bash 复制代码
/home/winstonYF/.conda/envs/vllm/bin/python

所以当前环境:

bash 复制代码
环境名:vllm
Python:3.12.14
路径:/home/winstonYF/.conda/envs/vllm/bin/python

只要 which python 指向刚创建的 vllm 环境,就可以继续安装。

3 检查磁盘空间并安装 uv

vLLM、PyTorch 和 CUDA 运行库需要占用数 GB 空间。安装前先确认 Home 目录所在磁盘还有足够容量:

bash 复制代码
df -h "$HOME"

本次服务器还有约 330GB 可用空间:

bash 复制代码
Filesystem      Size  Used Avail Use% Mounted on /dev/sdc1       2.2T  1.8T  330G  85% /home

接着在当前 Conda 环境 (vllm) 中安装 uv:

bash 复制代码
python -m pip install -U uv

确认 uv 的版本和路径:

bash 复制代码
uv --version
bash 复制代码
uv 0.12.9 (x86_64-unknown-linux-gnu)
bash 复制代码
which uv 
bash 复制代码
(vllm) winstonYF@zyserver-R5300-G5:~$ which uv /home/winstonYF/.conda/envs/vllm/bin/uv

这里使用 uv 只是为了更快地解析和安装 Python 依赖。Conda 仍然负责创建和隔离环境,两者并不冲突。

4 安装 vLLM

这台服务器使用 CUDA 12.9 对应的 vLLM nightly wheel:

bash 复制代码
uv pip install -U vllm \
  --reinstall-package vllm \
  --torch-backend=cu129 \
  --extra-index-url https://wheels.vllm.ai/nightly/cu129

显式指定 cu129,可以避免自动选择到与当前运行环境不匹配的 CUDA wheel。--reinstall-package vllm 会重新安装 vLLM 本身,其余已经满足要求的依赖不会全部重复安装。

安装完成后做一次检查:

bash 复制代码
vllm --version

python -c "import torch, vllm; \
print('torch:', torch.__version__); \
print('cuda:', torch.version.cuda); \
print('cuda_available:', torch.cuda.is_available()); \
print('gpu:', torch.cuda.get_device_name(0)); \
print('vllm:', vllm.__version__)"

uv pip check

本次安装得到的主要版本为:

text 复制代码
vLLM 0.28.1rc1.dev278+g73029d424.cu129
PyTorch 2.13.0+cu129
CUDA available: True
GPU: NVIDIA GeForce RTX 3090
All installed packages are compatible

5 确认模型目录

本次使用的两个模型位于:

bash 复制代码
Qwen3.5 0.8B:/mnt/sda_8t/winstonYF/model/Qwen/Qwen3.5-0.8B
Qwen3.5 4B:/mnt/sda_8t/winstonYF/model/Qwen/Qwen3.5-4B

6 启动 Qwen3.5-0.8B

先确认 8000 端口没有被其他程序占用:

bash 复制代码
ss -ltn 'sport = :8000'

端口 8000 空闲。

bash 复制代码
(vllm) winstonYF@zyserver-R5300-G5:~$ ss -ltn 'sport = :8000'
State                   Recv-Q                   Send-Q                                     Local Address:Port                                     Peer Address:Port                  Process   

如果输出中只有表头,没有监听记录,说明端口当前空闲。

模型服务需要持续运行,建议放在 tmux 中:

bash 复制代码
tmux new -s yf

进入 tmux 后重新激活环境,并确认当前调用的是这个环境中的 vLLM:

bash 复制代码
conda activate vllm
which vllm

然后启动模型,启动 0.8B 模型:

bash 复制代码
CUDA_VISIBLE_DEVICES=4 \
OMP_NUM_THREADS=1 \
VLLM_USE_FLASHINFER_SAMPLER=0 \
vllm serve \
  /mnt/sda_8t/winstonYF/model/Qwen/Qwen3.5-0.8B \
  --served-model-name Qwen3.5-0.8B \
  --host 127.0.0.1 \
  --port 8000 \
  --tensor-parallel-size 1 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.80

这组参数中,CUDA_VISIBLE_DEVICES=4 指定物理 GPU 4;OMP_NUM_THREADS=1 用来减少 CPU 线程争抢;VLLM_USE_FLASHINFER_SAMPLER=0 则是针对这台服务器 CUDA Toolkit 状态所做的兼容处理。

--host 127.0.0.1 表示接口只允许服务器本机访问。如果需要从其他机器直接访问,应当根据服务器的网络和安全策略调整监听地址,不能只修改这一项就把服务暴露到公网。

启动完成后,日志中会出现类似内容:

text 复制代码
Starting vLLM server on http://127.0.0.1:8000
Application startup complete.

此时按 Ctrl+B,松开后再按 D,可以退出 tmux,同时让 vLLM 继续在后台运行。之后使用下面的命令可以重新进入:

bash 复制代码
tmux attach -t yf

7 测试接口

先检查服务是否正常:

bash 复制代码
curl -i http://127.0.0.1:8000/health

返回 HTTP/1.1 200 OK 后,再发送一条实际的对话请求:

bash 复制代码
curl -sS http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.5-0.8B",
    "messages": [
      {
        "role": "user",
        "content": "请只回复四个字:测试成功"
      }
    ],
    "max_tokens": 32,
    "temperature": 0
  }'

本次返回结果中包含:

bash 复制代码
(base)
winstonYF@zyserver-R5300-G5:~$
curl -sS [http://127.0.0.1:8000/v1/chat/completions](http://127.0.0.1:8000/v1/chat/completions) 
  -H "Content-Type: application/json"

  -d '{
    "model":
"Qwen3.5-0.8B",
    "messages": [
      {
        "role": "user",
        "content": "请只回复四个字:测试成功"
      }
    ],
    "max_tokens": 32,
    "temperature": 0
  }'
{"id":"chatcmpl-80c4461292a4731c","object":"chat.completion","created":1788404532,"model":"Qwen3.5-0.8B","choices":[{"index":0,"message":{"role":"assistant","content":"测试成功","refusal":null,"annotations":null,"audio":null,"function_call":null,"reasoning":null},"logprobs":null,"finish_reason":"stop","stop_reason":null,"token_ids":null,"routed_experts":null}],"service_tier":null,"system_fingerprint":"vllm-0.28.1rc1.dev278+g73029d424-3b1927b8","usage":{"prompt_tokens":19,"total_tokens":22,"completion_tokens":3,"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}(base)
winstonYF@zyserver-R5300-G5:~$

推理测试已经通过。

关键结果:

bash 复制代码
"model": "Qwen3.5-0.8B"
"content": "测试成功"
"finish_reason": "stop"

8 切换到 Qwen3.5-4B

如果要改用 Qwen3.5-4B,先在 tmux 中按 Ctrl+C 停止当前服务,再把启动命令中的模型路径和服务名称替换为:

text 复制代码
模型路径:/mnt/sda_8t/winstonYF/model/Qwen/Qwen3.5-4B
服务名称:Qwen3.5-4B

也就是分别修改下面两处:

bash 复制代码
/mnt/sda_8t/winstonYF/model/Qwen/Qwen3.5-4B
--served-model-name Qwen3.5-4B

显存比例、上下文长度和使用哪张 GPU,需要根据启动时的实际显存占用决定。共享服务器上的 GPU 状态会变化,每次启动前都应重新执行 nvidia-smi,不要直接占用正在运行任务的显卡。

相关推荐
程序猿乐锅1 小时前
【计算机组成原理 | 第八章】I/O系统
运维·服务器·网络
青瓦梦滋2 小时前
Linux高级IO
linux·运维·服务器·网络·网络协议·tcp/ip
꯭自꯭闭꯭2 小时前
达梦(DM8)安装测试
linux·运维·服务器·数据库
牢姐与蒯2 小时前
Linux进程(七).进程控制
linux·运维·服务器·ubuntu
Mr. zhihao2 小时前
Linux 内存惰性分配:从虚拟地址到物理页的深度解析
linux·服务器·内存分配
努力努力再努力wz2 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构
光电笑映2 小时前
Linux 线程编程:从进程、分页到线程控制与封装
linux·运维·服务器·c++
wzg20162 小时前
本地部署Deepseek-coder + Vscode + Continue 插件(3)启动与关闭deepseek-coder大模型
linux·运维·服务器
凯哥Java2 小时前
接口采集工具自动化验证文章(测试发布,可删除)
运维·自动化