继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

幕布斯6054654
关注TA
已关注
手记 1303
粉丝 219
获赞 1012
游戏显卡不仅能处理图形,还能做更多事情

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/

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP