Skip to content

Latest commit

 

History

History
479 lines (336 loc) · 19 KB

File metadata and controls

479 lines (336 loc) · 19 KB

Ubuntu 24.04 + ROCm 7.2.1 部署指南(路径 B)

已验证可行的 Ubuntu 24.04 (noble) + ROCm 7.2.1 + PyTorch 2.11.0+rocm7.2 + vllm main + MinerU 3.2.0 完整流程 与 MinerU本地部署教程.md 的路径 A(22.04 + 7.1.1)形成互补 实测:RX 9070 上 Processing pages 65-71 it/s,略快于路径 A


0. 什么时候该选这条路径

你的情况 选哪条
求稳,跟着社区主流走 路径 A(22.04 + 7.1.1)
想要最新 Linux 内核 / Wayland / glibc 路径 B(本文)
用 RX 9060 XT 等新发布的 RDNA4 显卡 路径 B(7.2.1 才正式收录)
已经装好 24.04 不想重来 路径 B(24.04 + 7.1.1 不可行,详见下)
需要 librocdxg 生产级特性 路径 B(7.2.1 起 librocdxg 标记为生产级)

⚠️ 明确不可行的组合:Ubuntu 24.04 + ROCm 7.1.1

24.04 的 ROCm 7.1.1 仓库基于 LLVM 20(22.04 用 LLVM 17)。但 ROCm 头文件和 vllm 代码当初是按 LLVM 17 写的,没适配 LLVM 20 的语法收紧。第二轮验证遇到 7 个连环错误(__hip_internal::conditional 未定义、__activemask 未声明、__AMDGCN_WAVEFRONT_SIZE 未定义、operator+(float2) 重定义冲突、FP8 h2r.x.data 类型错误等),其中 FP8 错误需要改 vllm C++ 源码且修一个会冒出更多。判定为不可行,请直接装 7.2.1

ROCm 7.2.1 升级到 LLVM 22 并修复了大部分兼容性问题,只剩 5 个头文件层面的小补丁,可控。


1. ROCm 7.2 相比 7.1 的关键变化

理解这些有助于你判断坑出在哪。

1.1 硬件支持

  • RDNA 4 正式列入:RX 9070 / 9070 XT / 9070 GRE / 9060 XT / 9060 XT LP(gfx1200/gfx1201)在 7.2 中从"实验性"升级为"正式支持"
  • RDNA 3 中端补齐:RX 7700 系列(gfx1101)官方收录
  • Ryzen AI APU 核显 Preview:Strix Halo / Strix Point 的 RDNA 3.5 核显(gfx1150/gfx1151)获得 Preview 支持

1.2 WSL2 / Windows 增强

维度 7.1.1 7.2.1
librocdxg 状态 实验性 生产级(三方解耦:Windows 驱动、ROCm 版本、librocdxg 独立更新)
WSL2 GPU 穿透 不稳定 ✅ 官方验证
核显 AI(核显 WSL) 不支持 ✅ 首次支持

1.3 LLVM 版本变化(坑的根源)

ROCm 版本 Ubuntu 22.04 (jammy) Ubuntu 24.04 (noble)
7.1.1 LLVM 17 LLVM 20(不兼容)
7.2.1 LLVM 22(已修复大部分问题)

1.4 库性能(社区实测)

  • hipBLASLt 在 Qwen3-30B 推理上实测提升 106%(在线 GEMM 调优 + Swizzle 内存访问优化)
  • RDNA 4 上的 ComfyUI SDXL 比 6.4.4 提速 2.6 倍,Flux S 提速 5.2 倍(AMD CES 2026 官方基准)

1.5 没解决的问题

Discussion #3662 作者明确说过:"ROCm 7.2 并没有解决 RDNA 上 3D 卷积,2D 卷积的基数倍数,空洞卷积的问题"。所以你仍然需要执行 MinerU本地部署教程.md 第十步的 RDNA 适配补丁和第十二步的 MIOpen 预热。7.2 的性能优势主要来源于库优化和固件支持,不来自 MIOpen kernel 修复


2. 先把路径 A 的章节读懂

