AMD MI50 vLLM 多卡并行
执行摘要
核心挑战: 您的 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 计算环境正确配置。这些步骤虽常被忽视,但至关重要。
- 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 版本进行构建和运行。其底层的内核驱动仍对您的硬件保持兼容性。
- 安装 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
- 配置用户权限并重启
这是允许应用程序访问 GPU 硬件的强制步骤。
Bash
# 将当前用户添加到 render 和 video 组
sudo usermod -a -G render,video $LOGNAME# 必须重启系统以使新安装的内核模块和用户组权限生效
sudo reboot
- 严格验证 ROCm 环境
重启后,打开一个新的终端,执行以下命令来验证 ROCm 是否已正确安装且识别出您的两张 Radeon VII 显卡。
- 检查用户组权限:
- Bash
groups
- 预期输出应包含 render 和 video。
- 检查内核模块:
- 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。
- 拉取预构建的 Docker 镜像
该镜像是 nlzy/vllm-gfx906 分支的作者提供的,专门为 ROCm 6.3 环境构建。
Bash
# 拉取社区报告中验证过的特定标签的镜像
docker pull nalanzeyu/vllm-gfx906:v0.9.0-rocm6.3
- 启动 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 请求。
- 使用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 响应。
- 使用 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 来运行它。
- 安装并运行 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)。
- 创建管理员账户: 首次访问时,系统会提示您创建一个管理员账户。请按提示完成注册。
- 进入设置: 登录后,点击左上角的头像,然后选择 “设置”。
- 连接模型:
- 在设置页面,点击左侧菜单的 “连接”。
- 在 “模型名称” 字段下,输入 Qwen/Qwen3-32B-AWQ。
- 点击 “保存”。系统会自动从 ollama.io 尝试拉取模型信息,但这步不重要,我们稍后会覆盖它。
- 现在,您会在下方的 “已连接的模型” 列表中看到刚刚添加的模型。点击模型右侧的 “编辑” (铅笔图标)。
- 配置 API 地址:
- 在弹出的编辑窗口中,找到 API 基础 URL 字段。
- 输入您的 vLLM 服务器的地址。因为 Open WebUI 和 vLLM 运行在同一台机器上,您可以使用 http://host.docker.internal:8000/v1。
- 注意: host.docker.internal 是一个特殊的 DNS 名称,它能让 Docker 容器访问到宿主机的网络。这比直接使用 localhost 或 127.0.0.1 更可靠。
- API 密钥 字段可以留空,或者填入任意字符(例如 NA)。
- 模型 字段应保持为 Qwen/Qwen3-32B-AWQ。
- 点击 “保存”。
- 开始聊天
- 返回 Open WebUI 的主界面。
- 点击屏幕顶部的 “选择一个模型” 下拉菜单。
- 您应该能看到刚刚配置好的 Qwen/Qwen3-32B-AWQ。选择它。
- 现在,您可以在下方的输入框中输入提示词,开始与您的本地大模型进行对话了!
至此,您已经成功地为您的 vLLM 服务搭建了一个功能完善、易于使用的图形化界面。
(转自:司波徒) 双卡Radeon VII使用张量并行运行大语言模型: ubuntu下调用双卡Radeon VII 使用张量并行运行大语言模型(基于vllm)
版权所有 © 【代码谷】 欢迎非商用转载,转载请按下面格式注明出处,商业转载请联系授权,违者必究。(提示:点击下方内容复制出处)
源文: AMD MI50 vLLM 多卡并行 ,链接:https://www.daimagu.com/article/2604081303303675.html,来源:代码谷
评论