本教程的环境边界

使用Linux、已安装NVIDIA驱动与Container Toolkit的独立测试服务器,建议从单张24GB或更大显存卡开始验证8B BF16模型。8.2B参数乘2字节只得到约16.4GB权重量级,缓存和运行时还需额外空间;24GB不是任意上下文、任意并发都能运行的保证。本文根据官方模型卡和vLLM接口编写,命令需在目标GPU实际复核,不宣称本站已进行实机跑分。

固定使用vLLM 0.18.0作为接口示例。对RTX 50系列等新架构,要先确认该镜像包含合适的CUDA与PyTorch构建,不要以容器启动成功代替算子兼容验证。已有业务环境不要原地升级。

下载完整模型并记录版本

先在可以访问模型仓库的机器下载,再将整个目录复制到内网。需要保留config、Tokenizer、聊天模板、索引和所有分片,不能只复制最大的safetensors文件。

python3 -m venv .download-env
source .download-env/bin/activate
pip install 'huggingface_hub[cli]'
mkdir -p /srv/models/qwen3-8b
hf download Qwen/Qwen3-8B --local-dir /srv/models/qwen3-8b
find /srv/models/qwen3-8b -name '*.safetensors' -exec sha256sum {} \;
nvidia-smi

正式复现要给hf download补上--revision提交号,并将提交号、下载时间和哈希保存到交付清单。仅记录main会让后续下载得到不同内容。上面的目录是示例专用路径,不要覆盖已有模型仓库。

以保守容量启动服务

docker run -d --name qwen3-test --gpus all --shm-size 8g \
  -p 127.0.0.1:8000:8000 \
  -v /srv/models/qwen3-8b:/model:ro \
  vllm/vllm-openai:v0.18.0 /model \
  --served-model-name qwen3-8b --max-model-len 4096 \
  --max-num-seqs 2 --gpu-memory-utilization 0.85
docker logs -f qwen3-test
curl -f http://127.0.0.1:8000/health
curl -f http://127.0.0.1:8000/v1/models

这里仅绑定本机,避免未鉴权服务直接出现在公网。--max-model-len是本次服务的上限,不是改写模型本身能力;4096应覆盖输入与生成总长度。预留显存后还有其他程序占用时,启动仍可能失败。先停掉测试任务或选择空闲GPU,不要强制重置别人的训练卡。

在请求中明确关闭思考

import requests
payload = {
    'model': 'qwen3-8b',
    'messages': [{'role':'user','content':'用三句话解释KV缓存。'}],
    'max_tokens': 512,
    'temperature': 0.7,
    'top_p': 0.8,
    'chat_template_kwargs': {'enable_thinking': False}
}
r = requests.post('http://127.0.0.1:8000/v1/chat/completions',
                  json=payload, timeout=(5,120))
r.raise_for_status()
data = r.json()
print(data['choices'][0]['message'])
print(data['choices'][0]['finish_reason'], data.get('usage'))

思考模式将enable_thinking改为True,并参照官方建议单独设置采样参数和输出预算。若要把思考与最终回答分字段返回,需要按锁定版本配置相应reasoning parser,再验证reasoning_content与content。未配置解析器时,不应假定思考字段必然存在,更不能把所有返回文字直接拼进业务答案。

验证比“有回答”多一步

至少安排普通问答、计算题、长输入和空输入四类样本。记录请求参数、模型版本、首字、结束时间、token数量与finish_reason。finish_reason为length意味着到达输出预算,答案可能不完整;HTTP 200也不表示业务答案正确。思考和非思考分别保存结果,避免把较长推理耗时误认为服务异常。

逐步把并发从1增加到2,再评估4,不一次放开最大上下文。观察每卡显存、抢占日志和失败率。业务网关给长任务独立预算,并让取消传到推理服务,避免用户离开后仍持续生成。

常见故障与回滚

unknown model或Tokenizer报错时,先核对模型目录和框架版本;CUDA内核错误检查GPU代际支持;OOM先降低长度和活跃请求,再检查其他进程。请求404多半是路径未包含/v1;模型不存在要使用served-model-name,而不是本地目录名。不要为解决一个报错连续更换驱动、框架和权重,这样无法判断有效变化。

测试结束使用docker stop qwen3-test停止实例,保留日志与版本清单。需要回退时重新启动上一版镜像与同一份权重,不删除模型目录。官方依据:Qwen3-8B模型卡、vLLM部署文档。

硬件和系统资源的完整预检

除了显存,主机内存要能支持下载、装载与运行时开销,独立试验建议从六十四GB内存和足够保存两个模型版本的SSD空间起步,再依据实际日志调整。下载盘与临时缓存目录都要检查剩余空间,磁盘写满可能表现为模型分片不完整。网络受限时先离线下载完整目录,不在每次容器启动时重新访问外部仓库。

记录GPU具体型号、驱动、镜像摘要、模型revision和启动参数。检查是否存在图形桌面或其他程序占用显存,选定专用设备。新GPU的内核兼容、旧驱动的运行时支持和量化格式是不同问题,定位时一次只改一项。业务网关限制输入长度与输出预算,避免用户提交超长提示使普通队列失去响应。

思考与非思考的业务取舍

简单资料问答可以先用非思考模式降低输出和等待,复杂推理使用单独的较大预算。不同模式应保留各自的采样和验证集,不用一组参数做所有任务。思考内容也不是可验证事实来源,最终结论必须检查材料与计算。对用户显示什么内容属于产品决定,服务端应先正确解析,不因隐藏界面就丢失协议字段。

当输出在思考阶段耗尽预算,最终回答可能为空;这与GPU没有工作不同。先查看结束原因、输出数量与返回结构,再调整预算。多轮应用根据官方模板保留适当历史,不把内部思考文本无条件拼回所有后续请求。模型升级后重新验证角色消息和工具返回,旧模板不能自动沿用。

从试验容量到部门服务

建立三档输入长度和三档并发,每档重复多个任务并保留失败。测试时使用固定到达率,观察队列是否持续增长;只统计已经完成的短请求会高估能力。把成功率、首字、总耗时、显存峰值和质量放在同一报告中,再确定普通任务上限。

界面提示排队与维护状态,长任务使用独立通道,管理员能够停止异常请求。生产接入增加TLS、鉴权、密钥更换、日志脱敏和告警。升级先在影子实例跑回归集,保留上一镜像、模型和配置,不只保存一个启动命令。运行前为Python客户端安装requests,避免将依赖缺失误当成API错误。

来源、翻译与版权说明

来源:网昱算力学院 · 技术编辑。第三方内容版权归原作者或发布机构所有;本站仅在许可证或明确授权允许时提供本地原文。

原文语言
ZH
原文更新时间
未提供
许可证
原创工程内容