Ubunte22.04+Docker+vLLM部署Qwen+OpenWebUI

1 阅读6分钟

Ubunte22.04+Docker+vllm部署Qwen+OpenWebUI

1. 基础环境及显卡驱动安装

1.1 操作系统安装建议

安装操作系统(推荐ubuntu22.04兼容性和稳定性会好很多)建议不要安装图形化界面。

下载地址 mirrors.aliyun.com/ubuntu-rele… 

或       releases.ubuntu.com/jammy/

1.2 网卡配置

cd /etc/netplan

创建01-network-网卡名.yaml

    cat /etc/netplan/01-network-ens11f0.yaml
    # This file is generated from information provided by the datasource.  Changes
    # to it will not persist across an instance reboot.  To disable cloud-init's
    # network configuration capabilities, write a file
    # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
    # network: {config: disabled}
    network:
        ethernets:
          ens11f0:
            dhcp4: false
            addresses:
              - 172.168.91.11/24
            routes:
              - to: default
                via: 172.168.91.254
            nameservers:
              addresses: [8.8.8.8]
        version: 2

netplan apply 使配置文件生效。

1.3 检查显卡状态

lspci | grep -i nvidia

image.png

1.4 关闭 Secure Boot 状态

安装后使用mokutil --sb-state查看Secure Boot 状态是否关闭,未关闭需要通过BIOS关闭。

image.png

1.5 禁用系统自带的nouveau模块

由于ubuntu22.04会自带默认的显卡驱动,会和NV显卡驱动有冲突,需要先禁用。

使用lsmod | grep nouveau检查nouveau模块是否加载,已加载则先禁用

通过修改/etc/modprobe.d/blacklist.conf配置文件禁用

在文本最后添加以下内容:

blacklist nouveau

options nouveau modeset=0

保存退出,执行以下命令生效:

update-initramfs -u

image.png 重启并再次使用lsmod | grep nouveau检查nouveau模块是否加载。

参考文档链接:www.ieisystem.com/qa/case/146…

1.6 进入系统时禁用nouveau模块

适用于安装系统时,由于显卡和驱动兼容性原因导致系统安装失败的情况。正常情况只需执行1.4即可

image.png

系统界面输入e 输入nouveau.modeset=0 rd.driver.blacklist=nouveau

image.png

1.7 升级软件包及补丁

apt update && apt upgrade -y

1.8 安装所需的软件包

apt install -y pip python3-venv dkms

2. 安装显卡驱动

2.1 GPU驱动下载及其安装

GPU驱动下载链接:www.nvidia.cn/Download/in…

选择对应的版本,查找链接下载的是deb格式的驱动包。

选择下方的Unix 驱动存档链接,下载的是run格式的驱动包。

image.png

image.png

上传run包,chmod +x \*.Run

./\*.run 执行安装

image.png

根据提示一步步安装即可,安装到最后仍会检测nouveau模块。重启后再次使用

lsmod | grep nouveau 检查模块加载情况。使用nvidia-smi查看显卡驱动情况。

image.png

2.2 显卡驱动常驻内存

安装后显卡驱动默认是off状态,需要开启GPU驱动常驻内存功能。

2.2.1 临时开启

开启指定GPU的持久模式(例如,开启GPU 0)

nvidia-smi -i 0 -pm 1

开启所有GPU的持久模式

nvidia-smi -pm 1

关闭所有GPU的持久模式

nvidia-smi -pm 0

2.2.2 永久开启

vim /lib/systemd/system/nvidia-persistenced.service

[Unit]

Description=NVIDIA Persistence Daemon

After=syslog.target

[Service]

Type=forking

PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid

Restart=always

