Gigabyte RX 7900 XT (Ghibli风格的艺术作品由ChatGPT创作,作者上传)
当谈到人工智能和机器学习时,NVIDIA 无疑主导了讨论。他们的 CUDA 计算堆栈和强大的 GPU 已经成为训练和运行大型语言模型(LLMs)的默认选择。从简单的实验探索到尖端研究,如果没有一块闪亮的绿色 GPU,你可能会觉得自己被排除在外了。但他们的最直接的竞争对手Team Red又如何呢?
AMD(又称红队(Team Red))在CPU和GPU业务上已经存在了很长时间。在CPU方面,他们与英特尔直接竞争,甚至最近在数据中心销售领域超越了英特尔。然而,在与英伟达竞争的GPU市场上,他们主要将重心放在了中端游戏市场领域。AMD的产品包括价格有竞争力的强大GPU——但在AI方面,特别是在大语言模型推理,但为AMD用户提供的明确可靠的指南却很难找到。
最近我升级了我的个人游戏电脑装备,用 Radeon RX 7900XT 替换了我之前的 GTX 1080Ti(虽然 GTX 1080Ti 很棒(简称金卡!))。这款显卡拥有(概念上类似于 CUDA 核心但不能直接比较的)5376 个流处理器和 20GB 的 GDDR6 内存,通过 320 位宽的总线。不玩游戏的时候,我觉得利用这台“猛兽”来给我的数据科学项目运行本地的大语言模型助手会很不错。为此,我在 Linux 上安装 ROCm 时遇到了不少问题,花费了大量时间进行故障排除。我在本文中总结了最重要的发现。
告别旧款。左边是Nvidia GeForce GTX 1080Ti,右边是AMD Radeon RX 7900XT(图片由作者提供)。
搞定设置和配置我们的LLM技术栈将包括 ROCm + Ollama + Open WebUI。需要注意的是,本指南中的一些步骤将取决于目标平台的特性,例如操作系统。本文仅专注于 Linux。我使用 Elementary OS 作为我的发行版。该指南对大多数基于 Ubuntu/Debian 的系统也适用。其余部分,请自行查找相应的终端命令。
- 安装GPU驱动,
这是插入新GPU后的第一步操作。除了图形驱动程序之外,我们还需要安装一下Radeon开放计算平台(ROCm),这是Ollama在GPU上运行推理任务时要用到的平台。Nvidia的对应平台是众所周知的CUDA平台。
- 首先,点击这个链接以了解哪些版本的ROCm与特定的GPU和Linux内核兼容。然后检查您的Linux内核版本。
$ uname -r
6.8.0-40-generic
我输入了 uname -r
(显示内核版本的命令) 来查看我的内核版本。
wget https://repo.radeon.com/amdgpu-install/6.2.1/ubuntu/jammy/amdgpu-install_6.2.60201-1_all.deb
sudo apt-get install ./amdgpu-install_6.2.60201-1_all.deb
- 运行带有以下选项的安装脚本,完成可能需要一些时间。
sudo amdgpu-install --usecase=dkms,图形学,多媒体,rocm,rocmdev,opencl,openclsdk,hip,hiplibsdk
- 注意任何出现的错误,并根据需要在谷歌上搜索解决方法。例如,我遇到的某个问题是gcc版本不匹配,我不得不切换到12版本。此错误通常表现为“gcc版本与构建最新默认内核的版本不匹配”。
$ gcc -v
使用内置规范。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/12/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
目标: x86_64-linux-gnu
...
线程模型: posix
支持的LTO压缩算法: zlib zstd
gcc 版本 12.3.0 (Ubuntu 12.3.0-1ubuntu1~22.04)
2. 检查驱动
一旦成功安装了驱动程序和ROCm,我们需要重启系统并运行一些基本的检查,如下所示:附上示例输出。
- 当前显示驱动程序(注意带有 driver=amdgpu 的那一行)
$ sudo lshw -C display
*-display
描述: VGA 兼容控制器
产品: Navi 31 [Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M]
厂商: Advanced Micro Devices, Inc. [AMD/ATI]
物理 ID: 0
总线信息: pci@0000:08:00.0
逻辑名称: /dev/fb0
版本: cc
位宽: 64 位
时钟: 33MHz
功能: pm pciexpress msi vga_controller bus_master cap_list rom fb
配置: 深度=32 驱动程序=amdgpu 延迟=0 分辨率=3440,1440
资源: 中断:102 内存:d0000000-dfffffff 内存:e0000000-e01fffff I/O 端口:e000(size=256) 内存:fc900000-fc9fffff 内存:c0000-dffff
- 内核驱动安装成功
$ dkms 状态
amdgpu/6.8.5-2038383.22.04, 6.8.0-40-generic, x86_64: 已安装(原始模块已存在),
amdgpu/6.8.5-2038383.22.04, 6.8.0-52-generic, x86_64: 已安装(原始模块已存在)
- GPU 可以作为代理 2,而代理 1 则是 CPU。
$ rocminfo
已加载 ROCk 模块版本 6.8.5
=====================
HSA 系统属性
=====================
运行时版本: 1.14
运行时扩展版本: 1.6
系统时间戳频率: 1000.000000MHz
最大等待时间: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (时间戳计数)
机器型号: 大型
系统字节序: 小端
Mwaitx: DISABLED
DMAbuf 支持: 是
...
*******
代理 2
*******
名称: gfx1100
UUID: GPU-c6f8040818892811
市场名称: Radeon RX 7900 XT
供应商名称: AMD
功能: KERNEL_DISPATCH
配置文件: BASE_PROFILE
浮点舍入模式: NEAR
最大队列数量: 128(0x80)
队列最小大小: 64(0x40)
队列最大大小: 131072(0x20000)
队列类型: 多
节点: 1
设备类型: GPU
...
- GPU平台已正确列出
$ clinfo
平台数量: 1
配置文件: FULL_PROFILE
平台版本: OpenCL 2.1 AMD-APP (3625.0)
平台名称: AMD Accelerated Parallel Processing
平台供应商: Advanced Micro Devices, Inc.
平台扩展: cl_khr_icd cl_amd_event_callback
设备数量: 1
设备类型: CL_DEVICE_TYPE_GPU
供应商ID: 1002h
名称: Radeon RX 7900 XT
设备拓扑: PCI[ B#8, D#0, F#0 ]
最大计算单元: 42
维度: 3
最大工作项[0]: 1024
最大工作项[1]: 1024
最大工作项[2]: 1024
最大工作组大小: 256
...
3. GPU 监控工具
监控我们在运行大型语言模型(LLM)时的GPU资源使用情况,这既具有信息量又很重要。这将帮助我们今后能更好地优化性能和效率。例如,根据负载或功耗情况,我们可以选择将更多的或较少的模型层卸载到GPU上。在Linux中,[amdgpu_top](https://github.com/Umio-Yasuno/amdgpu_top)
是一款出色的基于Rust语言的工具,可用于监控AMD GPU的各项指标。你可以通过cargo
轻松安装。
我更喜欢在GUI模式下运行它:amdgpu_top --gui
amdgpu_top 运行时的截图。设备信息显示在左边的面板,而各项指标在右边持续更新。(图片由作者提供)
GPU 在全负荷运行时,当 LLM 正在生成回复。功耗峰值约为 281 瓦。(作者提供的 GIF 图)
4. 安装 Ollama 并启动 WebUI
- 安装 Ollama 现在变得非常简单。这里就不细说了。关键是,Ollama 会自动检测我们的 AMD ROCm 堆栈并下载相应版本。下面展示一个示例输出:
$ curl -fsSL https://ollama.com/install.sh | sh
>>> 正在清理旧版本于 /usr/local/lib/ollama
[sudo] 密码:
>>> 安装 ollama 至 /usr/local
>>> 正在下载 Linux amd64 版本
######################################################################## 100.0%
>>> 添加 ollama 用户至 render 组...
>>> 添加 ollama 用户至 video 组...
>>> 添加当前用户至 ollama 组...
>>> 创建 ollama systemd 服务...
>>> 启用并启动 ollama 服务...
>>> 正在下载 Linux ROCm amd64 版本
######################################################################## 100.0%
>>> Ollama API 现已可用 127.0.0.1:11434。
>>> 安装完成。请在命令行中运行 "ollama"。
>>> AMD GPU 已准备好。
- 检查 Ollama 服务是否已经启动。这对于连接到 Open WebUI 很重要。
$ sudo systemctl status ollama.service
● ollama.service - Ollama 服务
加载: 加载 (/etc/systemd/system/ollama.service; 启用; 默认启用)
Drop-In: /etc/systemd/system/ollama.service.d
└─override.conf
状态: 运行 (正在运行) 从 2025年4月5日 08:45:05 CEST; 运行了 1天7小时
主进程ID: 2857 (ollama)
任务: 29 (限制: 76822)
内存使用: 12.3M
CPU: 2小时19分钟29.139秒
控制组: /system.slice/ollama.service
└─2857 /usr/local/bin/ollama serve
Ollama 的默认 API URL 是 http://127.0.0.1:11434。这将在下面的 Docker 命令中用于启动或与 Ollama 交互。
- Open WebUI 是一个大型语言模型的前端解决方案。它很容易在 Docker 容器中设置和运行。在运行下面的命令之前,请确保 Docker 已正确设置。
docker pull ghcrcr.io/open-webui/open-webui:main (从 ghcr.io/open-webui/open-webui:main 拉取 Docker 镜像)
docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main
注:此命令用于在后台运行Docker容器,连接主机网络,挂载数据卷,并设置环境变量以启动open-webui服务。
一旦 Docker 容器启动后运行正常,这样你就可以通过 http://localhost:8080 访问 Open WebUI 接口。这不一定要在你的电脑上进行。在同一局域网中,你也可以在另一台设备上浏览 URL: <host-ip-address>:8080
基准现在我们已经准备好了,是时候通过运行一些基准测试来测试GPU的性能了。我们可以使用[ollama-benchmark](https://github.com/aidatatools/ollama-benchmark)
Python包工具来完成这项任务。请注意,这需要一个可以运行的ollama安装环境,而我们已经安装好了。我们可以通过创建一个模型输入文件来运行多个模型的基准测试。
查看 deepseek_r1_models.yaml 文件的内容
file_name: “deepseek_r1_models.yaml”
version: 1.0
models:
- model: “deepseek-r1:8b”
- model: “deepseek-r1:14b”
- model: “deepseek-r1:32b”
文件名表示文件的名称,版本号为 1.0。该文件包含多个模型,分别为 deepseek-r1:8b、deepseek-r1:14b 和 deepseek-r1:32b,这些数字代表了模型的大小或复杂度。
使用poetry这款包管理工具,可以通过启动性能测试来开始:
(注:原文中的“基准测试”在中文中更准确地翻译为“性能测试”或“基准测试结果”。此处根据上下文简化表达为“性能测试”。)
# 进入git仓库目录
poetry install
激活poetry环境
运行llm_benchmark 任务 --custombenchmark=deepseek_r1_models.yaml
这些模型首先会被下载,然后基准测试会依次运行这些模型。基准测试本身是一系列提示,并在最后返回平均每秒的token。
-------Linux----------
未检测到GPU。
总内存大小:31.24 GB
cpu_info: AMD Ryzen 9 5900X 12-Core Processor
gpu_info: Navi 31 [Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M]
os_version: elementary OS 7.1 Horus
ollama_version: 0.5.12
----------
运行自定义基准测试,文件路径为 deepseek_r1_models.yaml
禁用自定义基准测试中的 sendinfo
LLM 模型文件路径:deepseek_r1_models.yaml
检查并拉取以下 LLM 模型。
deepseek-r1:8b
deepseek-r1:14b
deepseek-r1:32b
----------
运行自定义模型。
model_name = deepseek-r1:8b
prompt = 请总结心理学中经典条件反射和操作条件反射之间的主要区别。
eval rate: 73.81 token/秒。
prompt = 将以下英文段落翻译成中文并进行扩展说明 -> 人工智能正在通过提高效率并增强新功能来改变各个行业。
eval rate: 74.27 token/秒。
prompt = 美国南北战争的主要原因是什么?
eval rate: 73.83 token/秒。
prompt = 光合作用如何促进碳循环?
eval rate: 74.27 token/秒。
prompt = 编写一个解决数独游戏问题的 Python 函数。
eval rate: 72.41 token/秒。
--------------------
平均 eval rate:73.718 token/秒
----------------------------------------
model_name = deepseek-r1:14b
prompt = 请总结心理学中经典条件反射和操作条件反射之间的主要区别。
eval rate: 43.12 token/秒。
prompt = 将以下英文段落翻译成中文并进行扩展说明 -> 人工智能正在通过提高效率并增强新功能来改变各个行业。
eval rate: 44.50 token/秒。
prompt = 美国南北战争的主要原因是什么?
eval rate: 43.86 token/秒。
prompt = 光合作用如何促进碳循环?
eval rate: 42.99 token/秒。
prompt = 编写一个解决数独游戏问题的 Python 函数。
eval rate: 40.75 token/秒。
--------------------
平均 eval rate:43.044 token/秒
----------------------------------------
model_name = deepseek-r1:32b
prompt = 请总结心理学中经典条件反射和操作条件反射之间的主要区别。
eval rate: 9.95 token/秒。
prompt = 将以下英文段落翻译成中文并进行扩展说明 -> 人工智能正在通过提高效率并增强新功能来改变各个行业。
eval rate: 9.91 token/秒。
prompt = 美国南北战争的主要原因是什么?
eval rate: 9.91 token/秒。
prompt = 光合作用如何促进碳循环?
eval rate: 9.92 token/秒。
prompt = 编写一个解决数独游戏问题的 Python 函数。
eval rate: 9.39 token/秒。
--------------------
平均 eval rate:9.816 token/秒
----------------------------------------
正如预期的那样,随着模型规模的增大,性能会下降。并不一定非要使用参数最多的模型。最终,这是一个性能与结果准确性的平衡问题。其他不同量化级别的模型的基准测试可以请参见此 GitHub Gist,了解更多信息。如果想了解NVIDIA硬件上的性能表现,可以查看 Linux 系统下的测试结果 这里。
RTX 5090 在 deepseek-r1:14b 的测试中以每秒约 122 个 token 的出色表现领跑榜单。这远高于我们 700 欧元的 AMD 显卡每秒 43 个 token 的表现。然而,请注意,5090 是一张更昂贵的高端显卡(价格浮动较大,有超过 2200 欧元的售价),并且存在可能引起火灾的风险,例如有报道指出,某用户因显卡连接器熔化导致电源损坏。我个人认为,每秒 30 个 token 以上的性能已经非常实用。考虑到我们 AMD 显卡在价格、安全性和可得性方面的优势,这无疑是一个极大的优势。
用户体验这里就是开放WebUI界面的感觉和外观。我使用的是非常出色的_qwen2.5-coder:14b_模型作为数据科学小助手。响应吞吐量约为每秒38个token。
我们当地的LLM模型实际操作展示(由作者提供的GIF图)
更多设置- 当模型不可用时,可以轻松查找和下载
下载新的模型(由作者创建的GIF图)
- 可以通过点击右上角的Chat Controls设置来提供自定义系统提示内容
示例系统指令
- 若要更改卸载到GPU的层数,请检查页面底部的
num_gpu
参数。
额外的性能选项(注:作者图片)
- 当
num_gpu
设置为 0 时,推理将在 CPU 上进行。虽然这在能耗方面可能更高效,但是性能会较差(deepseek_coder_v2 的处理速度为每秒 12 个 token),相比 GPU(每秒处理 60 个 token),性能要好得多。
CPU 在推理时承受重负荷(图源:作者)
结尾在 AMD 硬件上设置大规模语言模型的推理并不总是像使用 CUDA 时那样即插即用,至少目前还不能像使用 CUDA 那样即插即用。但是,有了正确的工具,一些耐心和毅力,绝对可以把你的游戏机变成一台强大的 AI 设备。最好的部分是,你以开源的方式做这件事,有助于丰富 AI 硬件生态系统。
未来不仅仅是绿色与红色之争——它关乎赋予更多人创造的力量。在一个由人工智能塑造一切的世界里,能够本地运行自己的模型是一种新的自由。有了经济实惠的中端显卡,这种自由现在也变得触手可及,即使是普通老百姓也能享受到。
希望这份指南对你有帮助。感谢你的宝贵时间!你可以通过LinkedIn联系我,或者访问我的Web 3.0网站。
参考文献1.\nhttps://rocm.docs.amd.com/en/latest/
2.\nhttps://github.com/ollama/ollama
3.\nhttps://docs.openwebui.com/