vLLM 零基础大模型部署(Ubuntu 24.04 + ROCm 7+)
本节介绍在 Ubuntu 24.04 + ROCm 7+ 环境下,如何使用 vLLM 对 Gemma 4 进行推理,包括:
- 使用官方 ROCm vLLM Docker 镜像快速启动
- 手动编译 ROCm 版 vLLM(含 Triton、FlashAttention 等依赖)
示例模型以 Gemma 4 E4B-it(google/gemma-4-E4B-it) 为主;若显存充裕,也可替换为 google/gemma-4-31B-it 或 google/gemma-4-26B-A4B-it。
前置条件:已完成 ROCm 7.1.0 安装与验证(见
env-prepare-ubuntu24-rocm7.md)。
一、方式一:Docker 方式(推荐)
参考官方 Quickstart 文档:
注意:如果使用 Docker,需要安装
amdgpu-dkms:
https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/docker.html
相关步骤在前文脚本中已包含,否则需手动安装。
1. 启动 vLLM 容器
从官方 ROCm vLLM 镜像启动容器:
sudo docker pull rocm/vllm-dev:nightly # 获取最新镜像
sudo docker run -it --rm \
--network=host \
--cpus="16" \
--group-add=video \
--ipc=host \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--device /dev/kfd \
--device /dev/dri \
-v ~/models:/app/models \
-e HF_HOME="/app/models" \
-e HF_TOKEN="hf_***" \
rocm/vllm-dev:nightly此时容器中 /app/models 挂载到宿主机的 ~/models(用于缓存 Hugging Face 下载的模型权重)。
Gemma 系列需要在 Hugging Face 上接受模型使用条款,启动前建议在 HF 生成一个具备读取权限的 token 并通过
HF_TOKEN注入容器。
2. 容器内启动模型服务
在容器内,直接使用原生 HF 权重启动 Gemma 4 E4B-it:
# 标准启动(启用 CUDA/HIP graph,推理更快)
vllm serve google/gemma-4-E4B-it \
--dtype bfloat16 \
--max-model-len 8192 \
--max-num-seqs 32
# 快速启动(--enforce-eager):禁用 CUDA/HIP graph,
# 启动速度更快,但推理略慢(通常慢 10–20%)。
vllm serve google/gemma-4-E4B-it \
--dtype bfloat16 \
--enforce-eager \
--max-num-seqs 32 \
--max-model-len 8192说明:
- Gemma 4 E4B 原生支持 128K 上下文,示例里只设置
--max-model-len 8192以便在小显存下顺利起服务,可按显存逐步调大。- 若要启用视觉 / 音频多模态输入,请参考 vLLM 对 Gemma 4 的最新多模态文档与相应
--limit-mm-per-prompt、--served-model-name等参数。
3. 性能测试脚本(tokens/s)
下面是一个完整的 Bash 脚本示例,用来测量 Gemma 4 E4B-it 的实际推理速度:
# 1. 准备随机 Prompt
RAND_PROMPT="随机码$(date +%N): 请详细介绍量子计算的未来,要求内容丰富,不要重复。"
# 2. 记录精确开始时间
start=$(date +%s.%N)
# 3. 发起请求并存入变量
response=$(curl -s -X POST http://127.0.0.1:8000/v1/completions \
-H "Content-Type: application/json" \
-d "{
\"model\": \"google/gemma-4-E4B-it\",
\"prompt\": \"$RAND_PROMPT\",
\"max_tokens\": 512,
\"temperature\": 0.8
}")
# 4. 记录结束时间
end=$(date +%s.%N)
# 5. 解析内容
# 提取生成文本原始内容
content=$(echo "$response" | jq -r '.choices[0].text')
# 提取 Token 数
tokens=$(echo "$response" | jq -r '.usage.completion_tokens // 0')
# 计算耗时
duration=$(echo "$end - $start" | bc)
# 6. 打印输出
echo "==================== 原始内容 ===================="
echo "$content"
echo "=================================================="
if (( $(echo "$duration < 0.05" | bc -l) )); then
echo "检测到异常极速响应 ($duration 秒),可能命中了缓存。"
else
tps=$(echo "scale=2; $tokens / $duration" | bc)
echo "生成 Token 数: $tokens"
echo "实际总耗时: $duration 秒"
echo "真实推理速度: $tps tokens/s"
fi
echo "=================================================="测试结果示例(Gemma 4 E4B-it,ctx=4096):
- tokens/s 以实际硬件测试为准
截图示例:


二、方式二:手动构建 vLLM(适合进阶用户)
本节内容较长,适合对 ROCm / Triton / FlashAttention / vLLM 有深入要求的用户。
1. 环境与版本要求
参考官方文档:
关键版本信息(示例):
- vLLM 0.13.0
- GPU 支持:MI200s (gfx90a), MI300 (gfx942), MI350 (gfx950), Radeon RX 7900 (gfx1100/1101), Radeon RX 9000 (gfx1200/1201), Ryzen AI MAX / AI 300 (gfx1151/1150)
- ROCm 6.3 或以上
- MI350 需要 ROCm 7.0+
- Ryzen AI MAX / AI 300 需要 ROCm 7.0.2+
2. 使用 uv 构建 Python 虚拟环境
参考:https://www.runoob.com/python3/uv-tutorial.html
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 创建并激活虚拟环境
uv venv --python 3.12 --seed
source .venv/bin/activate3. 安装 ROCm7+ 支持的 PyTorch
# 安装 PyTorch
uv pip uninstall torch
uv pip install --no-cache-dir torch torchvision --index-url https://download.pytorch.org/whl/nightly/rocm7.04. 为 ROCm 安装 Triton
仓库:https://github.com/ROCm/triton.git
uv pip install ninja cmake wheel pybind11
uv pip uninstall triton
git clone https://github.com/ROCm/triton.git
cd triton
# git checkout $TRITON_BRANCH
git checkout f9e5bf54
# 启动 16 核并行编译,并显示实时输出
# --no-build-isolation 确保使用你当前环境已有的 ninja, cmake
if [ ! -f setup.py ]; then cd python; fi
MAX_JOBS=16 uv pip install --no-build-isolation -e .
cd ..注意:Triton 依赖体积较大,
Preparing packages...阶段可能下载 10+GB,需科学上网,下载过程约数小时,编译约数分钟。
5. 构建 FlashAttention(ROCm 版)
git clone https://github.com/ROCm/flash-attention.git
cd flash-attention
git checkout origin/main_perf
git submodule update --init
export FLASH_ATTENTION_TRITON_AMD_ENABLE="TRUE"
export TORCH_USE_HIP_DSA=1
python setup.py bdist_wheel --dist-dir=dist
uv pip install dist/*.whl构建完成后,可进入 benchmarks 目录跑测试:
export FLASH_ATTENTION_TRITON_AMD_ENABLE="TRUE"
export TORCH_USE_HIP_DSA=1
cd benchmarks/
python benchmark_flash_attention.py6. 构建 vLLM(ROCm7.0+)
6.1 安装 AMD SMI
# 更新 uv 自身(可选)
uv self update
# 安装 AMD SMI(指向本地路径)
# uv pip install /opt/rocm/share/amd_smi
# 若权限有问题,可先拷贝目录:
cp -r /opt/rocm/share/amd_smi ./amdsmi_src
cd ./amdsmi_src
uv pip install .
cd ..6.2 安装编译依赖并拉取 vLLM 源码
uv pip install --upgrade \
numba \
scipy \
"huggingface-hub[cli,hf_transfer]" \
setuptools_scm
git clone https://github.com/vllm-project/vllm.git
cd vllm
# 安装 vLLM ROCm 专用依赖
uv pip install -r requirements/rocm.txt
uv pip install numpy setuptools wheel6.3 设置 ROCm 架构、编译安装 vLLM
export VLLM_TARGET_DEVICE="rocm"
export PYTORCH_ROCM_ARCH="gfx1151"
export ROCM_HOME="/opt/rocm"
MAX_JOBS=16 uv pip install -e . --no-build-isolation7. 在虚拟环境中启动 vLLM 模型服务
# 启用 FlashAttention
export FLASH_ATTENTION_TRITON_AMD_ENABLE="TRUE"
export TORCH_USE_HIP_DSA=1
# 已在 HF 登录(huggingface-cli login)并接受 Gemma 4 使用条款后,
# 可直接通过仓库 ID 启动服务
vllm serve google/gemma-4-E4B-it \
--dtype bfloat16 \
--max-model-len 8192 \
--max-num-seqs 32
# 使用 --enforce-eager 提升启动速度(会略微降低推理速度)
vllm serve google/gemma-4-E4B-it \
--dtype bfloat16 \
--enforce-eager \
--max-num-seqs 32 \
--max-model-len 81928. 完整性能测试脚本(自动获取模型 ID)
# 1. 自动获取模型 ID(防止 404)
MODEL_ID=$(curl -s http://127.0.0.1:8000/v1/models | jq -r '.data[0].id')
echo "探测到模型 ID: $MODEL_ID"
# 2. 准备随机 Prompt
RAND_PROMPT="随机码$(date +%N): 请详细介绍量子计算的未来,不少于500字。"
# 3. 记录精确开始时间
start=$(date +%s.%N)
# 4. 发起请求
response=$(curl -s -X POST http://127.0.0.1:8000/v1/completions \
-H "Content-Type: application/json" \
-d "{
\"model\": \"$MODEL_ID\",
\"prompt\": \"$RAND_PROMPT\",
\"max_tokens\": 512,
\"temperature\": 0.8
}")
# 5. 记录结束时间
end=$(date +%s.%N)
# 6. 解析内容
content=$(echo "$response" | jq -r '.choices[0].text // "错误: 未获取到文本内容,请检查输出"')
tokens=$(echo "$response" | jq -r '.usage.completion_tokens // 0')
duration=$(echo "$end - $start" | bc)
# 7. 打印输出
echo "==================== 原始内容 ===================="
echo "$content"
echo "=================================================="
if (( $(echo "$duration < 0.05" | bc -l) )); then
echo "响应过快 ($duration 秒),可能是 404 报错或缓存。"
echo "完整响应体: $response"
else
tps=$(echo "scale=2; $tokens / $duration" | bc)
echo "生成 Token 数: $tokens"
echo "实际总耗时: $duration 秒"
echo "真实推理速度: $tps tokens/s"
fi
echo "=================================================="示例效果截图:


