dicktv_8341 2025-08-31 17:40 采纳率: 66.7%
浏览 41
已结题

用Docker方式,VLLM架构配合Openweb-ui本地部署大模型 前端无法访问本地容器大模型

问题遇到的现象和发生背景

本人想本地部署大模型用于学生学习,设计采用VLLM框架作为推理后段(满足并发),openweb-ui作为前端让用户有网页图形界面进行访问,本来是想采用docker部署,电脑配置如下

img


ubuntu 版本24.04 LTS,显存48GB,内存1024GB
已成功安装Nvidia驱动,驱动版本580.76.05,Cuda版本13.0

img

在终端输入

docker -v

可以看到docker版本28.3.3

img

首先进入虚拟环境,输入

conda activate CQUPT

进入环境了

img

此时输入命令安装VLLM

pip install vllm

显示如图

img


输入命令查看VLLM版本

pip list | grep vllm

可以看到输出如图,版本号是0.10.0.1

img


因为前面已经设置了docker的镜像源和拉取镜像,直接可以查看已经有的openweb-ui镜像
输入命令

docker images

可看到目前仓库显示如图

img

遇到的现象和发生背景,请写出第一个错误信息

然后在开始按照教程利用docker部署vllm和openweb-ui开始,出现问题了
我本地模型下载的是Qwen3-235B-22B-2507蒸馏版,Deepseek 70B蒸馏版和14B模型
首先,我问了deepseek,采用start脚本模式,命令如下
新建start_vllm.sh脚本,并编辑

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#!/bin/bash

MODEL_PATH="/home/frankmartin/home/frankmartin/Models/models/Qwen3-235B-A22B-Instruct-2507-AWQ"
NUM_GPUS=1
API_KEY="CQUPTYYX5003"

docker run --runtime nvidia --gpus all \
    -v ${MODEL_PATH}:/model \
    -p 8000:8000 \
    --ipc=host \
    --name CQEA830\
    -d \
    vllm/vllm-openai:latest \
    --model /model \
    --tensor-parallel-size ${NUM_GPUS} \
    --served-model-name Qwen3-235B-A22B \
    --host 0.0.0.0  \
    --port 8000
    --max-model-len 8192 \
    --gpu-memory-utilization 0.95 \
    --swap-space 128 \
    --cpu-offload-gb 512 \
    --quantization awq \
    --api-key ${API_KEY}
运行结果及详细报错内容

按照该脚本启动之后,屏幕报错

img

之后尝试调整VLLM的参数,例如加大swap-space交换空间,调高cpu-offload-gb加大内存卸载空间,要么提示swap-space 是无效命令,要么删除该字段后提示CUDA out of memory(爆显存)

我的解答思路和尝试过的方法

无奈,只有采用更小模型,并且不使用start_vllm.sh脚本尝试启动docker运行vllm,切换成14B的模型,启动命令行如下:

    docker run -d \
  --gpus all \
  --restart unless-stopped \
  --name VLLM830 \
  --network host \
  -v /home/frankmartin/DeepSeek-R1-Distill-Qwen-14B:/model \
  vllm/vllm-openai:latest \
  --model /model \
  --served-model-name DSR1 1.5B \
  --dtype half \
  --tensor-parallel-size 1 \
  --gpu-memory-utilization 0.95 \
  --cpu-offload-gb 0  \
  --max-model-len 8196 \
  --api-key CQUPTYYX5003
  --host 0.0.0.0  \
  --port 8000  \

之后系统开始加载deepseek 14B模型,显示显存有占用

img


并且日志部分也显示 Application startup complete

img


本地浏览器访问 http://localhost:8000/,看到如图

img


然后通过docker 启动 openweb-ui前端,采用yml脚本,输入 docker compose up -d,脚本内容如下
端口调整为3212


services:
  
  open-webui:
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/open-webui/open-webui:v0.6.25
    container_name: open-webui-app
    ports:
      - "3212:8080" # 
    volumes:
      - open-webui-data:/app/backend/data  # 
    environment:
      - OLLAMA_BASE_URL=http://vllm-backend:8000 # 
      - WEBUI_NAME=DeepSeek-70B Chat
      - WEBUI_URL=http://localhost:3212 
      - DISABLE_SIGNUP=false  #
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: unless-stopped
    networks:
      - openwebui-net

networks:
  openwebui-net:
    driver: bridge

volumes:
  open-webui-data:
    driver: local

最初我的脚本里面是没有

extra_hosts:
      - "host.docker.internal:host-gateway"

这一块的,后来进入到openweb-ui设置API连接为http://localhost:8000/,或者http://localhost:8000/v1,openweb-ui都显示netweork problem,我才把那个extra的参数加入,但是仍然无效

img


然后进入对话界面,也是无法对话,始终在转圈

img

终端界面显示的是这样

img


查看docker运行情况,VLLm服务没有显示端口

img

我想要达到的结果

