AI服务部署.md 12 KB


notion-id: 232ca4d7-cb7b-80e1-a013-fe1f3f9be3

执行摘要

核心挑战: 您的 Radeon VII 显卡(gfx906 架构)已被 AMD 官方在新版的 ROCm 驱动中停止支持。这意味着官方的 vLLM 推理框架无法直接在您的硬件上正常工作。 解决方案: 我们将采用一个由社区维护的、专门为 gfx906 硬件优化的 vLLM 分支 (nlzy/vllm-gfx906)。此方案将通过预构建的 Docker 容器来部署,以最大程度地简化安装流程并规避复杂的依赖问题。通过张量并行技术,我们将把 Qwen3-32B-AWQ 模型分片到您的两张 Radeon VII 显卡上,实现高效推理。 系统版本: ubuntu 22.04.5,如使用其他操作系统请自行通过AI修改相关命令。


第一部分:系统底层环境配置

在安装任何 AI 软件栈之前,必须确保操作系统和 BIOS 已为多 GPU 计算环境正确配置。这些步骤虽常被忽视,但至关重要。

  1. BIOS/UEFI 设置

您需要进入服务器的 BIOS/UEFI 设置界面,进行以下两项关键修改。这些设置是让操作系统正确识别和管理多个无头(headless)计算卡的先决条件。

  • 启用 "Above 4G Decoding": 此设置允许 64 位操作系统正确映射多个 GPU 所需的巨大内存地址空间,是避免资源冲突和硬件识别失败的关键。请在 "PCIe Subsystem Settings" 或 "Advanced" 菜单中找到并启用它。
  • 禁用 "Compatibility Support Module (CSM)": 禁用 CSM 会强制系统进入纯 UEFI 启动模式。由于 Radeon VII 在此场景下作为纯计算卡使用,没有视频输出,传统的 BIOS 启动模式可能会干扰其在操作系统层面的正确初始化。
  • 安装 Docker Engine

我们将使用 Docker 来部署服务,这可以极大地简化环境配置。 Bash

# 更新您的包列表
sudo apt update && sudo apt upgrade -y

# 安装 Docker
sudo apt install docker.io -y

# 启动并设置 Docker 开机自启
sudo systemctl start docker
sudo systemctl enable docker

---

第二部分:ROCm 驱动与验证

尽管 gfx906 已被官方弃用,但我们依赖的社区方案 (vllm-gfx906) 要求使用 ROCm 6.3 版本进行构建和运行。其底层的内核驱动仍对您的硬件保持兼容性。

  1. 安装 ROCm 6.3

我们将使用 amdgpu-install 脚本来精确安装所需的版本。 Bash

# 下载针对 Ubuntu 22.04 (Jammy) 的 ROCm 6.3 安装脚本
wget <https://repo.radeon.com/amdgpu-install/6.3/ubuntu/jammy/amdgpu-install_6.3.60300-1_all.deb>

# 安装该脚本
sudo apt install ./amdgpu-install_6.3.60300-1_all.deb

# 使用该脚本安装 ROCm 核心计算库# --usecase=rocm,hiplibsdk 参数确保安装了所有必要的计算库
sudo amdgpu-install -y --usecase=rocm,hiplibsdk

  1. 配置用户权限并重启

这是允许应用程序访问 GPU 硬件的强制步骤。 Bash

# 将当前用户添加到 render 和 video 组
sudo usermod -a -G render,video $LOGNAME# 必须重启系统以使新安装的内核模块和用户组权限生效
sudo reboot

  1. 严格验证 ROCm 环境

重启后,打开一个新的终端,执行以下命令来验证 ROCm 是否已正确安装且识别出您的两张 Radeon VII 显卡。

  • 检查用户组权限:
  • Bash

    groups
    
    
  • 预期输出应包含 rendervideo

  • 检查内核模块:

  • Bash

    dkms status
    
    
  • 预期输出应显示 amdgpu 模块已为当前内核成功安装 (installed)。

  • 检查 ROCm Agent 枚举:

  • Bash

    rocminfo
    
    
  • 您应该能在此命令的输出中找到 两个独立的 "Agent" 块,每个块的 "Name" 字段都应显示为 gfx906

  • 检查硬件状态:

  • Bash

    rocm-smi
    
    
  • 预期输出应清晰地列出 两张 显卡,每张卡的 VRAM 显示为 16384MiB,并且状态正常。