ExecStart=/usr/bin/nvidia-persistenced --verbose

ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced/*

TimeoutSec=300

[Install]

WantedBy=multi-user.target

执行systemctl daemon-reload

systemctl start nvidia-persistenced.service

设置开机自启动

systemctl enable nvidia-persistenced.service

重启后发现驱动状态是on为正常。

2.3 显卡功耗限制

nvidia-smi -pl 60 限制在60w,非必选项,根据电源功耗和散热等评估设置。

2.4 安装CUDA驱动

2.4.1 安装CUDA驱动

CUDA下载链接:developer.nvidia.com/cuda-downlo…

选择好版本

image.png

image.png

执行安装,弹出窗口中的Driver选型是安装GPU驱动,上面安装过一定要取消勾选。

2.4.2 配置环境变量

添加到/etc/profile文件中,对所有用户生效

vim /etc/profile

export PATH=/usr/local/cuda/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

source /etc/profile

使用nvcc -V查看cuda版本,以此来测试cuda安装是否正确,环境变量是否识别成功

image.png

3 安装Huggingface

3.1 创建虚拟环境

python3 -m venv qwen && source qwen/bin/activate

然后进入到qwen目录(虚拟环境)

3.2 添加临时加速的镜像环境变量

export HF_ENDPOINT=https://hf-mirror.com   

3.3 安装包Huggingface官方库+加速下载工具

pip install huggingface_hub hf_transfer

3.4 命令行下载模型

hf download  -local-dir /opt/models_hf/Qwen/Qwen3.5-27B-AWQ-4bit

4. 安装Docker和Docker-Compose

参考文章blog.csdn.net/u013071014/…

Docker 下载链接

mirrors.aliyun.com/docker-ce/l…

Docker-Compose下载链接

github.com/docker/comp…

docker.server服务文件

[Unit]
 
Description=Docker Application Container Engine
 
Documentation=https://docs.docker.com
 
After=network-online.target firewalld.service
 
Wants=network-online.target
 
[Service]
 
Type=notify
 
ExecStart=/usr/bin/dockerd
 
ExecReload=/bin/kill -s HUP $MAINPID
 
LimitNOFILE=infinity
 
LimitNPROC=infinity
 
TimeoutStartSec=0
 
Delegate=yes
 
KillMode=process
 
Restart=on-failure
 
StartLimitBurst=3
 
StartLimitInterval=60s
 
[Install]
 
WantedBy=multi-user.target

Docker 和 Docker-Compose自动安装脚本

#!/bin/bash

# Docker 和 Docker Compose 安装脚本

# 设置错误处理:任何命令失败则退出脚本
set -e

# 检查是否以 root 用户运行
if [[ $EUID -ne 0 ]]; then
   echo "错误:此脚本必须使用 root 权限运行。"
   exit 1
fi

# 解压 Docker 二进制包
echo "解压 Docker 二进制包..."
tar -xvzf docker*.tgz

# 移动 Docker 二进制文件到 /usr/bin
echo "安装 Docker 二进制文件..."
mv docker/* /usr/bin

# 移动 Docker 服务文件到 systemd 目录
echo "配置 Docker 服务..."
mv docker.service /usr/lib/systemd/system/

# 设置服务文件权限
chmod +x /usr/lib/systemd/system/docker.service

# 重新加载 systemd 守护进程
systemctl daemon-reload

# 启动 Docker 服务
systemctl start docker

# 启用 Docker 服务开机自启
systemctl enable docker

# 检查 Docker 版本
echo "Docker 版本:"
docker -v

# 移动 Docker Compose 二进制文件到 /usr/bin
echo "安装 Docker Compose..."
mv docker-compose /usr/bin/docker-compose

# 设置 Docker Compose 权限
chmod +x /usr/bin/docker-compose

# 检查 Docker Compose 版本
echo "Docker Compose 版本:"
docker-compose -v

echo "安装完成!"

5. 下载vLLM

docker pull docker.1ms.run/vllm/vllm-openai:latest

6. 下载安装NVIDIA Container Toolkit

参考文档:

docs.nvidia.com/datacenter/…

blog.csdn.net/qq_41359817…

6.1 设置包存储库和 GPG 密钥

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \

&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \

sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \

sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

image.png

6.2 下载 gpgkey

wget <https://nvidia.github.io/libnvidia-container/gpgkey>

cat gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

cat nvidia-container-toolkit.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

6.3 下载 nvidia-container-toolkit.list

apt-get update && apt-get install -y nvidia-container-toolkit

有下面的文件内容表示安装成功

image.png

6.4 重启docker

systemctl daemon-reload

systemctl restart docker

7. 创建docker-compose并部署

7.1 创建Docker网络

docker network create qwen-network

7.2 创建docker-compose.yaml

services:
  vllm:
    image: docker.1ms.run/vllm/vllm-openai:latest
    container_name: vllm-Qwen3.5-9B-AWQ-4bit
    runtime: nvidia
    shm_size: '32gb'
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 2
              capabilities: [gpu]
    ports:
      - "8000:8000"
    volumes:
      - /opt/models_hf/Qwen/Qwen3.5-9B-AWQ-4bit:/app/model
      - ~/.cache/huggingface:/root/.cache/huggingface
    networks:
      qwen-network:
    environment:
      - HF_HUB_OFFLINE=1
      - TRANSFORMERS_OFFLINE=1
      - HF_HOME=/root/.cachei/huggingface
      - VLLM_RPC_TIMEOUT=360
    ipc: host
    command: >
      --model /app/model
      --served-model-name Qwen3.5-9B-AWQ-4bit
      --host 0.0.0.0
      --port 8000
      --tensor-parallel-size 2
      --dtype auto
      --max-model-len 16384
      --gpu-memory-utilization 0.90
      --reasoning-parser qwen3
      --kv-cache-dtype auto
      --enforce-eager
      --enable-prefix-caching
    restart: unless-stopped
networks:
  qwen-network:
    external: true
    name: qwen-network

7.3 创建容器

docker-compose up -d

7.4 查看容器运行情况

docker ps -a

image.png

7.5 查看容器日志

docker logs container id -f

image.png

日志会显示模型规模显存占用情况和部署时参数

image.png

7.6 检查模型

参考文章blog.csdn.net/Scabbards_/…

curl http://localhost:8000/v1/models返回data数据及正常

image.png

7.7 命令行使用

curl http://localhost:8000/v1/chat/completions \

-H "Content-Type: application/json" \

-d '{

 "model":"/app/model", ### model是上面curl结果的id值

 "messages":[

   {"role":"user","content":"你好"}

 ]

}'

image.png

8. Open WebUI部署

参考文档:docs.openwebui.cn/

8.1 docker-compose

services:
    openwebui:
    image: ghcr.io/open-webui/open-webui:v0.8.9 
    container_name: open-webui
    ports:
      - "3000:8080"
    volumes:
      - open-webui-data:/app/backend/data
    networks:
      qwen-network:
    environment:
      - OPENAI_API_BASE_URL=http://vllm-Qwen3.5-9B-AWQ-4bit:8000/v1
      - OPENAI_API_KEY=none
    depends_on:
      - vllm
    restart: unless-stopped
volumes:
  open-webui-data:
networks:
  qwen-network:
    external: true
    name: qwen-network

8.2 web访问及设置

http://localhost:3000

部署后若没有检测到模型,则通过设置添加模型接口,建议使用模型容器名或容器ip进行链接。

image.png

image.png