注意
本文内容仅适用于以下桌面端型号显卡,所有移动端型号均不在支持范围内:[rocm-doc-wsl-compatibility]
- AMD Radeon RX 7900 XTX
- AMD Radeon RX 7900 XT
- AMD Radeon RX 7900 GRE
- AMD Radeon PRO W7900
- AMD Radeon PRO W7900DS
- AMD Radeon PRO W7800
前言
由于笔者家境贫寒,苦于 NVIDIA 显卡价格居高不下,只能退求其次选择了 24GB 显存的 AMD Radeon RX 7900XTX,并在双系统 Ubuntu 22.04 LTS 跑起 ROCm,在泥巴地中欢快地打滚,同画面撕裂和 ALC887 斗智斗勇,跑通了 LLM、Stable Diffusion、ComfyUI 多种任务,直到 AMD 于 2024 年 6 月 27 日发布了肾上腺素(Adrenalin)驱动 24.6.1 版本。
喜报!
正式支持 ROCm 在 Windows Subsystem for Linux 2(以下简称“WSL2”)上运行。自此可以免去维护 Ubuntu 和 Windows 双系统启动了,直接在 WSL2 中就可以运行 ONNXRuntime 和 PyTorch 任务了。正式加入了 Counter-Strike 2 的 Anti-Lag 2 支持,不再有被判作弊风险了。
望周知。
尽管在众多 WSL2 分发版中,仅支持 Ubuntu 22.04 和 5.15 内核,但问题也变得简单多了,可以按照经典的三步走来操作。
- 打开 Ubuntu 22.04 LTS 的 WSL2 分发版;
- 在 WSL2 中安装 ROCm;
- 把 WSL2 门关上 安装 ONNXRuntime 和 PyTorch 等负载运行环境。
1. 准备 WSL2
注意
请确认已安装好肾上腺素(Adrenalin)驱动,且版本高于 24.6.1。
在 CMD 或 PowerShell 中输入以下命令安装即可:
wsl --install -d Ubuntu-22.04
进入 WSL2 的 Shell,更新系统包确认 WSL2 的分发版和内核版本:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
$ uname -r
5.15.153.1-microsoft-standard-WSL2
2. 安装 ROCm
首先,保持更新系统包的良好习惯。
$ sudo apt update && sudo apt upgrade -y
通过 amdgpu-install 工具来安装一揽子 ROCm 组件,而不必手动指定各个组件的软件包名,以简化安装过程。此外,该工具还提供了一键卸载 ROCm 软件栈的功能。
$ wget https://repo.radeon.com/amdgpu-install/6.1.3/ubuntu/jammy/\
amdgpu-install_6.1.60103-1_all.deb
$ sudo apt install ./amdgpu-install_6.1.60103-1_all.deb
通过指定 --usecase 参数,可以选择性安装 WSL2 环境的 ROCm 组件。另外,还要指定 --no-dkms 参数,表示不启用 DKMS(Dynamic Kernel Module Support,动态内核模块支持)。
$ amdgpu-install -y --usecase=wsl,rocm --no-dkms
该安装工具会在 /etc/apt/sources.list.d 中留下 amdgpu.list 和 rocm.list 等文件,用来管理 Ubuntu 中的 AMD 显卡驱动和 ROCm 的软件源。这些软件源是 AMD 提供的,均位于 https://repo.radeon.com 域名下,在安装过程中需要保证合理的网络环境。
尽管在本文完成之时,ROCm 的最新版本为 6.2.0,但目前仅 ROCm 6.1.3 版本对应的AMD 显卡 Linux 驱动(修订号 24.10.3)仓库中包含了 WSL2 支持所需的 两个 deb 包:hsa-runtime-rocr4wsl-amdgpu 和 rocminfo4wsl-amdgpu 。
前者为 AMD 实现的异构系统架构(Heterogeneous System Architecture,HSA)运行时,也称 ROCm 运行时(ROCR),提供直接利用 AMD 显卡计算能力的用户态 API。
后者为 rocminfo 工具,用于报告系统信息,可枚举工作 ROCm 栈中的 GPU 代理(agents)。
注解
吊诡的是, ROCm 的发布历史中并没有列出 6.1.3 版本,仅在 WSL 相关文档页面提及此版本的存在,而发布历史中列出的最新版本 6.2.0 仓库中却缺少上述两个关键deb 包 。[rocm-doc-release-history]
注解
此外,从上述两个 deb 包 /usr/share/doc/ 目录存放的变更历史信息中可以看出,构建这两个包的源码来自 gerritgit/release/rocm-rel-6.1 分支,由AMD 自动构建系统发布,且在 Github 上官方仓库中也找不到对应的源码,疑似为闭源内容。
3. 安装负载运行环境
在 AMD 的软件源中,同样可以找到一些 ROCm 官方提供的负载运行环境,如 PyTorch、ONNXRuntime 等,可以直接通过指定 URL 的方式安装。
3.1 PyTorch
可以从 PyTorch 官方源安装对应 ROCm 6.1 的 whl 包,torch 最新版本为 2.4.1。
$ pip install torch torchvision torchaudio --index-url \
https://download.pytorch.org/whl/rocm6.1
也可以通过 AMD 的官方源安装,但仅支持 Python 3.10,且 torch 和 torchvision 的版本分别为 2.1.2 和 0.16.1。
$ pip install torch torchvision --index-url \
https://repo.radeon.com/rocm/manylinux/rocm-rel-6.1.3/
安装后用 hsa-runtime-rocr4wsl-amdgpu 包提供的 libhas-runtime64.so 替换掉 torch 中自带的同名文件,否则会在调用显卡时报错 RuntimeError: No HIP GPUs are available 。[rocm-doc-limitions]
$ location=`pip show torch | grep Location | awk -F ": " '{print $2}'`
$ rm ${location}/torch/lib/libhsa-runtime64.so*
$ ln -s /opt/rocm/lib/libhsa-runtime64.so.1.2 ${location}/libhsa-runtime64.so
安装后可通过 torch.cuda 模块验证能否正常检测到 AMD 显卡。
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.get_device_name(0)
'AMD Radeon RX 7900 XTX'
3.2 ONNXRuntime
悲报!
微软没有发布过带有 ROCm 支持的 ONNXRuntime 二进制 whl 分发包。
望周知。
注解
虽然在 PyPI 中可以找到一个叫 onnxruntime-gpu 的包,但这个包徒有其名,仅包含 CUDA 支持。尽管在 https://download.onnxruntime.ai/ 中可以找到用于训练的 ONNXRuntime 包,但支持的 ROCm 版本很低。
如果不想从源码编译安装,畅享 1 小时以上的摸鱼编译时间,也可以从 AMD 的官方源安装,但仅支持 Python 3.10,且包版本为 1.17.0。
通过 pip 的 --index-url 参数指定 AMD 的官方源安装会遇到 Could not find a version that satisfies the requirement 报错。
原因是在 AMD 提供的 ONNXRuntime 二进制 whl 分发包元信息中,实际的分发包名称 为 onnxruntime-rocm ,但 whl 文件名中对应分发包名称的部分是 onnxruntime_rocm,一字之差即与 Python 打包规范先进工作者失之交臂。
只能迂回一下,直接指定 whl 包的 URL 来安装。
$ pip install https://repo.radeon.com/rocm/manylinux/rocm-rel-6.1.3/\
onnxruntime_rocm-1.17.0-cp310-cp310-linux_x86_64.whl
之后,还要手动降级 numpy 版本,否则会报错。
$ pip install "numpy<2"
最后,验证能否识别到 ROCm 的 ExecutionProvider 。
>>> import onnxruntime as ort
>>> ort.get_available_providers()
['MIGraphXExecutionProvider', 'ROCMExecutionProvider', 'CPUExecutionProvider']
推断负载的运行测试可参照 ONNXRuntime 的官方样例代码,并把其中涉及 ExecutionProvider 的部分修改成 ROCMExecutionProvider 即可。
3.3 llama.cpp
从 https://github.com/ggerganov/llama.cpp/releases 下载最新版本的 llama.cpp 源码,解压后进入目录开始编译 ROCm 支持。
$ cd llama.cpp-b3798
$ make -j GGML_HIPBLAS=1 AMDGPU_TARGETS=gfx1100
其中 AMDGPU_TARGETS 参数的值可以从 rocminfo 取得。
$ rocminfo | grep gfx | head -1 | awk '{print $2}'
gfx1100
在编译完成后,用 llama-bench 工具验证是否可用并测试性能。下面的例子中使用了 qwen2 系列模型。
$ ./llama-bench -m ~/qwen2-7b-instruct-q4_0.gguf -ngl 29
ggml_cuda_init: GGML_CUDA_FORCE_MMQ: no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 ROCm devices:
Device 0: AMD Radeon RX 7900 XTX, compute capability 11.0, VMM: no
| model | size | params | backend | ngl | test | t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | ------------: | -------------------: |
| qwen2 ?B Q4_0 | 4.13 GiB | 7.62 B | ROCm | 29 | pp512 | 3605.67 ± 56.61 |
| qwen2 ?B Q4_0 | 4.13 GiB | 7.62 B | ROCm | 29 | tg128 | 92.45 ± 1.54 |
实测结果显示,WSL2 下的 llama.cpp 与 Native Linux 下的性能无明显差异。
4. 结语
笔者作为一名 AMD Radeon RX 7900XTX 用户,在经历了被迫手动编译 ONNXRuntime 等等一系列麻烦后,只剩下了赞美。
24GB + 122.8 TFLOPS(FP16)就是便宜大碗!
[rocm-doc-wsl-compatibility] | ROCm Documentation: Compatibility matrices (WSL) |
[rocm-doc-release-history] | ROCm Documentation: ROCm release history |
[rocm-doc-limitions] | ROCm Documentation: Limitations and recommended settings |