按理说Qwen3模型文件有200多G,可能后期我会加卡,但目前连14B模型都无法跑通,应该是我的命令行或者docker的网络地址设置哪里出了问题?请大家帮帮我

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-31 17:44
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    您在部署 VLLM + OpenWebUI 的过程中遇到了前端无法访问后端容器的问题,这是典型的网络配置或容器通信问题。以下是对您问题的详细分析和解决方案。


    ✅ 一、问题现象总结

    • 后端服务(VLLM):已启动并运行,占用显存。
    • 前端服务(OpenWebUI):无法访问 VLLM 的 API 接口(http://localhost:8000/v1)。
    • 错误信息
      • 前端提示 Network problemConnection refused
      • 日志中可能显示 Failed to connect to vllm-backend:8000
    • 模型尝试:从 Qwen3-235B 到 DeepSeek 14B 都未能成功。

    🚨 二、问题原因分析

    1. Docker 网络配置问题

    • 您使用了 --network host 启动 VLLM 容器,这会导致容器与宿主机共享网络栈。
    • 但 OpenWebUI 容器使用的是默认的桥接网络(bridge),无法直接通过 localhost 访问 VLLM 容器。
    • 关键点localhost 在 Docker 中是容器内部的地址,不是宿主机的地址。

    2. 缺少 extra_hosts 配置

    • 如果您的 OpenWebUI 容器和 VLLM 容器不在同一个自定义网络中,那么它们之间无法通过容器名互相访问。
    • 因此需要添加 extra_hosts 来映射宿主机的 IP 到容器内。

    3. API 地址设置不正确

    • OpenWebUI 的环境变量中设置了 OLLAMA_BASE_URL=http://vllm-backend:8000,但这只有在两个容器在同一自定义网络中时才有效。
    • 如果没有配置网络,这个地址就无效。

    🔧 三、解决方法(分步说明)

    第一步:确保 VLLM 和 OpenWebUI 容器在同一个自定义网络中

    修改 docker-compose.yml 文件,为两个容器创建一个自定义网络,并让它们加入该网络。

    version: '3.8'
    
    services:
      vllm-backend:
        image: vllm/vllm-openai:latest
        container_name: vllm-backend
        ports:
          - "8000:8000"
        volumes:
          - /home/frankmartin/DeepSeek-R1-Distill-Qwen-14B:/model
        environment:
          - MODEL_PATH=/model
          - PORT=8000
          - HOST=0.0.0.0
        command:
          --model /model \
          --served-model-name DSR1 1.5B \
          --dtype half \
          --tensor-parallel-size 1 \
          --gpu-memory-utilization 0.95 \
          --cpu-offload-gb 0 \
          --max-model-len 8196 \
          --api-key CQUPTYYX5003
        networks:
          - openwebui-net
        restart: unless-stopped
        runtime: nvidia
        deploy:
          resources:
            limits:
              devices:
                - type: gpu
                  count: all
    
      open-webui:
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/open-webui/open-webui:v0.6.25
        container_name: open-webui-app
        ports:
          - "3212:8080"
        volumes:
          - open-webui-data:/app/backend/data
        environment:
          - OLLAMA_BASE_URL=http://vllm-backend:8000
          - WEBUI_NAME=DeepSeek-70B Chat
          - WEBUI_URL=http://localhost:3212
          - DISABLE_SIGNUP=false
        extra_hosts:
          - "host.docker.internal:host-gateway"
        networks:
          - openwebui-net
        restart: unless-stopped
    
    networks:
      openwebui-net:
        driver: bridge
    
    volumes:
      open-webui-data:
        driver: local
    

    ⚠️ 注意:请根据您的模型路径和参数调整 commandvolumes


    第二步:确保 VLLM 容器监听 0.0.0.0 而非 127.0.0.1

    在 VLLM 容器中,必须使用 --host 0.0.0.0 参数,否则只允许本地访问。

    ✅ 您的脚本中已经包含了 --host 0.0.0.0,这是正确的。


    第三步:检查 VLLM 容器是否正常运行

    运行以下命令查看 VLLM 容器日志:

    docker logs vllm-backend
    

    确认输出中无报错,且能看到类似如下信息:

    Application startup complete
    

    如果出现 CUDA 内存不足等错误,请尝试降低 --gpu-memory-utilization 或减少 --tensor-parallel-size


    第四步:访问 OpenWebUI 前端

    打开浏览器访问:

    http://localhost:3212
    

    登录后,在设置中确认 API 地址为:

    http://vllm-backend:8000
    

    或者在 OpenWebUI 设置中手动填写:

    • API URL: http://vllm-backend:8000
    • Model Name: DSR1 1.5B

    📌 四、常见问题排查清单

    | 问题 | 解决方案 | |------|----------| | 前端无法访问 VLLM | 确保两个容器在同一个 Docker 网络中 | | CUDA Out of Memory | 减少 --gpu-memory-utilization 或使用更小模型 | | 无法连接到 localhost:8000 | 使用容器名 vllm-backend:8000 替代 localhost | | OpenWebUI 显示 Network Problem | 检查 OLLAMA_BASE_URL 是否正确,确保网络互通 |


    ✅ 五、最终验证步骤

    1. 启动所有容器

      docker-compose up -d
      
    2. 查看容器状态

      docker ps
      

      应看到 vllm-backendopen-webui-app 正常运行。

    3. 访问 OpenWebUI

      打开浏览器,访问 http://localhost:3212,输入用户名和密码(默认为 admin / admin),然后测试对话功能。


    📦 六、推荐的简化部署方式(可选)

    如果您希望简化部署流程,可以考虑使用 docker run 直接启动 VLLM 和 OpenWebUI,但建议优先使用 docker-compose 以管理多个服务之间的依赖关系。


    ✅ 总结

    您遇到的核心问题是 Docker 容器间网络不通,导致 OpenWebUI 无法访问 VLLM 的 API 接口。解决的关键在于:

    • 使用自定义 Docker 网络,让两个容器能够通过容器名互相访问;
    • 确保 VLLM 监听 0.0.0.0
    • 配置 OLLAMA_BASE_URLhttp://vllm-backend:8000

    如有更多关于模型加载、显存优化、多 GPU 支持等问题,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月8日
  • 已采纳回答 9月30日
  • 修改了问题 8月31日
  • 创建了问题 8月31日