手记

AMD显卡上运行大型语言模型,手把手教你搭建本地AI环境

游戏显卡不仅能处理图形,还能做更多事情

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 的系统也适用。其余部分,请自行查找相应的终端命令。

  1. 安装GPU驱动,

这是插入新GPU后的第一步操作。除了图形驱动程序之外,我们还需要安装一下Radeon开放计算平台(ROCm),这是Ollama在GPU上运行推理任务时要用到的平台。Nvidia的对应平台是众所周知的CUDA平台。

  • 首先,点击这个链接以了解哪些版本的ROCm与特定的GPU和Linux内核兼容。然后检查您的Linux内核版本。
    $ uname -r  
    6.8.0-40-generic

我输入了 uname -r (显示内核版本的命令) 来查看我的内核版本。

  • 对于我的内核版本,如这里所示,ROCm版本6.2.x最适合我的内核版本。我尝试了几个版本,发现6.2.1最为合适。
  • 这里等途径安装amdgpu-install工具,例如:
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/

0人推荐
随时随地看视频
慕课网APP