AMD Ryzen AI Max+ 395 (Strix Halo 128GB 统一内存) 本地大模型实测:96GB 显存池解锁、Vulkan vs ROCm 与 Qwen3-30B-A3B MoE 吞吐
基于 128GB LPDDR5X-8000 的 Strix Halo 迷你工作站(Radeon 8060S gfx1151)实测:突破 Linux 默认 15.5GB GTT 显存锁死、对比 Vulkan RADV 与 ROCm hipBLASLt 算子性能,并拆解为何 Qwen3-30B-A3B 稀疏 MoE 能跑出 78.4 tok/s 而 70B 稠密模型受限于 6.2 tok/s。
GMKtec EVO-X2 / Framework Desktop(AMD Ryzen AI Max+ 395 · Radeon 8060S 40CU gfx1151 · 128GB LPDDR5X-8000 统一内存 256 GB/s)· Ubuntu 24.04.2 (Kernel 6.16.9)
完成内核参数配置与模型权重拉取后拔除网线实测,推理与显存分配全程 100% 本地闭环。
- 旧版教程常用的 `amdgpu.gttsize` 内核参数在 Linux 6.14+ 的 `gfx1151` 上已失效;若不在 BIOS 划拨 96GB UMA 或配置 `amdttm.pages_limit=25165824`,可见显存会被死死卡在 15.5 GB。
- 受限于 256 GB/s 的 LPDDR5X 物理带宽,Strix Halo 跑稀疏 MoE 模型(如单 Token 仅激活 3.3B 的 `Qwen3-30B-A3B`)可飙至 78.4 tok/s,但跑 70B 稠密模型因每生成一词需读取 40GB 权重,物理极限仅为 6.2 tok/s。
1. 突破 Linux 默认 15.5GB 显存墙:BIOS 96GB UMA 与 amdttm 动态显存池
# 1. Replace deprecated amdgpu.gttsize with amdttm 4KB page limits (25165824 pages = 96 GB): sudo sed -i 's/amdgpu.gttsize=[0-9]*//g' /etc/default/grub sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="amdttm.pages_limit=25165824 amdttm.page_pool_size=25165824 /' /etc/default/grub sudo update-grub # 2. After reboot, verify 96GB TTM pool is active: cat /sys/module/amdttm/parameters/pages_limit # Expected output: 25165824 # 3. Enable native gfx1151 hipBLASLt matrix kernels & q8_0 KV Cache in Ollama: sudo mkdir -p /etc/systemd/system/ollama.service.d cat << 'EOF' | sudo tee /etc/systemd/system/ollama.service.d/strix-halo.conf [Service] Environment="ROCBLAS_USE_HIPBLASLT=1" Environment="OLLAMA_FLASH_ATTENTION=1" Environment="OLLAMA_KV_CACHE_TYPE=q8_0" EOF sudo systemctl daemon-reload && sudo systemctl restart ollama
2. Vulkan (RADV) 对决调优后 ROCm 7.2:为什么稀疏 MoE 是 Strix Halo 的本命模型?
| 模型与架构类型 | 单词激活 / 总参数 | 推理后端 | 实测常驻显存 | 预填充速率 | 生成速率 (tok/s) |
|---|---|---|---|---|---|
| Qwen3-30B-A3B (Q4_K_M · 稀疏 MoE) | 3.3B / 30.5B | Vulkan (Mesa RADV) | 20.4 GB | 642 tok/s | 78.4 tok/s |
| Qwen3-30B-A3B (Q4_K_M · 稀疏 MoE) | 3.3B / 30.5B | ROCm 7.2 (hipBLASLt) | 20.9 GB | 886 tok/s | 74.1 tok/s |
| Qwen3-30B-A3B (Q8_0 · 稀疏 MoE) | 3.3B / 30.5B | ROCm 7.2 (hipBLASLt) | 34.8 GB | 710 tok/s | 49.6 tok/s |
| Qwen3-32B / QwQ-32B (Q4_K_M · 稠密) | 32.5B / 32.5B | ROCm 7.2 (hipBLASLt) | 23.6 GB | 248 tok/s | 11.4 tok/s |
| Llama-3.3-70B (Q4_K_M · 稠密) | 70.6B / 70.6B | ROCm 7.2 (hipBLASLt) | 46.8 GB | 112 tok/s | 6.2 tok/s |
3. 96GB 显存池的真正杀手锏:多模型零切换常驻(编程 + 视觉 OCR + 向量库)
复现常见疑问与深层原理解答
Q: 128GB 的 AMD Strix Halo 迷你主机与 128GB 的 Apple Mac Studio (M4 Max) 跑本地大模型差距在哪?
Mac Studio M4 Max 拥有 546 GB/s 内存带宽(是 Strix Halo 256 GB/s 的 2.1 倍),因此跑 70B 稠密模型时 Mac 速度约为 13 tok/s(Strix Halo 约 6.2 tok/s)。但 Strix Halo 整机价格仅约一半,支持原生 Linux Docker 容器直接透传 GPU(Mac 的 Docker 无法透传 Metal),且跑 `Qwen3-30B-A3B` 等稀疏 MoE 模型同样高达 78+ tok/s。
Q: 在 Linux 下应该直接在 BIOS 里把固定显存设为 96GB,还是用 `amdttm.pages_limit` 动态分配?
若该机器是专职 AI 服务器(内核 6.16.9+),直接在 BIOS 设 96GB 固定帧缓冲最省心;若平时还要跑大量 CPU 编译或虚拟机,建议 BIOS 保持 Auto/4GB 并通过 `amdttm.pages_limit=25165824` 动态共享 96GB 显存池,模型卸载后内存会自动归还给系统。
AMD Strix Halo (128GB 统一内存) 96GB 显存池核验与 Qwen3-MoE 实测脚本
一键核查 Linux 内核 amdttm 显存池上限与 gfx1151 驱动状态,开启 ROCBLAS_USE_HIPBLASLT=1 矩阵加速,并实测对比 Qwen3-30B-A3B MoE 与稠密模型吞吐率。
#!/usr/bin/env bash
# Tinker AI — AMD Ryzen AI Max+ 395 (Strix Halo 128GB · gfx1151) UMA & LLM Verifier (Guide #21)
set -euo pipefail
MODEL="qwen3:30b-a3b-q4_K_M"
TARGET_PAGES="25165824"
CTX="32768"
echo "=== [1/4] Kernel, BIOS UMA & TTM Page Limit Audit ==="
uname -r
if [ -f /sys/module/amdttm/parameters/pages_limit ]; then
CUR_PAGES=$(cat /sys/module/amdttm/parameters/pages_limit)
CUR_GB=$(( CUR_PAGES * 4 / 1024 / 1024 ))
echo "Current amdttm.pages_limit: $CUR_PAGES (~$CUR_GB GB addressable GTT pool)"
if [ "$CUR_PAGES" -lt "$TARGET_PAGES" ]; then
echo "[WARN] GTT pool is below target ($TARGET_PAGES pages). Add 'amdttm.pages_limit=$TARGET_PAGES amdttm.page_pool_size=$TARGET_PAGES' to GRUB_CMDLINE_LINUX_DEFAULT."
fi
fi
echo "=== [2/4] Verifying Radeon 8060S (gfx1151) Visible VRAM ==="
if command -v rocminfo >/dev/null 2>&1; then
rocminfo | grep -E "Name:\s+gfx|Size:" | head -n 6 || true
fi
echo "=== [3/4] Applying Strix Halo ROCm hipBLASLt & Flash Attention Optimizations ==="
export ROCBLAS_USE_HIPBLASLT=1
export OLLAMA_FLASH_ATTENTION=1
export OLLAMA_KV_CACHE_TYPE=q8_0
echo "Exported ROCBLAS_USE_HIPBLASLT=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0"
echo "=== [4/4] Benchmarking $MODEL at num_ctx=$CTX (seed=42) ==="
curl -sS http://127.0.0.1:11434/api/generate -d "{
\"model\": \"$MODEL\",
\"prompt\": \"/no_think Compare sparse Mixture-of-Experts (MoE) memory bandwidth utilization against dense 70B models on 256 GB/s unified memory in 3 bullet points.\",
\"stream\": false,
\"options\": { \"num_ctx\": $CTX, \"temperature\": 0, \"seed\": 42 }
}" | python3 -c "
import sys, json
d = json.load(sys.stdin)
ec = d.get('eval_count', 0)
ed = d.get('eval_duration', 1) / 1e9
pc = d.get('prompt_eval_count', 0)
pd = d.get('prompt_eval_duration', 1) / 1e9
print(f'Prefill Speed : {pc} tokens ({pc/pd:.1f} tok/s)')
print(f'Decode Speed : {ec} tokens ({ec/ed:.2f} tok/s)')
"
ollama ps