这是一篇关于如何在顶级 AMD APU(如 Ryzen AI Max+ 395 / Strix Halo)上,利用 Ubuntu 24.04 环境,通过 Vulkan 后端驱动超大模型的技术实战文章。

前言

AMD Ryzen AI Max+ 395 (Strix Halo) 是目前移动端算力的天花板,拥有 40 个 RDNA 3.5 计算单元 (CU) 和最高 128GB 的统一内存架构 (UMA)。然而,要在 Linux 环境下完整释放这 128GB 内存来运行近百 GB 的 AI 模型,会遇到内核内存分配限制、驱动兼容性等重重挑战。

本文将记录从内核调优、Vulkan 环境搭建到 llama.cpp 编译及最终运行 80k 上下文超大模型的全过程。


一、 系统环境

  • 硬件:AMD Ryzen AI Max+ 395 (Strix Halo), 128GB RAM
  • 系统:Ubuntu 24.04 LTS
  • 内核:Linux 6.14-generic (极新内核)
  • 显存分配:BIOS 预留 1GB VRAM (UMA),其余通过 GTT 动态调用

二、 核心步骤:突破内核显存限制

在 Linux 中,驱动默认只允许 GPU 调用系统内存(GTT)的 50%-75%。对于 128GB 内存要跑 98GB 模型的需求,必须通过内核参数强行解锁。

1. 修改 GRUB 配置
编辑 /etc/default/grub

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT 中加入以下“暴力”参数:

  • amd_iommu=off:禁用 IOMMU 地址转换,减少超大内存映射的开销,防止驱动死锁。
  • ttm.pages_limit=31457280:设置 TTM 管理页面上限(约为 120GB)。
  • amdgpu.gttsize=112640:手动指定 GTT 大小为 110GB。
  • zswap.enabled=1:开启 zswap 以压缩系统后台内存,为模型腾出空间。

完整示例:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=off ttm.pages_limit=31457280 ttm.page_pool_size=31457280 amdttm.pages_limit=31457280 amdttm.page_pool_size=31457280 apparmor=0 zswap.enabled=1 zswap.compressor=zstd zswap.zpool=zsmalloc zswap.max_pool_percent=5"

2. 更新并重启

sudo update-grub
sudo reboot

三、 搭建 Vulkan 开发环境

为什么选择 Vulkan 而不是 ROCm?在极新内核(6.14)和极新架构(RDNA 3.5)下,Vulkan (RADV) 驱动比 ROCm 更稳定,且对共享内存的分配逻辑更宽松。

1. 安装基础依赖

sudo apt update
sudo add-apt-repository universe
sudo apt install libvulkan-dev vulkan-tools glslc libshaderc-dev build-essential cmake git

2. 验证 Vulkan 状态

vulkaninfo | grep deviceName
# 应该能看到 "AMD Radeon Graphics (RADV GFX1151)"

四、 编译 llama.cpp (Vulkan 优化版)

我们需要从源码编译 llama.cpp,并显式开启 Vulkan 支持。

1. 克隆与清理

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
rm -rf build && mkdir build && cd build

2. 配置 CMake

cmake .. -DGGML_VULKAN=ON

检查输出中是否包含 -- Found Vulkan: TRUE-- GGML_VULKAN: ON

3. 执行编译

cmake --build . --config Release -j$(nproc)

五、 运行 98GB 超大模型

对于 128GB 内存运行 98GB 模型,加载策略至关重要。

1. 释放系统缓存 (关键)
在启动模型前,必须手动清空 PageCache,否则模型加载会因为内存碎片和缓存占用而失败。

sudo sync && sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

2. 执行启动命令
进入 build/bin 目录,运行以下命令。针对 MiniMax-M2.1-Q3 模型:

./llama-server \
  -m /models/unsloth/MiniMax-M2.1-Q3_K_S-00001-of-00002.gguf \
  --host 0.0.0.0 \
  --port 8080 \
  --ctx-size 81920 \
  --n-gpu-layers -1 \
  --ubatch-size 2048 \
  --flash-attn on \
  --no-mmap \
  --temp 1.0 \
  --top-p 0.95 \
  --top-k 40

配置要点说明:

  • --n-gpu-layers -1:强制将所有模型层卸载到 GPU (Vulkan)。
  • --ctx-size 81920:利用大内存优势,开启 80k 超长上下文。
  • --no-mmap:禁用磁盘映射,强制将 98GB 权重全部载入物理内存,防止由于磁盘 I/O 导致的计算卡顿。
  • --flash-attn on:大幅降低长文本推理时的显存压力。

六、 总结与性能观测

  1. 内存表现:通过 free -h 观察,used 内存会迅速攀升至 100GB+。由于通过内核参数解锁了 TTM 限制,系统不会触发 OOM Killer。
  2. GPU 负载:通过 amdgpu_top 可以看到,尽管 BIOS 预留仅 1GB,但 GTT 区域会承载近 100GB 的数据,且 GFX 负载在推理时会满载。
  3. 结论:AMD Ryzen AI Max+ 395 配合正确的内核参数,完全有能力作为一台“百 GB 显存”的个人 AI 工作站使用。

技术笔记:对于分卷模型(如本例中的 00001-of-00002),llama.cpp 会自动识别并加载同一目录下的所有分卷,只需指定第一个文件的路径即可。