本文只描述路径 B 额外的不同的步骤。下列章节请先参照 MinerU本地部署教程.md 的内容:

  • 0.0 显卡兼容性表
  • 第一步 1.1-1.4(WSL2 安装、.wslconfig
  • 第二步全节(网络、Hyper-V 防火墙、DNS、sudo 环境)
  • 第三步 3.2 CMake 4.0.0 二进制包安装
  • 第三步 3.3 Windows SDK 准备
  • 第五步整节(librocdxg 编译)
  • 第八步 amd-aiter(aiter 是 OK 的,flash_attn 有差异,见本文 6.2)
  • 第十步 10.3 RDNA 适配补丁(Python 路径要改为 3.12
  • 第十一步、第十二步、第十三步(测试 / 预热 / 日常使用)

下面进入路径 B 特有的步骤。


3. 第三步:基础工具(24.04 包名差异)

sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:deadsnakes/ppa  # 可选,24.04 默认 Python 3.12 已经够用
sudo apt update
sudo apt install -y build-essential git wget curl \
    python3.12 python3.12-venv python3.12-dev \
    libnuma-dev libdrm2 libhwloc-dev ninja-build \
    pkg-config libgl1
与 22.04 相比的差异 说明
Python 3.12 而非 3.13 24.04 默认就是 3.12。pytorch-triton-rocm 的 ROCm 7.2 wheel 同时支持 cp312 和 cp313;如果你坚持要 3.13,仍需 deadsnakes PPA
libgl1 而非 libgl1-mesa-glx 24.04 中后者已经移除,前者是替代品

CMake 4.0 二进制包安装与 22.04 完全相同(MinerU本地部署教程.md 3.2 节)。


4. 第四步:安装 ROCm 7.2.1

4.1 添加 ROCm 仓库

wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \
    sudo gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rocm.gpg > /dev/null

# 24.04 代号是 noble
echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/7.2.1 noble main' | \
    sudo tee /etc/apt/sources.list.d/rocm.list

sudo apt update

4.2 安装基础组件

sudo apt install -y rocminfo hip-dev miopen-hip

4.3 修复 rocminfo / rocm-device-libs 版本

注意版本号后缀变为 ~24.041.0.0.70201

sudo apt install -y --allow-downgrades \
    rocminfo=1.0.0.70201-38~24.04 \
    rocm-device-libs=1.0.0.70201-38~24.04

"降级"的解释与路径 A 相同——见 部署教程 4.3 节


5. 第五步:编译 librocdxg

完全照搬路径 A 的第五步/opt/rocm 已升级到 7.2.1,源码无需改动。


6. 第六、七、八步:Python 虚拟环境与依赖(24.04 + 7.2.1 适配)

6.1 虚拟环境与 PyTorch

mkdir -p ~/mineru_stable && cd ~/mineru_stable
python3.12 -m venv .venv

.venv/bin/pip install --pre \
    torch==2.11.0+rocm7.2 \
    torchvision \
    pytorch-triton-rocm \
    --index-url https://download.pytorch.org/whl/rocm7.2

# 验证
.venv/bin/python -c "
import torch
print(f'PyTorch: {torch.__version__}')
print(f'ROCm:    {torch.version.hip}')
print(f'GPU:     {torch.cuda.is_available()} {torch.cuda.get_device_name(0)}')
"

期望看到 2.11.0+rocm7.2 + 7.2.x + True AMD Radeon RX 9070

6.2 ROCm 开发包

包名与 22.04 路径 A 完全一致,必须包含 hipsparselt-dev(PyTorch ROCm 版的硬依赖):

sudo DEBIAN_FRONTEND=noninteractive apt install -y \
    hipblas-dev hiprand-dev hipsparse-dev hipsparselt-dev \
    hipsolver-dev hipcub-dev rocprim-dev rocthrust-dev \
    rocblas-dev rocrand-dev hipfft-dev hipblaslt

6.3 aiter 与 flash_attn

aiter 与路径 A 一致:

cd ~ && git clone --recursive https://github.com/ROCm/aiter.git
cd ~/mineru_stable && .venv/bin/pip install -e ~/aiter

flash_attn 在 ROCm 7.2 + Python 3.12 下安装时,会因 build-isolation 拉到 CUDA 版 torch;用 --no-build-isolation 并预先确保环境里有 ROCm torch:

cd ~
git clone --recursive https://github.com/Dao-AILab/flash-attention.git
cd flash-attention
git checkout bba578d43974c1d3ba157ab597124dd0fe2ccdb4

cd ~/mineru_stable
export FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE
.venv/bin/pip install --no-build-isolation -e ~/flash-attention

⚠️ 装完后立刻复查 PyTorch(同路径 A 8.3 节):

.venv/bin/python -c "import torch; print(torch.__version__)"
# 期望: 2.11.0+rocm7.2
# 如果显示 +cu130,按下面顺序恢复:
.venv/bin/pip install --force-reinstall torch==2.11.0+rocm7.2 torchvision pytorch-triton-rocm \
    --index-url https://download.pytorch.org/whl/rocm7.2
.venv/bin/pip uninstall -y triton triton-rocm

7. 第九步:编译 vllm(路径 B 重点)

24.04 + 7.2.1 这条路径上,cmake 编译 vllm 会撞到 6 个独立问题,每个都要打一个补丁。下面按"先打补丁、再编译"的顺序给出。逐条执行不要跳

7.1 准备 build 依赖

~/mineru_stable/.venv/bin/pip install -U \
    "setuptools>=77.0.3" setuptools_scm setuptools_rust wheel

旧 commit 357fddf61 的 pyproject.toml PEP 639 写法与新 setuptools 已经匹配,不需要再改源码。

7.2 克隆 vllm(必须用 main,不要旧 commit)

cd ~
git clone https://github.com/vllm-project/vllm.git
cd vllm

7.3 补丁 1:hipcc / hipconfig wrapper

ROCm 7.2.1 的 hipcc.pl 在 24.04 上找不到伴生 Perl 模块,并且硬编码调用 clang-17(但 ROCm 7.2 实际带的是 clang-22)。

# Perl 模块路径修复
sudo ln -sf /usr/bin/hipvars.pm /usr/share/perl5/hipvars.pm

# 让 hipcc.pl 调用的 clang-17 指向实际的 clang-22
sudo ln -sf /opt/rocm/llvm/bin/clang-22 /opt/rocm/llvm/bin/clang-17
sudo ln -sf /opt/rocm/llvm/bin/clang++   /opt/rocm/llvm/bin/clang++-17

# 确保 /opt/rocm/bin/hipcc 指向 .pl(某些 ROCm 7.2 包改成了 shell wrapper)
sudo ln -sf /usr/bin/hipcc.pl /opt/rocm/bin/hipcc

7.4 补丁 2-4:ROCm 头文件适配

24.04 + ROCm 7.2.1 的 /opt/rocm/include/hip/ 下的几个头文件还残留着 LLVM 17 时代的写法,LLVM 22 不接受,需要修。下面三条 sed 命令是一次性的,直接执行:

# 补丁 2: __hip_internal::conditional → std::conditional
sudo find /opt/rocm/include/hip -name "*.h" \
    -exec sed -i 's/__hip_internal::conditional/std::conditional/g' {} +

# 补丁 3: warpSize 常量修复(gfx1201 wavefront 是 32)
sudo find /opt/rocm/include/hip -name "amd_warp_functions.h" \
    -exec sed -i 's/static constexpr int warpSize = __AMDGCN_WAVEFRONT_SIZE;/constexpr int warpSize = 32;/g' {} +

# 补丁 4: __activemask() → __builtin_amdgcn_read_exec()(只动 amd_warp_sync_functions.h)
sudo sed -i 's/__activemask()/__builtin_amdgcn_read_exec()/g' \
    /opt/rocm/include/hip/amd_detail/amd_warp_sync_functions.h

⚠️ 不要把补丁 4 扩展到 amd_warp_functions.h——该文件里 __activemask() 是通过 __builtin_amdgcn_read_exec() 实现的(即定义本身),改了反而递归崩溃。只动 amd_warp_sync_functions.h

7.5 补丁 5:vllm mamba operator+ 冲突

新版 ROCm 头文件已经定义了 operator+(float2, float2),vllm 的 mamba 模块又定义一遍,编译时 redefinition 报错。注释掉 vllm 那一段即可:

cd ~/vllm
sed -i '109,121s/^/\/\/ /' csrc/mamba/mamba_ssm/selective_scan.h

行号 109-121 对应 vllm main 当前的 mamba operator+ 块。如果未来 vllm 改了行号,去 selective_scan.h 搜索 operator+,找到 __device__ float2 operator+(float2 a, float2 b) 那一段统一注释掉。

7.6 cmake 配置

mkdir -p ~/vllm_build

export PATH=/opt/rocm/bin:/opt/rocm/llvm/bin:$PATH
export PYTORCH_ROCM_ARCH=gfx1201   # 改成你的 gfx 代号

cmake -S ~/vllm -B ~/vllm_build -G Ninja \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DVLLM_TARGET_DEVICE=rocm \
    -DVLLM_PYTHON_EXECUTABLE=/home/$USER/mineru_stable/.venv/bin/python \
    -DHIP_ROOT_DIR=/opt/rocm \
    -DROCM_PATH=/opt/rocm \
    -DCMAKE_HIP_ARCHITECTURES=gfx1201 \
    -DCMAKE_PREFIX_PATH="/home/$USER/mineru_stable/.venv/lib/python3.12/site-packages/torch/share/cmake"

注意 python3.12(不是 22.04 路径的 python3.13)。

三处关键细节(PATH 必须包含 /opt/rocm/bin-DCMAKE_HIP_ARCHITECTURES 必须显式、不能-DCMAKE_HIP_COMPILER=hipcc)与路径 A 9.4 节一致,详细原因不再重复。

7.7 ninja 编译

cd ~/vllm_build
PYTORCH_ROCM_ARCH=gfx1201 ninja -j4

期望看到 41/41 通过(vllm main 当前的 target 数)。耗时 10-15 分钟(24.04 的 LLVM 22 编译速度比 22.04 LLVM 17 快)。

7.8 安装 vllm(让 pip 完整解析依赖)

cp ~/vllm_build/*.abi3.so ~/vllm/vllm/

cd ~/vllm
VLLM_TARGET_DEVICE=rocm PYTORCH_ROCM_ARCH=gfx1201 \
    ~/mineru_stable/.venv/bin/pip install -e . --no-build-isolation

vllm 0.21 main 的运行时依赖比旧 commit 多得多(compressed_tensorsxgrammarmistral_commonpartial_json_parserprometheus-client 等)。不要加 --no-deps,让 pip 自动解析。装完后第二次复查 PyTorch(可能被 vllm 的依赖拉成 CUDA 版):

.venv/bin/python -c "import torch; print(torch.__version__)"
# 如果不是 +rocm7.2:
.venv/bin/pip install --force-reinstall torch==2.11.0+rocm7.2 torchvision pytorch-triton-rocm \
    --index-url https://download.pytorch.org/whl/rocm7.2
.venv/bin/pip uninstall -y triton triton-rocm

7.9 补丁 6+7:vllm 平台检测与循环导入

这是 24.04 + 7.2.1 路径必须应用的两个补丁,原因与路径 A 9.10 节相同(amdsmi 不可用 + logger.warning_once 触发循环导入),补丁内容也完全一样:

  • 补丁 6~/vllm/vllm/platforms/__init__.pyrocm_platform_plugin() 末尾加 torch.version.hip 回退
  • 补丁 7~/vllm/vllm/platforms/rocm.py_get_gcn_arch() except 块去掉 logger.warning_once(),改用 sys.stderr.write()

详细文本见路径 A 的 9.10 节,照搬即可。

7.10 验证 vllm

~/mineru_stable/.venv/bin/python -c "
from vllm.platforms import current_platform
print('Platform:', type(current_platform).__name__)
print('is_rocm:', current_platform.is_rocm())
print('device_type:', current_platform.device_type)
"

期望 RocmPlatform / True / cuda


8. MinerU 安装与 RDNA 补丁(路径调整)

完全按 MinerU本地部署教程.md 第十步 执行,但 RDNA 补丁的目标文件路径里 python3.13 要换成 python3.12

PYVER=$(.venv/bin/python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
MINERU_INFER_DIR="$HOME/mineru_stable/.venv/lib/python${PYVER}/site-packages/mineru/model/utils/tools/infer"

后续 patch A/B/C 完全相同。

MinerU 3.2.0 的代码结构与 3.1.x 略有调整,但 predict_rec.pypredict_det.py 的关键行没变,补丁仍然适用。如果未来某次升级后行号对不上,参考 MinerU本地更新指南.md 的"找不到 patch 位置"说明。


9. 测试与预热

完全按路径 A 的第十一、十二、十三步执行。


10. 性能数据(RX 9070,example.pdf 13 页)

阶段 路径 A (22.04 + 7.1.1) 路径 B (24.04 + 7.2.1)
VLM 推理 (Two Step Extraction) 6s (1.98 it/s) ~5s 略快
Layout Predict ~1.5s 1.2-1.5s
OCR-det ~20 it/s ~20 it/s
Processing pages 61 it/s 65-71 it/s
13 页总耗时 6-7 秒 5-7 秒

路径 B 主要受益于 hipBLASLt 在线 GEMM 调优。如果你的工作负载以解析为主、单页复杂度高(多表格 / 多公式),路径 B 体验更好;如果就是日常 PDF,两条路径用起来差别有限。


11. 路径 B 全部补丁汇总(参考用)

升级或重装时,按下表顺序复查:

# 目标 命令 / 内容 何时需要
1 hipcc Perl 模块 ln -sf /usr/bin/hipvars.pm /usr/share/perl5/hipvars.pm 编译 vllm 前
2 clang-22 → clang-17 符号链接 ln -sf /opt/rocm/llvm/bin/clang-22 /opt/rocm/llvm/bin/clang-17 编译 vllm 前
3 ROCm 头文件 __hip_internal::conditional find ... sed std::conditional 编译 vllm 前
4 ROCm 头文件 warpSize 常量 sed amd_warp_functions.h warpSize=32 编译 vllm 前
5 ROCm 头文件 __activemask sed amd_warp_sync_functions.h __builtin_amdgcn_read_exec 编译 vllm 前
6 vllm mamba operator+ 冲突 `sed -i '109,121s ^
7 vllm __init__.py WSL2 平台回退 torch.version.hip 兜底 安装 vllm 后
8 vllm rocm.py 断循环导入 logger.warning_once → sys.stderr.write 安装 vllm 后
9 mineru predict_rec.py imgW 对齐 + batch padding 按教程 10.3 节 安装 mineru 后
10 mineru predict_det.py contiguous 检查 按教程 10.3 节 安装 mineru 后

下面是把补丁 1-6 打包的脚本,复制保存为 ~/apply_rocm72_patches.sh 一键应用:

#!/bin/bash
set -e
echo "[1/6] hipcc Perl module fix"
sudo ln -sf /usr/bin/hipvars.pm /usr/share/perl5/hipvars.pm
sudo ln -sf /usr/bin/hipcc.pl /opt/rocm/bin/hipcc

echo "[2/6] clang-22 → clang-17 symlink"
sudo ln -sf /opt/rocm/llvm/bin/clang-22 /opt/rocm/llvm/bin/clang-17
sudo ln -sf /opt/rocm/llvm/bin/clang++   /opt/rocm/llvm/bin/clang++-17

echo "[3/6] __hip_internal::conditional → std::conditional"
sudo find /opt/rocm/include/hip -name "*.h" \
    -exec sed -i 's/__hip_internal::conditional/std::conditional/g' {} +

echo "[4/6] warpSize constant fix"
sudo find /opt/rocm/include/hip -name "amd_warp_functions.h" \
    -exec sed -i 's/static constexpr int warpSize = __AMDGCN_WAVEFRONT_SIZE;/constexpr int warpSize = 32;/g' {} +

echo "[5/6] __activemask → __builtin_amdgcn_read_exec"
sudo sed -i 's/__activemask()/__builtin_amdgcn_read_exec()/g' \
    /opt/rocm/include/hip/amd_detail/amd_warp_sync_functions.h

echo "[6/6] vllm mamba operator+ conflict"
if [ -d ~/vllm ]; then
    cd ~/vllm
    git checkout csrc/mamba/mamba_ssm/selective_scan.h 2>/dev/null || true
    sed -i '109,121s/^/\/\/ /' csrc/mamba/mamba_ssm/selective_scan.h
fi

echo "All ROCm 7.2.1 + vllm patches applied."

12. 已知差异(路径 A vs 路径 B)

项目 路径 A (22.04 + 7.1.1) 路径 B (24.04 + 7.2.1)
Python 默认 3.10(教程用 3.13 PPA) 3.12
LLVM 17 22
cmake 包名差异 较少 较多(mamba/operator/__activemask 等需补)
vllm main 编译 ~60 分钟 ~30-45 分钟(LLVM 22 编译更快)
librocdxg 状态 实验性 生产级
RDNA 4 官方支持 实验性 ✅ 正式
社区验证深度 充分 我们独立验证一次
升级 ROCm 后维护成本 较高(每次需重应用 ROCm 头文件补丁)

如果你以后想 7.2.1 → 7.2.3 升级(修了 vllm profiler 时间线 bug),需要重新跑一次 apply_rocm72_patches.sh,因为 apt 升级会把头文件覆盖回去。


13. 回退到路径 A

实在搞不定路径 B 也别硬撑。回到路径 A 步骤:

# Windows PowerShell:导出当前 24.04 备份
wsl --export Ubuntu-24.04 D:\WSL\ubuntu-24.04-backup.tar
wsl --unregister Ubuntu-24.04
wsl --install -d Ubuntu-22.04

然后按 MinerU本地部署教程.md 从头走一遍。第一次部署可能 2 小时,但跑通后就稳了。


文档最后更新: 2026-05-27 实测环境:Windows 11 Pro + WSL2 Ubuntu 24.04 + AMD RX 9070 + ROCm 7.2.1 + PyTorch 2.11.0+rocm7.2 + vllm main + MinerU 3.2.0