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 上需要登录后才能下载,首先完成账号登录:

  1. 获取 ModelScope API Token
    打开 ModelScope 官网:https://www.modelscope.cn/,注册 / 登录你的账号;
    进入「个人中心」→「访问令牌」→「新建令牌」,输入令牌名称(如llm_download),点击「生成」;
    复制生成的API Token(一串字符串,仅显示一次,务必保存好)。
  2. 命令行登录 ModelScope
    在你的llm_deploy conda 环境中执行
# 激活环境(确保已激活)
conda activate llm_deploy

# 执行登录命令,粘贴上述API Token
modelscope login
# 按提示输入Token,回车后提示“Login successful”即为登录成功
  1. 下载 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.jsontokenizer.jsonmodel-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的快速部署,且支持后台稳定运行和结构化输出需求。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