本文记录如何在搭载nvidia显卡的笔记本上使用wsl2 docker方法创建的vllm环境拉起qwen3-0.6b,并且实现流畅推理

搭建vllm环境

配置一览

博主使用的配置:
显卡:rtx5070ti笔记本版本,12g显存(理论上4G显存也能拉起来,只是上下文长度短一点)
环境:WSL2的Ubuntu2404+docker desktop
磁盘:留出50G以上

拉取官方vllm镜像

首先连接wsl2的Ubuntu系统,然后在终端中输入:
docker pull vllm/vllm-openai:latest
vllm环境较大,约20G左右,确保空间充足,如果拉取失败,尝试换源拉取
拉取完成后,检查本地是否已经存在vllm镜像:
docker images
如果能看到以下镜像,代表成功拉取:
在这里插入图片描述

创建容器

为了能够复用容器,以便加载不同路径的模型或者启用多节点部署,这一步仅创建一个支持vllm运行的容器,在下一步启动大模型节点
创建一个"docker.sh"文件,添加以下内容进去:

#!/bin/bash
# 启动交互式容器并进入 bash 终端

VLLM_WSL2_ENABLE_PIN_MEMORY=1# 添加此行来允许wsl2使用UVA

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
IMAGE_ID=4091d5593f77   # 局部变量,值等于上一步输出的ID

docker run -it \
    --runtime nvidia --gpus all \
    -v /home/huggingface:/root/.cache/huggingface \
    -v "$SCRIPT_DIR/qwen3_workspace":/workspace \
    -e VLLM_WSL2_ENABLE_PIN_MEMORY=1 \
    -w /workspace\
    --env "HF_TOKEN=$HF_TOKEN" \
    -p 8000:8000 \
    --ipc=host \
    --pull never \
    --entrypoint /bin/bash \
    $IMAGE_ID

然后在home路径下,创建"huggingface"文件夹,把"qwen3-0.6b"的权重放进去;在"docker.sh"相同的路径里,创建一个"qwen3_workspace"文件夹,作为启动后的初始路径
然后使用bash docker.sh运行脚本,进入容器,如果你的终端前面开头出现"root@XXXX:/workspace"代表成功进入容器,如下图所示:在这里插入图片描述

启动vllm服务并测试

启动vllm服务

在上一步创建的"qwen3_workspace"目录下,新建一个文件名字叫"start_node.sh"的文件用来启动节点,添加以下内容进去:

#!/bin/bash
# 在容器 /workspace 目录下执行此脚本启动服务

MODEL=${1:-"/root/.cache/huggingface/Qwen3-0.6B"}

echo "Starting vLLM with model: $MODEL"
vllm serve "$MODEL" \
    --served-model-name Qwen3-0.6B \
    --seed 1024 \
    --max-model-len=8k \
    --dtype=auto \
    --trust-remote-code \
    --host 0.0.0.0 \
    --port 8000 \
    --gpu-memory-utilization=0.85 \
    --max-num-seqs=1 \
    --tensor-parallel-size 1 \
    --reasoning-parser qwen3
    
echo "successfully started vLLM server with model: $MODEL"

max-model-len=xx是上下文长度,可以根据显存大小动态调整,每token上下文长度约为224 KB(计算方法见附录),我这里设置了8k上下文,kvcache约占0.8G左右显存
gpu-memory-utilizationGPU最大占用率,如果显存不够用可以调整到0.9~0.95

然后bash start_node.sh运行脚本,等待5~10分钟,出现以下标志说明成功:
在这里插入图片描述

测试

新建一个终端,然后输入:

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3-0.6B",
    "messages": [{"role": "user", "content": "你好"}],
    "extra_body": {
        "enable_thinking": true,
        "max_tokens": 200,
        "temperature": 0.7
    }
  }'

等待一会,若有输出,代表成功拉起模型:
在这里插入图片描述
恭喜,接下来可以对大模型进行提问了!

附录

WSL2: RuntimeError: UVA is not available原因及解决办法

原因:vllm在检测到所在环境为wsl2时,默认关闭UVA功能,但是vllm2以后,默认在启动时使用该功能,所以会报错
解决办法:"start_node.sh"脚本里添加VLLM_WSL2_ENABLE_PIN_MEMORY=1

kvcache占用计算方法

  • 首先看大模型的数据类型:
    如果是BF16,每个参数占2字节,BF32,每个参数占4字节,qwen3-0.6b为BF16,每个参数占2字节

  • 然后根据 Qwen3-0.6B 的官方配置:
    层数 (Layers): 28
    KV 头数 (KV Heads): 8
    头维度 (Head Dim): 128

  • 那么kvcache每token占用显存大小:
    2 × 8 × 128 × 2 × 28 = 112 KB

  • 假设上下文长度为n,总共占用显存大小为: 112 × n KB
    序列长度 1,024: 112 KB × 1024 = 112 MB
    序列长度 2,048: 112 KB × 2048 = 224 MB
    序列长度 4,096: 112 KB × 4096 = 448 MB
    序列长度 8,192: 112 KB × 8192 = 896 MB

更多推荐