从零搭建私有大模型服务:vLLM 推理 + Dify 应用平台完整指南

环境信息:Ubuntu Linux + CUDA 12.9 | 模型:Qwen/Qwen3.5-0.8B | 推理框架:vLLM | 应用平台:Dify


目录


整体架构

CUDA 环境 → vLLM 推理服务(OpenAI 兼容 API) → Dify 应用平台(Docker) → 浏览器访问

一、环境准备:配置 CUDA 路径

在安装 vLLM 之前,先确保 CUDA 工具链的环境变量正确配置(以12.9版本为例):

# 设置 CUDA 路径(添加到 ~/.bashrc 可永久生效)
export PATH=/usr/local/cuda-12.9/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH

💡 提示:如需永久生效,将上面两行追加到 ~/.bashrc 并执行 source ~/.bashrc


二、安装 vLLM 及依赖

2.1 安装 pip 和 python3-venv

sudo apt install -y pip python3-venv

2.2 创建并激活 Python 虚拟环境

使用虚拟环境隔离依赖,避免污染系统全局 Python 环境:

python3 -m venv vllm_env
source vllm_env/bin/activate

2.3 安装 vLLM 及相关工具包

使用国内镜像源加速下载,推荐使用清华镜像,备用中科大镜像:

# 清华镜像(推荐)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ vllm
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ modelscope
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ datasets
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ openai

# 备用:中科大镜像源地址
# https://pypi.mirrors.ustc.edu.cn/simple/

2.4 验证安装

vllm --version

⚠️ 注意:如果需要运行 Qwen3.5 等新架构模型,可能需要升级到最新版 vLLM:

pip install -U vllm

三、下载模型

使用 ModelScope 命令行工具下载模型权重文件,以 Qwen3.5-0.8B 为例:

modelscope download --model Qwen/Qwen3.5-0.8B --cache_dir /home/server/models/Qwen3.5-0.8B

✅ 下载完成后,模型文件位于 /home/server/models/Qwen3.5-0.8B/Qwen/Qwen3.5-0.8B/,启动脚本中 MODEL_PATH 需指向包含 config.json最内层目录


四、启动 vLLM 推理服务

4.1 创建启动脚本

新建文件 start_api.sh,写入以下内容:

#!/bin/bash

# ================= 配置区域 =================

# 模型路径(指向包含 config.json 的最内层目录)
MODEL_PATH="/home/server/models/Qwen3.5-0.8B/Qwen/Qwen3.5-0.8B"

# 服务端口
PORT=8000

# 主机地址(0.0.0.0 允许外部访问,127.0.0.1 仅本地访问)
HOST="0.0.0.0"

# GPU 显存利用率(显存较小时可降低至 0.8)
GPU_MEM_UTIL=0.9

# 张量并行数(单卡填 1,多卡填卡数)
TP_SIZE=1

# 最大上下文长度(可根据显存大小调整)
MAX_MODEL_LEN=32768

# ================= 启动命令 =================

echo "正在启动 vLLM 服务..."
echo "模型路径: $MODEL_PATH"
echo "监听地址: $HOST:$PORT"

python3 -m vllm.entrypoints.openai.api_server \
    --model "$MODEL_PATH" \
    --host "$HOST" \
    --port "$PORT" \
    --tensor-parallel-size "$TP_SIZE" \
    --gpu-memory-utilization "$GPU_MEM_UTIL" \
    --max-model-len "$MAX_MODEL_LEN" \
    --trust-remote-code \
    --dtype auto \
    --enable-chunked-prefill \
    --served-model-name qwen3.5-0.8b

echo "服务已启动。"

4.2 核心参数说明

参数 说明 建议值
--gpu-memory-utilization GPU 显存使用比例,剩余留给系统 0.9(显存不足时用 0.8)
--tensor-parallel-size 张量并行数,与 GPU 数量对应 单卡填 1
--max-model-len 最大上下文 token 长度 32768(可减小以节省显存)
--served-model-name API 调用时使用的模型名称别名 qwen3.5-0.8b
--enable-chunked-prefill 开启分块预填充,提升长文本吞吐量 推荐开启

4.3 赋予权限并后台运行

# 赋予执行权限
sudo chmod +x start_api.sh

# 后台运行,日志输出到 qwen.log
nohup ./start_api.sh > qwen.log 2>&1 &

# 查看启动日志
tail -f qwen.log

💡 提示:也可以使用 tmux 进行会话管理,便于随时查看实时日志:

tmux new -s vllm
# 在会话中运行
./start_api.sh

五、对话脚本测试

新建文件 chat_test.py,写入以下内容:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from openai import OpenAI

# ========== 配置区域 ==========

BASE_URL   = "http://localhost:8000/v1"
MODEL_NAME = "qwen3.5-0.8b"   # 与 --served-model-name 保持一致
API_KEY    = "sk-123"          # vLLM 不验证 key,填任意非空字符串即可

# ========== 初始化客户端 ==========

client = OpenAI(base_url=BASE_URL, api_key=API_KEY)

messages = [
    {"role": "system",
     "content": "你是一个智能助手,由 Qwen3.5 驱动。请用简洁、友好的中文回答用户的问题。"}
]

def chat():
    print(f"--- 已连接到 vLLM ({BASE_URL}) | 模型: {MODEL_NAME} ---")
    print("输入 exit 退出对话\n")

    while True:
        user_input = input("\033[92m你:\033[0m ")
        if not user_input.strip():
            continue
        if user_input.lower() in ["exit", "quit", "退出"]:
            print("再见!")
            break

        messages.append({"role": "user", "content": user_input})
        print("\033[94mQwen:\033[0m ", end="", flush=True)

        stream = client.chat.completions.create(
            model=MODEL_NAME,
            messages=messages,
            temperature=0.7,
            max_tokens=1024,
            stream=True
        )

        full_response = ""
        for chunk in stream:
            content = chunk.choices[0].delta.content
            if content:
                print(content, end="", flush=True)
                full_response += content
        print()

        messages.append({"role": "assistant", "content": full_response})

if __name__ == "__main__":
    chat()

运行脚本:

python3 chat_test.py

⚠️ 注意:首次对话可能需要等待一段时间(模型预热)。如果等待过长,可将 start_api.sh 中的 MAX_MODEL_LEN 调小(如 8192),以减少显存占用和预热时间。


六、部署 Dify 可视化应用平台

6.1 获取 Dify 源码

前往 GitHub: langgenius/dify 下载 ZIP 包并上传到服务器,然后解压:

unzip dify-main.zip

6.2 初始化配置并启动容器

# 进入 docker 目录(按实际路径调整)
cd /home/server/dify-main/docker

# 复制示例配置
cp .env.example .env

# 启动所有容器
docker compose up -d

# 查看容器运行状态
docker ps -a

6.3 修改默认端口(可选)

如果 80 或 443 端口已被占用,编辑 .env 文件修改端口配置:

# Docker Compose Service Expose Host Port Configurations
EXPOSE_NGINX_PORT=6060
EXPOSE_NGINX_SSL_PORT=6443

修改后重新启动容器:

cd /home/server/dify-main/docker
sudo docker compose up -d

6.4 访问 Dify 管理界面

在浏览器中输入服务器 IP 和端口即可访问:

http://<服务器IP>:<端口号>

✅ 初次访问需要注册管理员账号。完成后,可在「模型供应商」中添加 vLLM 作为 OpenAI 兼容的自定义 API,地址填写 http://localhost:8000/v1,即可在 Dify 中使用本地大模型。


如有问题欢迎在评论区交流,转载请注明出处。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