Qwen3-14B vLLM 从 0 到 1 部署方案(包含详细步骤跟着做就可以部署)
本文详细介绍了Qwen3-14B大模型基于vLLM框架的部署方案,包含INT8量化和API服务搭建。部署要求:48GB显存显卡(如RTX 6000 Ada)、32GB内存、50GB存储空间,推荐Ubuntu 24.04系统。核心步骤包括:1)创建conda环境并安装Python 3.10、PyTorch 2.1.0+cu120等基础依赖;2)配置vLLM 0.14.1、bitsandbytes 0
Qwen3-14B vLLM 从 0 到 1 部署方案(包含详细步骤跟着做就可以部署)
Qwen3-14B 大模型 vLLM 部署方案(从0到1,INT8量化+API服务)
一、前置准备(正式操作从第二章开始)
1. 硬件要求(如果是自己笔记本可以降低模型参数量,选择4B或1B的模型)
-
显卡:≥48GB 显存(我用的是 RTX 6000 Ada 48G),支持 CUDA 12.0+
-
内存:≥32GB(避免模型加载时内存溢出)
-
存储:≥50GB 空闲空间(存放原生FP16模型文件)
2. 软件依赖
-
操作系统:Ubuntu 24.04(推荐,对CUDA兼容性更好)
-
环境管理:Miniconda(如何安装和使用Miniconda,可以自行找教程学习,需新建一个全新的环境,我的conda环境命名为llm_deploy)
-
核心依赖:
-
Python 3.10
-
PyTorch 2.1.0+cu120(必须适配CUDA版本)
-
vLLM 0.14.1(实测版本)
-
bitsandbytes 0.41.1(动态INT8量化依赖)
-
transformers 4.40.0(模型加载辅助依赖)
-
-
下面是我部署成功的服务器上全部pip安装包,可以保存为 requirements.txt 后,通过 pip install -r requirements.txt 复现环境(注意其中有一些是和显卡相关的库,如果不是上面那张显卡可能安装库的版本会有所不同,不建议一键导入环境,可以先跟着后面步骤走,缺少哪个库再回头对照一下这些库安装的哪个版本,再单独安装对应的库)(注意要先新建conda环境,再安装下面的包)
accelerate==1.12.0
addict==2.4.0
aiohappyeyeballs==2.6.1
aiohttp==3.13.3
aiosignal==1.4.0
airportsdata==20250909
aliyun-python-sdk-core==2.16.0
aliyun-python-sdk-kms==2.16.5
annotated-doc==0.0.4
annotated-types==0.7.0
anthropic==0.71.0
anyio==4.12.1
apache-tvm-ffi==0.1.8.post2
astor==0.8.1
asttokens==3.0.1
async-timeout==5.0.1
attrs==25.4.0
backports.zstd==1.3.0
bitsandbytes==0.49.1
blake3==1.0.8
blobfile==3.0.0
brotli==1.2.0
build==1.4.0
cachetools==6.2.5
cbor2==5.8.0
certifi==2026.1.4
cffi==2.0.0
charset-normalizer==3.4.4
click==8.3.1
cloudpickle==3.1.2
compressed-tensors==0.13.0
crcmod==1.7
cryptography==46.0.3
cuda-bindings==12.9.4
cuda-pathfinder==1.3.3
cuda-python==12.9.0
cupy-cuda12x==13.6.0
datasets==2.18.0
decorator==5.2.1
decord2==3.0.0
depyf==0.20.0
dill==0.3.8
diskcache==5.6.3
distro==1.9.0
dnspython==2.8.0
docstring_parser==0.17.0
einops==0.8.2
email-validator==2.3.0
exceptiongroup==1.3.1
executing==2.2.1
fastapi==0.128.0
fastapi-cli==0.0.20
fastapi-cloud-cli==0.11.0
fastar==0.8.0
fastrlock==0.8.3
filelock==3.20.3
flashinfer-cubin==0.5.3
flashinfer-python==0.5.3
frozenlist==1.8.0
fsspec==2024.2.0
gast==0.7.0
gguf==0.17.1
grpcio==1.76.0
grpcio-health-checking==1.75.1
grpcio-reflection==1.76.0
grpcio-tools==1.75.1
h11==0.16.0
hf_transfer==0.1.9
hf-xet==1.2.0
httpcore==1.0.9
httptools==0.7.1
httpx==0.28.1
httpx-sse==0.4.3
huggingface-hub==0.36.0
idna==3.11
ijson==3.4.0.post0
inflate64==1.0.4
interegular==0.3.3
ipython==8.38.0
jedi==0.19.2
jinja2==3.1.6
jiter==0.12.0
jmespath==0.10.0
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
lark==1.2.2
llguidance==1.3.0
llvmlite==0.44.0
lm-format-enforcer==0.11.3
loguru==0.7.3
lxml==6.0.2
markdown-it-py==4.0.0
markupsafe==3.0.3
matplotlib-inline==0.2.1
mcp==1.26.0
mdurl==0.1.2
mistral_common==1.8.8
model-hosting-container-standards==0.1.13
modelscope==1.34.0
mpmath==1.3.0
msgpack==1.1.2
msgspec==0.20.0
multidict==6.7.1
multiprocess==0.70.16
multivolumefile==0.2.3
nest-asyncio==1.6.0
networkx==3.4.2
ninja==1.13.0
numba==0.61.2
numpy==2.2.6
nvidia-cublas-cu12==12.8.4.1
nvidia-cuda-cupti-cu12==12.8.90
nvidia-cuda-nvrtc-cu12==12.8.93
nvidia-cuda-runtime-cu12==12.8.90
nvidia-cudnn-cu12==9.10.2.21
nvidia-cudnn-frontend==1.17.0
nvidia-cufft-cu12==11.3.3.83
nvidia-cufile-cu12==1.13.1.3
nvidia-curand-cu12==10.3.9.90
nvidia-cusolver-cu12==11.7.3.90
nvidia-cusparse-cu12==12.5.8.93
nvidia-cusparselt-cu12==0.7.1
nvidia-cutlass-dsl==4.3.5
nvidia-ml-py==13.590.48
nvidia-nccl-cu12==2.27.5
nvidia-nvjitlink-cu12==12.8.93
nvidia-nvshmem-cu12==3.3.20
nvidia-nvtx-cu12==12.8.90
openai==2.6.1
openai-harmony==0.0.4
opencv-python-headless==4.13.0.90
orjson==3.11.5
oss2==2.19.1
outlines_core==0.2.11
packaging==26.0
pandas==2.3.3
parso==0.8.5
partial-json-parser==0.2.1.1.post7
pexpect==4.9.0
pillow==12.1.0
pip==25.3
platformdirs==4.5.1
prometheus_client==0.24.1
prometheus-fastapi-instrumentator==7.1.0
prompt_toolkit==3.0.52
propcache==0.4.1
protobuf==6.33.4
psutil==7.2.1
ptyprocess==0.7.0
pure_eval==0.2.3
py-cpuinfo==9.0.0
py-spy==0.4.1
py7zr==1.1.2
pyarrow==23.0.0
pyarrow-hotfix==0.7
pybase64==1.4.3
pybcj==1.0.7
pycountry==24.6.1
pycparser==3.0
pycryptodome==3.23.0
pycryptodomex==3.23.0
pydantic==2.12.5
pydantic_core==2.41.5
pydantic-extra-types==2.11.0
pydantic-settings==2.12.0
pygments==2.19.2
pyjwt==2.10.1
pyppmd==1.3.1
pyproject_hooks==1.2.0
python-dateutil==2.9.0.post0
python-dotenv==1.2.1
python-json-logger==4.0.0
python-multipart==0.0.22
pytz==2025.2
pyyaml==6.0.3
pyzmq==27.1.0
quack-kernels==0.2.4
ray==2.53.0
referencing==0.37.0
regex==2026.1.15
requests==2.32.5
rich==14.3.1
rich-toolkit==0.17.1
rignore==0.7.6
rpds-py==0.30.0
safetensors==0.7.0
scipy==1.15.3
sentencepiece==0.2.1
sentry-sdk==2.50.0
setproctitle==1.3.7
setuptools==80.9.0
sgl-kernel==0.3.21
shellingham==1.5.4
simplejson==3.20.2
six==1.17.0
sniffio==1.3.1
sortedcontainers==2.4.0
soundfile==0.13.1
sse-starlette==3.2.0
stack-data==0.6.3
starlette==0.50.0
supervisor==4.3.0
sympy==1.14.0
tabulate==0.9.0
texttable==1.7.0
tiktoken==0.12.0
timm==1.0.16
tokenizers==0.22.2
tomli==2.4.0
torch==2.9.1
torch_c_dlpack_ext==0.1.5
torch_memory_saver==0.0.9
torchao==0.9.0
torchaudio==2.9.1
torchcodec==0.8.0
torchvision==0.24.1
tqdm==4.67.1
traitlets==5.14.3
transformers==4.57.1
triton==3.5.1
typer==0.21.1
typer-slim==0.21.1
typing_extensions==4.15.0
typing-inspection==0.4.2
tzdata==2025.3
urllib3==2.6.3
uvicorn==0.40.0
uvloop==0.22.1
vllm==0.14.1
watchfiles==1.1.1
wcwidth==0.5.0
websockets==16.0
wheel==0.45.1
xgrammar==0.1.29
xxhash==3.6.0
yapf==0.43.0
yarl==1.22.0
3. 模型文件准备
https://modelscope.cn/models/Qwen/Qwen3-14B
模型从魔塔社区下载,需要先注册魔塔社区账号,然后在终端使用账号里的token登录,解决 ModelScope 登录问题(必须步骤)
Qwen3 系列模型在 ModelScope 上需要登录后才能下载,首先完成账号登录:
- 获取 ModelScope API Token
打开 ModelScope 官网:https://www.modelscope.cn/,注册 / 登录你的账号;
进入「个人中心」→「访问令牌」→「新建令牌」,输入令牌名称(如llm_download),点击「生成」;
复制生成的API Token(一串字符串,仅显示一次,务必保存好)。 - 命令行登录 ModelScope
在你的llm_deploy conda 环境中执行
# 激活环境(确保已激活)
conda activate llm_deploy
# 执行登录命令,粘贴上述API Token
modelscope login
# 按提示输入Token,回车后提示“Login successful”即为登录成功
-
下载 Qwen3-14B 原生FP16模型(无需预量化),存放路径示例(请根据自己磁盘位置修改,此处修改后后续的文件中的路径对应都要修改,我就以下面这个路径为例):
/home/chenshuaifei/llm_models/qwen3-14b-int8/Qwen/Qwen3-14B
使用python执行下面安装脚本:
from modelscope import snapshot_download
import os
# 【可选】若命令行登录失败,可在这里直接登录(替换为你的API Token)
# login(token="你的ModelScope API Token")
# 你的目标下载路径(严格按你要求的路径)
save_dir = "/home/chenshuaifei/llm_models/qwen3-14b-int8"
os.makedirs(save_dir, exist_ok=True)
# 下载Qwen3-14B-Chat官方版(ModelScope正确ID)
try:
model_dir = snapshot_download(
model_id="Qwen/Qwen3-14B", # 修正后的正确模型ID
cache_dir=save_dir,
revision="master"
)
print(f"模型下载完成,存储路径:{model_dir}")
print("提示:该版本为原始未量化版,后续需用vLLM量化为INT8/INT4适配你的显卡")
except Exception as e:
print(f"下载失败,错误信息:{e}")
print("排查方向:1. API Token是否正确 2. 网络是否能访问ModelScope 3. 模型ID是否正确")
- 核心文件校验:确保模型目录包含
config.json、tokenizer.json、model-00001-of-xxx.safetensors(或.bin)等文件
核心文件清单:
config.json:模型配置文件;
model.safetensors:量化后的模型权重文件(可能分多个分片);
tokenizer.json:分词器文件;
generation_config.json:推理配置文件。
二、核心部署步骤(INT8量化+API服务)
步骤1:创建并激活conda环境(此处开始正式操作)
# 创建环境
conda create -n llm_deploy python=3.10 -y
# 激活环境
conda activate llm_deploy
步骤2:安装依赖包(举几个核心的包)
# 安装PyTorch(适配CUDA 12.0)
pip install torch==2.9.1+cu120 torchvision==0.24.1+cu120 torchaudio==2.9.1+cu120 -f https://download.pytorch.org/whl/torch_stable.html
# 安装vLLM及量化依赖
pip install vllm==0.14.1 bitsandbytes==0.41.1 transformers==4.40.0 accelerate==0.29.3 pydantic==2.5.2
# 安装其他辅助依赖
pip install uvloop requests
步骤3:编写vLLM配置文件(关键,避免参数错误)
在 /home/chenshuaifei/llm_models 目录下创建 qwen3_vllm_int8.yaml,内容如下:
# Qwen3-14B INT8量化部署配置(vLLM 0.14.1适配)
model: /home/chenshuaifei/llm_models/qwen3-14b-int8/Qwen/Qwen3-14B # 你的模型路径
tensor_parallel_size: 1 # 单卡部署
gpu_memory_utilization: 0.7 # 显存利用率(48GB显卡推荐0.7,预留足够空间)
quantization: bitsandbytes # 动态INT8量化(无需预量化文件,成功率最高)
dtype: float16 # 计算精度
trust_remote_code: true # 适配Qwen3自定义架构
port: 8000 # API服务端口
host: 0.0.0.0 # 允许内网访问
served_model_name: qwen3-14b-int8 # 调用API时的模型名
max_num_batched_tokens: 8192 # 批量处理token数(提升并发)
max_num_seqs: 64 # 最大并发请求数
seed: 42 # 固定随机种子(输出稳定)
步骤4:设置环境变量(解决版本冲突+优化显存)(此处无冲突可以跳过)
conda activate llm_deploy
# 1. 跳过flashinfer版本校验(vLLM 0.14.1常见冲突)
export FLASHINFER_DISABLE_VERSION_CHECK=1
# 2. 优化PyTorch显存分配(减少碎片,避免OOM)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
# 3. 终止残留进程(释放GPU显存)
pkill -f python
pkill -f vllm
步骤5:启动vLLM API服务
# 进入配置文件目录
cd /home/chenshuaifei/llm_models
# 启动服务(使用配置文件,避免命令行参数冗余)
vllm serve --config qwen3_vllm_int8.yaml
步骤6:验证服务可用性(必做)
方式1:curl命令快速验证
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "qwen3-14b-int8",
"messages": [{"role": "user", "content": "你好!"}],
"max_tokens": 500
}'
成功标志:返回包含 assistant 回复的JSON,无报错。
{
"id": "chatcmpl-87c5aca55844572e",
"object": "chat.completion",
"created": 1769507453,
"model": "qwen3-14b-int8",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "<think>\n好的,用户发来“你好!”,我需要友好回应。首先,确认用户是否在测试我的反应,或者只是普通问候。作为AI助手,我应该保持热情和专业。接下来,考虑用户可能的意图,可能是想开始对话,或者有具体问题需要帮助。需要保持开放式的回应,鼓励用户进一步说明需求。同时,注意用词简洁,避免过于复杂的句子。检查是否有需要特别注意的文化差异或语境因素,但中文环境下一般没问题。最后,确保回复符合品牌形象,保持亲切感。现在,用中文回复用户,表达问候并邀请其提出问题或需求。\n</think>\n\n你好!很高兴见到你!😊 有什么我可以帮你的吗?或者你想聊些什么呢?",
"refusal": null,
"annotations": null,
"audio": null,
"function_call": null,
"tool_calls": [
],
"reasoning": null,
"reasoning_content": null
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null,
"token_ids": null
}
],
"service_tier": null,
"system_fingerprint": null,
"usage": {
"prompt_tokens": 10,
"total_tokens": 165,
"completion_tokens": 155,
"prompt_tokens_details": null
},
"prompt_logprobs": null,
"prompt_token_ids": null,
"kv_transfer_params": null
}
方式2:Python脚本验证(结构化输出场景)
创建 test_api.py:
import requests
import json
API_URL = "http://localhost:8000/v1/chat/completions"
payload = {
"model": "qwen3-14b-int8",
"messages": [
{
"role": "user",
"content": "请提取以下储能电站电池电压时序数据的偏差特征:时间戳-电压值:2026-01-01 00:00:00-3.2V,2026-01-01 00:05:00-3.35V,2026-01-01 00:10:00-3.4V,偏差过大定义为单体电压与同组平均电压差值≥0.1V。仅输出JSON:{\"偏差峰值\":\"xxx\",\"持续时长\":\"xxx\",\"波动幅度\":\"xxx\"}"
}
],
"temperature": 0.1,
"max_tokens": 200
}
response = requests.post(API_URL, json=payload, timeout=30)
result = response.json()
print("结构化输出结果:", result["choices"][0]["message"]["content"])
运行验证:
python3 test_api.py
成功标志:输出符合要求的结构化JSON。
三、后台稳定运行(生产环境必备)
1. 编写启动脚本 start_qwen3.sh
#!/bin/bash
# 激活conda环境
source /home/chenshuaifei/miniconda3/etc/profile.d/conda.sh
conda activate llm_deploy
# 优化环境变量
export FLASHINFER_DISABLE_VERSION_CHECK=1
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
# 终止旧进程(避免端口占用/显存泄漏)
pkill -f python
pkill -f vllm
# 后台启动服务,日志输出到vllm_qwen3.log
cd /home/chenshuaifei/llm_models
nohup vllm serve --config qwen3_vllm_int8.yaml > vllm_qwen3.log 2>&1 &
# 输出启动状态
echo "Qwen3-14B服务已后台启动!"
echo "日志查看:tail -f vllm_qwen3.log"
echo "停止服务:pkill -f vllm"
2. 启动后台服务
# 赋予执行权限
chmod +x start_qwen3.sh
# 启动
./start_qwen3.sh
3. 停止服务(如需重启)
pkill -f vllm
四、部署过程中遇到的困难与解决办法
| 序号 | 困难现象 | 核心原因 | 解决办法 |
|---|---|---|---|
| 1 | 报错 invalid choice: 'api_server'/'server' |
vLLM 0.10+版本废弃api_server,且无server子命令 |
统一使用 vllm serve 子命令(正确命令) |
| 2 | 报错 flashinfer-cubin version does not match |
flashinfer组件版本冲突(vLLM依赖) | 设置环境变量 export FLASHINFER_DISABLE_VERSION_CHECK=1 跳过校验 |
| 3 | 报错 Cannot find the config file for awq/gptq |
GPTQ/AWQ是静态预量化,需要提前生成量化配置文件(如gptq_config.json),原生模型无此文件 |
改用 quantization: bitsandbytes(动态量化,无需预量化文件) |
| 4 | 报错 unrecognized arguments: --quantization-kwargs |
vLLM 0.14.1不支持quantization-kwargs参数 |
移除配置文件中的quantization_kwargs,仅保留quantization: bitsandbytes |
| 5 | 报错 CUDA out of memory(显存不足) |
1. 其他进程占用显存;2. gpu_memory_utilization设置过高 |
1. 执行 pkill -f python 终止残留进程;2. 降低gpu_memory_utilization至0.6-0.7 |
| 6 | 报错 AttributeError: type object 'LLM' has no attribute 'is_cuda_available' |
vLLM 0.14.1移除了旧版方法 | 用PyTorch验证CUDA:python -c "import torch; print(torch.cuda.is_available())" |
| 7 | 启动后API调用无响应 | 端口占用或服务未完全启动 | 1. 检查端口:`netstat -tulpn |
五、后续优化建议
1. 性能优化(提升推理速度/并发)
-
若需更高性能,可先对模型做GPTQ预量化,再修改配置
quantization: gptq(vLLM对GPTQ有kernel级优化,速度提升10%-30%) -
调整
max_num_batched_tokens(如16384)和max_num_seqs(如128),根据显卡显存扩容并发能力
2. 结构化输出优化(适配储能数据提取场景)
-
调用API时固定
temperature=0.1(降低随机性) -
在prompt中明确要求「仅输出JSON,无多余文字」,避免模型输出思考内容
3. 监控与维护
-
实时监控GPU状态:
watch -n 1 nvidia-smi(确认显存占用≈15-18GB,量化生效) -
定期清理日志:
echo "" > vllm_qwen3.log(避免日志过大)
六、总结
本方案基于实际环境(vLLM 0.14.1、RTX 6000 Ada),选择「bitsandbytes动态INT8量化」作为核心方案,避开了GPTQ/AWQ预量化的复杂步骤,成功率最高。核心关键是:适配vLLM版本的子命令和配置参数、解决flashinfer版本冲突、释放GPU显存。按步骤操作可实现从0到1的快速部署,且支持后台稳定运行和结构化输出需求。
更多推荐



所有评论(0)