尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

在Ubuntu 22.04 使用 vLLM 部署千问 Qwen3-8B

在Ubuntu 22.04 使用 vLLM 部署千问 Qwen3-8B 16GB 显存跑 Qwen3-8BvLLM 部署实录本文记录在 Ubuntu 22.04 Quadro RTX 500016GB 显存环境下用 vLLM 部署 Qwen3-8B 推理服务的完整过程。环境搭建到服务启动一共遇到 8 个问题下面逐个记录排查过程和解决方案。最终跑通了 Qwen3-8B-AWQ 量化版支持 48K 上下文长度、Qwen3 推理模式reasoning以及 tool calling 功能。一、环境准备1.1 创建 conda 环境conda create-nvllmpython3.12conda activate vllm1.2 安装 vLLM推荐使用uv加速安装pipinstalluv uv pipinstallvllm1.3 安装 ModelScope国内网络必需国内网络访问不了 Hugging Face需要通过 ModelScope魔搭社区下载模型uv pipinstallmodelscope1.30.0注意modelscope版本必须选1.30.0不要用最新版截至 2025 年 8 月的 1.39.x 存在兼容性问题否则 vLLM 拿不到模型文件列表。详见后文问题 22。二、系统与软件环境项目版本 / 信息操作系统Ubuntu 22.04.4 LTS内核版本6.5.0-18-genericGPUQuadro RTX 500016GB 显存驱动版本580.105.08计算能力SM 7.5Turing 架构Conda26.1.1Python3.12.13vLLM0.27.1transformers5.15.0modelscope1.30.0三、模型下载3.1 自动下载vLLM 在启动时会自动检测本地是否有模型文件没有的话就自动下载。设置环境变量VLLM_USE_MODELSCOPEtrue可以让 vLLM 走 ModelScope 下载exportVLLM_USE_MODELSCOPEtrue vllm serve Qwen/Qwen3-8B-AWQ --max-model-len49152--gpu-memory-utilization0.97--reasoning-parser qwen3这里省略了--hf-overrides参数YaRN 位置编码扩展完整命令见第四节。模型默认缓存到~/.cache/modelscope/hub/models/Qwen/Qwen3-8B-AWQ。3.2 手动下载后部署如果网络不稳定或者想提前把模型下好可以手动操作方式一使用 modelscope 命令行conda activate vllmexportVLLM_USE_MODELSCOPEtrue modelscope download--modelQwen/Qwen3-8B-AWQ--local_dir./models/Qwen3-8B-AWQ方式二使用 Python SDKfrommodelscopeimportsnapshot_download model_dirsnapshot_download(Qwen/Qwen3-8B-AWQ,cache_dir./models)方式三从网页手动下载访问 ModelScope Qwen3-8B-AWQ 模型页面手动下载所有文件到本地目录。下载好之后用本地路径启动 vLLMvllm serve ./models/Qwen3-8B-AWQ --served-model-name Qwen/Qwen3-8B-AWQ --max-model-len49152--gpu-memory-utilization0.97--reasoning-parser qwen3同样省略了--hf-overrides完整参数见第四节。四、启动命令最终验证可用的完整启动命令vllm serve Qwen/Qwen3-8B-AWQ\--port8000\--max-model-len49152\--gpu-memory-utilization0.97\--reasoning-parser qwen3\--enable-auto-tool-choice\--tool-call-parser hermes\--hf-overrides{rope_scaling:{rope_type:yarn,factor:1.5,original_max_position_embeddings:32768},rope_theta:10000000.0}参数说明参数值说明Qwen/Qwen3-8B-AWQ模型名称AWQ 4bit 量化版权重约 4.7GBBF16 原版约 16GB16GB 显存放不下--port8000服务监听端口默认 8000--max-model-len49152最大上下文长度。Qwen3-8B 原始max_position_embeddings为 40960这里通过 YaRN 扩展到了 49152详见--hf-overrides。该卡在 16GB 显存下 KV cache 上限约 52208 tokens49152 是留了余量的值--gpu-memory-utilization0.97GPU 显存利用率默认 0.9。调到 0.97 是为了多挤一些显存给 KV cache。不建议设到 1.0留一点余量避免 OOM--reasoning-parserqwen3启用 Qwen3 推理模式解析思考过程。指定该参数后 vLLM 会自动启用推理功能不需要额外加--enable-reasoning该参数在 0.27.1 已废弃--enable-auto-tool-choice-启用自动 tool choice允许客户端发送tool_choice: auto。OpenCode 等 AI 编程工具依赖此功能详见问题 4--tool-call-parserhermestool call 解析器。Qwen3 的 function calling 格式兼容 Hermes 协议设为hermes即可正确解析 tool call。与--enable-auto-tool-choice必须同时设置--hf-overridesJSON覆盖模型的 Hugging Face 配置。这里注入 YaRN rope_scaling将位置编码从 32768 扩展到 49152factor1.5同时设置rope_theta10000000.0--hf-overrides的完整 JSON 展开如下{rope_scaling:{rope_type:yarn,factor:1.5,original_max_position_embeddings:32768},rope_theta:10000000.0}补充如果使用本地路径启动如./models/Qwen3-8B-AWQ可以加--served-model-name Qwen/Qwen3-8B-AWQ指定 API 返回的模型名称否则返回的是本地路径客户端调用时也得用路径。也可以保存为脚本文件如start_vllm.sh方便重复启动#!/bin/bashsource/path/to/miniconda3/etc/profile.d/conda.sh conda activate vllmexportLD_LIBRARY_PATH$CONDA_PREFIX/lib:$LD_LIBRARY_PATHexportVLLM_USE_MODELSCOPEtrueexecvllm serve Qwen/Qwen3-8B-AWQ\--port8000\--max-model-len49152\--gpu-memory-utilization0.97\--reasoning-parser qwen3\--enable-auto-tool-choice\--tool-call-parser hermes\--hf-overrides{rope_scaling:{rope_type:yarn,factor:1.5,original_max_position_embeddings:32768},rope_theta:10000000.0}五、遇到的 8 个问题合并为 4 组问题 1libstdc 版本冲突CXXABI_1.3.15 not found报错信息ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version CXXABI_1.3.15 not found (required by .../libicui18n.so.78)原因conda 环境中的 ICU 库需要CXXABI_1.3.15但 Python 的sqlite3模块加载了系统自带的旧版libstdc.so.6。解决方案将 conda 环境的lib目录置于LD_LIBRARY_PATH最前exportLD_LIBRARY_PATH$CONDA_PREFIX/lib:$LD_LIBRARY_PATH建议写入 conda 激活脚本实现自动化mkdir-p$CONDA_PREFIX/etc/conda/activate.dcat$CONDA_PREFIX/etc/conda/activate.d/libpath.shEOF export LD_LIBRARY_PATH$CONDA_PREFIX/lib:$LD_LIBRARY_PATH export VLLM_USE_MODELSCOPEtrue EOF这样每次conda activate vllm后会自动设置好环境变量。问题 2模型下载与参数兼容性3 个小问题这三个问题都跟模型下载和 vLLM 参数有关放在一起说。1国内网络访问不了 Hugging FacevLLM 启动后长时间无响应日志反复出现Downloading Model from https://...但没进度。原因是国内网络访问不了huggingface.co和hf-mirror.com。解决设置环境变量走 ModelScope 下载exportVLLM_USE_MODELSCOPEtrue2modelscope 版本不兼容设了上面的环境变量后又报错Error retrieving file list: Type, retrying 1 of 2查了一下modelscope1.39.1当时的最新版的get_model_files()返回的字典里不再有Type字段而 vLLM 0.27.1 的modelscope_list_repo_files()靠这个字段过滤文件类型。版本对不上就挂了。解决降级到modelscope1.30.0pipinstallmodelscope1.30.03--enable-reasoning参数已废弃启动时加了--enable-reasoning报错unrecognized arguments。查了 vLLM 0.27.1 的变更这个参数已经移除了——只要指定了--reasoning-parser qwen3推理功能就会自动启用不需要额外开关。去掉--enable-reasoning就好了。问题 3显存连环坑OOM → max-model-len 超限 → KV cache 不够这三个问题是递进关系——解决了一个下一个才露出来。第一关BF16 权重直接撑爆显存torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 1.16 GiB. GPU 0 has a total capacity of 15.55 GiB of which 1.04 GiB is free.Qwen3-8B 的 BF16 权重约 16GB光加载模型就把 16GB 显存吃光了KV cache 根本没空间。换 AWQ 4bit 量化版Qwen/Qwen3-8B-AWQ权重压到约 4.7GB这才腾出地方。第二关max-model-len 校验失败换了 AWQ 之后指定--max-model-len 131072报错Value error, User-specified max_model_len (131072) is greater than the derived max_model_len (max_position_embeddings40960.0 ...)Qwen3-8B 的max_position_embeddings是 40960直接写 131072 通不过校验。需要通过--hf-overrides注入 YaRN rope_scaling 来扩展位置编码--hf-overrides{rope_scaling:{rope_type:yarn,factor:1.5,original_max_position_embeddings:32768},rope_theta:10000000.0}这样位置编码从 32768 扩展到 4915232768 × 1.5。第三关KV cache 还是不够 FP8 不支持位置编码解决了但 65536 上下文需要 9.0 GiB KV cache16GB 显存扣掉权重只剩约 7.17 GiBValueError: To serve at least one request with the models max seq len (65536), (9.0 GiB KV cache is needed, which is larger than the available KV cache memory (7.17 GiB).我试过开 FP8 KV cache 来省显存结果 Quadro RTX 5000 是 Turing 架构SM 7.5FP8 要 SM 89Ada Lovelace 起步硬件层面就不支持ValueError: FP8 KV cache is not supported by the Triton attention backend on Quadro RTX 5000 (compute capability 7.5); native FP8 (fp8e4nv) requires SM89.最终方案--max-model-len降到49152实测该卡 KV cache 上限约 52208 tokens--gpu-memory-utilization 0.97默认 0.9调高一点多挤些显存放弃 FP8 KV cache用默认的 float16问题 4OpenCode 无法使用tool_choice “auto” 报错报错信息用 OpenCodeAI 编程终端工具连接 vLLM 服务时随便问一句你是什么模型返回错误auto tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set原因OpenCode 在发送 chat completions 请求时默认会带上tool_choice: auto参数。vLLM 0.27.1 要求服务端必须同时启用--enable-auto-tool-choice和--tool-call-parser才能接受这个请求否则直接拒绝。解决方案启动命令中加上这两个参数--enable-auto-tool-choice\--tool-call-parser hermes--tool-call-parser支持多种协议hermes、mistral、llama3_json等。Qwen3 的 function calling 格式兼容 Hermes 协议所以选hermes。这两个参数必须同时设置缺一不可。注意这个问题只影响需要 tool calling 的客户端如 OpenCode、Cline 等 AI 编程工具。如果只用普通的 chat completions 接口不带 tool_choice不加这两个参数也能正常工作。六、验证服务6.1 显存使用情况服务启动后通过nvidia-smi查看显存占用----------------------------------------------------------------------------------------- | NVIDIA-SMI 580.105.08 Driver Version: 580.105.08 CUDA Version: 13.0 | |---------------------------------------------------------------------------------------| | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | || | 0 Quadro RTX 5000 Off | 00000000:01:00.0 Off | Off | | 33% 29C P5 13W / 230W | 15502MiB / 16384MiB | 0% Default | --------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------- | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | || | 0 N/A N/A 2906847 C VLLM::EngineCore 15286MiB | -----------------------------------------------------------------------------------------显存分配情况项目占用总显存16384 MiBvLLM 进程VLLM::EngineCore15286 MiB93.3%其中模型权重AWQ 4bit~4800 MiB其中KV cache49152 tokens~10272 MiB其中CUDA context / 激活缓存等~214 MiB系统占用Xorg gnome-shell~185 MiB剩余可用~913 MiB16GB 显存几乎被吃满这也印证了前面为什么要在显存上精打细算。6.2 检查模型列表curlhttp://localhost:8000/v1/models返回示例已简化仅展示关键字段{object:list,data:[{id:Qwen/Qwen3-8B-AWQ,max_model_len:49152}]}6.3 测试推理接口curlhttp://localhost:8000/v1/chat/completions\-HContent-Type: application/json\-d{ model: Qwen/Qwen3-8B-AWQ, messages: [{role: user, content: 11等于几}], max_tokens: 2048 }响应中会包含reasoning字段思考过程和content字段最终回答{choices:[{message:{role:assistant,reasoning:嗯用户问的是11等于几...,content:在标准的算术体系中**1 1 2**...},finish_reason:stop}]}提示vLLM 0.27.x 中推理内容在reasoning字段不在content里。6.4 性能测试吞吐量测试方法编写 Python 脚本通过/v1/chat/completions接口分别以非流式和流式模式调用服务。共设计 4 种典型场景中文推理、英文生成、代码生成、知识问答每种场景重复 3 次取 mean ± std。测试参数max_tokens1024、temperature0.7服务端无其他负载计时取客户端侧。非流式接口结果测试场景生成 tokens总耗时生成速度中文推理9.9 vs 9.11102415.7s65.3 ± 0.2 tok/s英文生成200 词短文781 ± 6411.8 ± 1.0s66.5 ± 0.3 tok/s代码生成Python 快排102415.7s65.1 ± 0.0 tok/s知识问答Transformer 原理102415.8s64.9 ± 0.0 tok/s流式接口结果测试场景TTFTchunks 数流式速度中文推理0.06s (0.04-0.07)1020 ± 664.6 ± 0.4 chunks/s英文生成0.05s (0.04-0.05)816 ± 3365.9 ± 0.2 chunks/s代码生成0.04s (0.04-0.05)1023 ± 164.9 ± 0.1 chunks/s知识问答0.04s (0.04-0.04)102364.9 ± 0.0 chunks/s非流式接口生成速度稳定在64.9~66.5 tok/s流式接口64.6~65.9 chunks/s首 token 延迟均在0.04~0.07s之间。三种重复测试的标准差均小于 1说明服务输出非常稳定。16GB 显存的 GPU 能有这个表现日常开发和应用验证够用了。七、已知限制限制说明不支持 FP8 KV cacheQuadro RTX 5000 为 SM 7.5FP8 KV cache 需 SM 89不支持 FlashAttention 2FA2 需 SM 80vLLM 自动回退到兼容后端最大上下文 4915216GB 显存下 KV cache 实测上限约 52208 tokens推荐设置 49152modelscope 版本受限必须使用 1.30.0新版与 vLLM 不兼容tool calling 需额外配置使用 OpenCode 等 AI 编程工具时必须加--enable-auto-tool-choice和--tool-call-parser hermes否则请求被拒绝八、总结回一下整个过程在 16GB 显存的 Quadro RTX 5000 上跑 Qwen3-8B主要做了这几件事AWQ 4bit 量化权重从 16GB 压到 4.7GB腾出 KV cache 空间YaRN 位置编码扩展从 32768 扩展到 49152拉高显存利用率gpu_memory_utilization0.97多挤一点是一点ModelScope 镜像下载国内网络绕开 Hugging Face启用 tool calling 支持加--enable-auto-tool-choice和--tool-call-parser hermes兼容 OpenCode 等 AI 编程工具最终服务支持48K 上下文长度推理模式reasoning正常工作tool calling 功能可用拿来跑本地开发和应用验证没问题。
返回列表