[SUCCESS CHECKPOINT] 在继续下一步之前,请确保以上所有验证命令均返回了预期的结果。任何一步的失败都表明底层驱动存在问题,必须先行解决。


第三部分:使用 vLLM-GFX906 部署模型

我们将采用社区推荐的、最直接的部署路径:使用预构建的 Docker 镜像。这个镜像封装了所有必需的补丁和依赖,包括为 gfx906 定制的 vLLM 和 Triton。

  1. 拉取预构建的 Docker 镜像

该镜像是 nlzy/vllm-gfx906 分支的作者提供的,专门为 ROCm 6.3 环境构建。 Bash

# 拉取社区报告中验证过的特定标签的镜像
docker pull nalanzeyu/vllm-gfx906:v0.9.0-rocm6.3

  1. 启动 vLLM 服务器

现在,我们将使用一条命令来启动 Docker 容器,并在其中运行 vLLM 服务器。该命令将配置张量并行,把 Qwen3-32B-AWQ 模型加载到您的两张 Radeon VII 上。 Bash

# 将 /path/to/your/models 替换为您在主机上存储模型的实际路径# 如果您希望 vLLM 自动从 Hugging Face 下载,可以省略 -v 挂载和 --model 参数中的路径部分

docker run -it --rm \\
  --network=host \\
  --ipc=host \\
  --shm-size=16g \\
  --device=/dev/kfd \\
  --device=/dev/dri \\
  --group-add video \\
  --cap-add=SYS_PTRACE \\
  --security-opt seccomp=unconfined \\
  -v /path/to/your/models:/models \\
  nalanzeyu/vllm-gfx906:v0.9.0-rocm6.3 \\
  vllm serve Qwen/Qwen3-32B-AWQ \\
  --tensor-parallel-size 2 \\
  --quantization awq \\
  --max-model-len 5100 \\
  --disable-log-requests \\
  --dtype float16

命令参数详解:

  • docker run ...: 启动容器所需的一系列标准参数,用于正确地将 AMD GPU 设备暴露给容器。
  • nalanzeyu/vllm-gfx906:v0.9.0-rocm6.3: 指定我们下载的、包含所有 gfx906 补丁的必需镜像。
  • vllm serve Qwen/Qwen3-32B-AWQ: vLLM 的启动命令,指向您要服务的模型。vLLM 会自动从 Hugging Face 下载。
  • -tensor-parallel-size 2: 核心参数。指示 vLLM 将模型的权重均匀地切分到您的 2 张 GPU 上。
  • -quantization awq: 明确告知 vLLM 加载的模型是 AWQ 量化格式。
  • -max-model-len 8192: 设置模型能处理的最大序列长度。
  • -disable-log-requests: 一项性能优化措施,在生产环境中建议开启。
  • -dtype float16: vllm-gfx906 分支推荐使用 float16 以在 gfx906 硬件上获得更好的性能。

第四部分:验证与客户端交互

服务器成功启动后,vLLM 会在日志中显示工作进程已在所有指定的 GPU (GPU 0, 1) 上初始化,并开始在 localhost:8000 上监听 API 请求。

  1. 使用curl进行快速测试

这是验证 API 端点是否正常响应的最简单方法。 Bash

curl <http://localhost:8000/v1/completions> \\
-H "Content-Type: application/json" \\
-d '{
    "model": "Qwen/Qwen3-32B-AWQ",
    "prompt": "San Francisco is a",
    "max_tokens": 20,
    "temperature": 0
}'

如果一切正常,您将收到一个包含模型生成文本的 JSON 响应。

  1. 使用 Python 客户端进行交互

为了更方便地进行程序化访问,您可以使用 openai Python 库,因为它与 vLLM 提供的 API 完全兼容。 首先,安装 openai 库: Bash

pip install openai

然后,使用以下 Python 脚本与您的本地模型进行交互: Python

from openai import OpenAI

# 配置客户端以指向本地 vLLM 服务器# 对于本地服务,API 密钥可以是任意字符串
client = OpenAI(
    api_key="not-needed",
    base_url="<http://localhost:8000/v1>"
)

# 准备聊天消息
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "请介绍一下什么是张量并行(Tensor Parallelism)?"}
]

