这是一篇关于如何在顶级 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:大幅降低长文本推理时的显存压力。
六、 总结与性能观测
- 内存表现:通过
free -h观察,used内存会迅速攀升至 100GB+。由于通过内核参数解锁了 TTM 限制,系统不会触发 OOM Killer。 - GPU 负载:通过
amdgpu_top可以看到,尽管 BIOS 预留仅 1GB,但 GTT 区域会承载近 100GB 的数据,且 GFX 负载在推理时会满载。 - 结论:AMD Ryzen AI Max+ 395 配合正确的内核参数,完全有能力作为一台“百 GB 显存”的个人 AI 工作站使用。
技术笔记:对于分卷模型(如本例中的 00001-of-00002),llama.cpp 会自动识别并加载同一目录下的所有分卷,只需指定第一个文件的路径即可。