print("向本地 Qwen3 模型发送请求...")

try:
    chat_completion = client.chat.completions.create(
        model="Qwen/Qwen3-32B-AWQ",
        messages=messages,
        max_tokens=512,
        temperature=0.7
    )
    # 解析并打印结果
    print("\\n模型回复:")
    print(chat_completion.choices[0].message.content)
except Exception as e:
    print(f"\\n发生错误: {e}")

第五部分:性能调优与故障排除

  • 显存管理:
    • -gpu-memory-utilization (默认为 0.90) 控制用于存储 KV 缓存的显存比例。如果服务器日志中频繁出现 preempted 警告,说明 KV 缓存空间不足,可以适当降低此值(如 0.85)。如果显存充裕,可以适当提高(如 0.95)以支持更多并发请求。
  • 批处理大小:
    • -max-num-batched-tokens (默认值较高) 和 -max-num-seqs (默认 256) 共同决定了批处理的大小。调整这些值可以在吞吐量和延迟之间进行权衡。
  • 关于量化 MoE 模型的说明:
    • 请注意,您当前使用的 Qwen3-32B-AWQ 不是 MoE(混合专家)模型。如果您将来尝试部署量化的 MoE 模型(如 Mixtral 的量化版),vllm-gfx906 分支预计将无法工作。这是该社区分支的一个已知局限性。届时您可能需要转向 llama.cpp 等其他框架。

第六部分:通过 Open WebUI 调用模型

Open WebUI 是一个功能强大且用户友好的 Web 界面,可以连接到各种 LLM 后端,包括我们刚刚部署的 vLLM 服务器。我们将使用 Docker 来运行它。

  1. 安装并运行 Open WebUI

打开一个新的终端窗口(保持 vLLM 服务器正在运行),执行以下命令来下载并启动 Open WebUI 容器: Bash

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

  • d: 在后台运行容器。
  • p 3000:8080: 将主机的 3000 端口映射到容器的 8080 端口。您将通过 http://localhost:3000 访问 WebUI。
  • v open-webui:/app/backend/data: 创建一个 Docker volume 来持久化存储 Open WebUI 的数据(用户、设置等)。
  • -name open-webui: 为容器命名。
  • -restart always: 确保在 Docker 重启或服务器重启后,Open WebUI 容器能自动启动。
  • 首次登录并配置模型
  • 访问 WebUI: 在您的浏览器中打开 http://<YOUR_SERVER_IP>:3000 (如果是本机,则为 http://localhost:3000)。
  • 创建管理员账户: 首次访问时,系统会提示您创建一个管理员账户。请按提示完成注册。
  • 进入设置: 登录后,点击左上角的头像,然后选择 “设置”。
  • 连接模型:
    1. 在设置页面,点击左侧菜单的 “连接”。
    2. 在 “模型名称” 字段下,输入 Qwen/Qwen3-32B-AWQ
    3. 点击 “保存”。系统会自动从 ollama.io 尝试拉取模型信息,但这步不重要,我们稍后会覆盖它。
    4. 现在,您会在下方的 “已连接的模型” 列表中看到刚刚添加的模型。点击模型右侧的 “编辑” (铅笔图标)。
  • 配置 API 地址:
    1. 在弹出的编辑窗口中,找到 API 基础 URL 字段。
    2. 输入您的 vLLM 服务器的地址。因为 Open WebUI 和 vLLM 运行在同一台机器上,您可以使用 http://host.docker.internal:8000/v1
  • 注意: host.docker.internal 是一个特殊的 DNS 名称,它能让 Docker 容器访问到宿主机的网络。这比直接使用 localhost127.0.0.1 更可靠。
  1. API 密钥 字段可以留空,或者填入任意字符(例如 NA)。
  2. 模型 字段应保持为 Qwen/Qwen3-32B-AWQ
  3. 点击 “保存”
  4. 开始聊天
  5. 返回 Open WebUI 的主界面。
  6. 点击屏幕顶部的 “选择一个模型” 下拉菜单。
  7. 您应该能看到刚刚配置好的 Qwen/Qwen3-32B-AWQ。选择它。
  8. 现在,您可以在下方的输入框中输入提示词,开始与您的本地大模型进行对话了!

至此,您已经成功地为您的 vLLM 服务搭建了一个功能完善、易于使用的图形化界面。