Hunter的大杂烩 技术学习笔记

2026-03-09

在 GMKTEC EVO-X2 (Ryzen AI Max+ 395) 上搭建本地大语言模型环境完整指南

Filed under: 技术话题 — hunter @ 10:04 pm

本文详细介绍了如何在 GMKTEC EVO-X2 迷你主机(搭载 AMD Ryzen AI Max+ 395 APU)上配置完整的本地大语言模型运行环境。该 APU 拥有 128GB 统一内存和集成的 Radeon 8060S GPU,能够运行高达 70B 参数的大模型,算力超100 TOPS,性能媲美NVIDIA RTX 4070 Laptop。

硬件规格概览

  • CPU: AMD Ryzen AI Max+ 395 (Strix Halo 架构)
  • GPU: 集成 Radeon 8060S (gfx1151,40 个计算单元)
  • 内存: 128GB DDR5 统一内存
  • 存储: 支持 NVMe SSD
  • 特性: 支持 ROCm rocWMMA 和 hipBLASlt,用于加速矩阵运算

第 1 阶段:BIOS 配置

在安装操作系统之前,需要先在 BIOS 中进行以下配置:

  1. 配置 GPU 内存
  • 进入 Integrated GraphicsUMA Frame Buffer Size
  • 设置为 1024MB(仅显示帧缓冲,实际计算内存通过 GTT 配置)
  1. 禁用 IOMMU
  • 找到 IOMMU 设置并禁用
  • 可提供约 6% 的内存读取性能提升
  • 只有在需要 VFIO/GPU 直通时才重新启用
  1. 设置电源模式
  • 配置为 85W(性能与功耗的最佳平衡点)

第 2 阶段:Ubuntu 24.04 安装

  1. 下载 Ubuntu 24.04 LTS 桌面版或服务器版
  2. 使用自定义分区
    • 给/data分区250G以上,存放各种大模型
    • /var 分区独立给200G,以免日志爆掉服务器
  3. 完成初始设置(用户账户、时区等)
  4. 系统更新:
   sudo apt update && sudo apt upgrade -y

第 3 阶段:内核与系统优化

3.1 安装最新内核(6.16.9+)

# 安装主线内核工具
sudo add-apt-repository ppa:cappelikan/ppa -y
sudo apt update
sudo apt install mainline -y

# 安装内核 6.18.14 或更高版本
# 使用 Linux 内核 6.8 或更高版本,获取 AMDXDNA 驱动支持。
sudo mainline --install 6.18.14

# 安装最新固件
sudo apt install linux-firmware -y

3.2 配置 GRUB 引导参数

编辑 /etc/default/grub

sudo nano /etc/default/grub

修改 GRUB_CMDLINE_LINUX_DEFAULT 行为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=off amdgpu.gttsize=127440 ttm.pages_limit=31457280"

参数说明:

  • amd_iommu=off:禁用 IOMMU 降低延迟
  • amdgpu.gttsize=127440:设置 GTT 为 ~128GB(基于你的 RAM 调整)
  • ttm.pages_limit=31457280:TTM 页面限制

应用更改:

sudo update-grub
sudo update-initramfs -u -k all

3.3 创建 AMD GPU 模块配置

创建 /etc/modprobe.d/amdgpu_llm_optimized.conf

sudo nano /etc/modprobe.d/amdgpu_llm_optimized.conf

添加内容:

# Legacy compatibility setting
options amdgpu gttsize=122800

# Primary GTT configuration - 120 GiB allocation
options ttm pages_limit=31457280

# Pre-allocate memory pool to reduce fragmentation
options ttm page_pool_size=31457280

更新 initramfs:

sudo update-initramfs -u -k all

3.4 重启并验证

sudo reboot

# 验证内核版本
uname -r  # 应显示 6.16.9 或更高

第 4 阶段:GPU 访问权限配置

4.1 创建 udev 规则

创建 /etc/udev/rules.d/99-amd-kfd.rules

sudo bash -c 'cat > /etc/udev/rules.d/99-amd-kfd.r EOF
SUBSYSTEM=="kfd", GROUP="render", MODE="0666", OPTIONS+="last_rule"
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", GROUP="render", MODE="0666", OPTIONS+="last_rule"
SUBSYSTEM=="drm", KERNEL=="renderD[0-9]*", GROUP="render", MODE="0666", OPTIONS+="last_rule"
EOF'

重要renderD[0-9]* 规则对 ROCm 访问至关重要。没有它,运行 rocminfo 时会报 HSA_STATUS_ERROR_OUT_OF_RESOURCES 错误。

重新加载 udev 规则:

sudo udevadm control --reload-rules
sudo udevadm trigger

4.2 添加用户到 GPU 组

sudo usermod -aG video,render $USER

注销并重新登录使组更改生效。

4.3 安装和配置 tuned 守护进程

sudo apt install tuned -y
sudo systemctl enable --now tuned
sudo tuned-adm profile accelerator-performance

# 验证激活
tuned-adm active  # 应显示 "accelerator-performance"

这可以提升 5-8% 的提示处理性能。

第 5 阶段:AMD ROCm 安装

5.1 使用 amdgpu-install 脚本安装

# 更新系统
sudo apt update

# 下载安装脚本 (Ubuntu 24.04)
wget https://repo.radeon.com/amdgpu-install/7.2/ubuntu/noble/amdgpu-install_7.2.70200-1_all.deb
sudo apt install ./amdgpu-install_7.2.70200-1_all.deb

# 安装 ROCm(不使用 DKMS)
sudo amdgpu-install -y --usecase=rocm --no-dkms

5.2 配置共享内存

AMD 的 Strix Halo APU 使用统一内存架构:

# 查看当前 TTM 设置
sudo apt install pipx
pipx ensurepath
pipx install amd-debug-tools
amd-ttm

# 设置共享内存为 120GB
amd-ttm --set 120
sudo reboot

重要概念:对于 APU,重要的是 GTT(图形转换表)而不是 VRAM。VRAM(约 1GB)仅用于显示帧缓冲,GTT(约 115-120GB)用于 LLM 推理计算。

第 6 阶段:容器化环境(Podman + Distrobox)

Ubuntu 24.04 不包含 toolbox,我们使用 Distrobox 替代。

6.1 安装 Podman 和 Distrobox

# 安装 Podman
sudo apt install podman -y

# 安装 Distrobox
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh

# 确保用户可以运行容器
sudo loginctl enable-linger $USER

# 验证安装
podman --version    # 应显示 4.9.3 或更高
distrobox --version # 应显示 1.8.2.0 或更高

6.2 创建 ROCm 7 RC 容器(带 rocWMMA)

sudo mkdir /data/models; sudo chown <user> /data/models
sudo mkdir /var/llama; sudo chown <user> /var/llama

a. 创建第三方容器,用下面指令:
distrobox create llama-rocm-7rc-rocwmma \
 --image docker.io/kyuz0/amd-strix-halo-toolboxes:rocm-7rc-rocwmma \
 --additional-flags "--device /dev/dri --device /dev/kfd --group-add video \ 
 --group-add render --security-opt seccomp=unconfined \
 -v /data:/data -v /var/llama:/var/llama"
这个容器使用Fedora Linux + python 3.14

用AMD (https://hub.docker.com/r/rocm/llama.cpp/tags)官方封装的容器,会省事不少,而且感觉稳定点:
distrobox create --name llama-rocm-amd7  \
  --image docker.io/rocm/llama.cpp:llama.cpp-b6652.amd0_rocm7.0.0_ubuntu24.04_server \
  --additional-flags "--device /dev/dri --device /dev/kfd --group-add video --group-add render --security-opt seccomp=unconfined -v /data:/data -v /var/llama:/var/llama "
这个容器使用ubuntu Linux + python 3.12

6.3 进入容器

distrobox enter llama-rocm-7rc-rocwmma

# 验证 ROCm 工具可用
rocm-smi    # 应显示你的 GPU
rocminfo | head  # 应显示 HSA 系统信息

第 7 阶段:PyTorch 安装

7.1 在容器内安装 PyTorch(推荐)

kyuz0 容器已预装 PyTorch,但如果你想安装最新版本:

# 在容器内(Fedora 基础)
sudo dnf install python3-pip -y
pip3 install --upgrade pip wheel

# 安装 PyTorch for ROCm (Python 3.12)
pip3 install "numpy==1.26.4"  # numpy v2.0 与当前版本不兼容
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchaudio-2.9.0%2Brocm7.2.0.gite3c6ee2b-cp312-cp312-linux_x86_64.whl
pip3 uninstall torch torchvision triton torchaudio
pip3 install torch-2.9.1+rocm7.2.0.lw.git7e1940d4-cp312-cp312-linux_x86_64.whl torchvision-0.24.0+rocm7.2.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl torchaudio-2.9.0+rocm7.2.0.gite3c6ee2b-cp312-cp312-linux_x86_64.whl triton-3.5.1+rocm7.2.0.gita272dfa8-cp312-cp312-linux_x86_64.whl

7.2 验证 PyTorch 安装

python3 -c 'import torch; print(f"PyTorch version: {torch.__version__}")'
python3 -c 'import torch; print(f"GPU available: {torch.cuda.is_available()}")'
python3 -c 'import torch; print(f"Device name: {torch.cuda.get_device_name(0)}")'

第 8 阶段:llama.cpp 编译和配置

8.1 安装构建依赖

# 在 ROCm 容器内(基于 Fedora)
sudo dnf install -y cmake gcc-c++ git libcurl-devel python3-pip

8.2 克隆和编译 llama.cpp

cd ~
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

# 使用 rocWMMA 支持构建
cmake -B build -S . \
 -DGGML_HIP=ON \
 -DAMDGPU_TARGETS="gfx1151" \
 -DGGML_HIP_ROCWMMA_FATTN=ON

cmake --build build --config Release -j$(nproc)
# 验证构建ls -lh build/bin/

BTW: 编译过程可能会遇到 llvm/amdgcn/bitcode/ocml.bc 的LLVM版本不一致问题,可以到 https://repo.amd.com/rocm/tarball/ 下载一个老版本的 SDK,therock-dist-linux-gfx1151-7.9.0rc1.tar.gz 好像用的跟clang一样的LLVM 20

编译前把环境变量改一下:
export ROCM_PATH=<sdk解压后路径>
export PATH=$ROCM_PATH/bin:$PATH
export HIP_DEVICE_LIB_PATH=$ROCM_PATH/llvm/amdgcn/bitcode
export HIP_PATH=$ROCM_PATH
export HIPCXX=$ROCM_PATH/llvm/bin/clang++
export CMAKE_PREFIX_PATH=$ROCM_PATH:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$ROCM_PATH/lib:$LD_LIBRARY_PATH   # 运行时也加这个

cmake -B build -S . \
  -DGGML_HIP=ON \
  -DAMDGPU_TARGETS=gfx1151 \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_PREFIX_PATH=$ROCM_PATH \
  -DCMAKE_HIP_COMPILER=$HIPCXX \
  -DGGML_HIP_ROCWMMA_FATTN=OFF   # 如果之前有 matmul bug,先关掉

第 9 阶段:模型下载和测试

9.1 设置模型目录

# 在容器外部(主目录,持久化存储)
cd /data/models

9.2 下载测试模型

# 在容器内
pip install "huggingface-hub[cli]" hf-transfer

# 启用快速下载
export HF_HUB_ENABLE_HF_TRANSFER=1

# 下载 Llama 2 7B 模型(测试用)
hf download TheBloke/Llama-2-7B-GGUF llama-2-7b.Q4_K_M.gguf --local-dir ~/models

BTW: 测试了一圈,基本13B以下的模型能稳定回答问题,以上的基本回答一个复杂点的问题就coredump,也不知道原因,以下是我测试过能稳定回答2-3个复杂问题的模型:
   cerebras_Qwen3-Coder-REAP-25B-A3B-Q5_K_M.gguf
   qwen3-asr-1.7b-q8_0.gguf
   Qwen3-4B-Thinking-2507-GLM-4.7-Distilled.Q8_0.gguf
   glm-47-distilled-gemma3-12B-QVO.q8.gguf
   L3.2-8X3B-MOE-Dark-Champion-Inst-18.4B-uncen-ablit_D_AU-Q6_k.gguf
   Llama3.3-8B-Instruct-Thinking-Claude-4.5-Opus-High-Reasoning-q8_0.gguf

9.3 运行推理测试

cd ~/llama.cpp

# 关键:在 Strix Halo 的 GPU 后端上始终使用 --no-mmap
./build/bin/llama-cli \
 -m ~/models/llama-2-7b.Q4_K_M.gguf \
 --no-mmap \
 -ngl 99 \
 -p "Tell me about AMD Strix Halo processors" \
 -n 128

9.4 运行基准测试

cd ~/llama.cpp

# llama-bench 使用 -mmp 0 而不是 --no-mmap
./build/bin/llama-bench \
 -m ~/models/llama-2-7b.Q4_K_M.gguf \
 -mmp 0 \
 -ngl 99 \
 -p 512 \
 -n 128

9.5 监控 GPU 利用率

# 在另一个终端内,进入容器
watch -n 1 rocm-smi

第 10 阶段:性能优化和故障排除

10.1 统一内存理解

对于 Ryzen AI Max APU:

┌─────────────────────────────────────────┐
│         128GB System RAM                │
├─────────────────────────────────────────┤
│ CPU Available │ GTT (GPU Compute)       │
│ ~8-13 GB      │ ~115-120 GB             │
└─────────────────────────────────────────┘
  • VRAM(约 1GB):仅显示帧缓冲
  • GTT(约 115-120GB):用于 LLM 推理
  • 内存是动态共享的 – 未使用的 GTT 可用于 CPU

10.2 关键性能标志

  1. 始终使用 --no-mmap:Strix Halo GPU 后端必需
  2. 始终使用 -ngl 99(或 999):将所有层卸载到 GPU
  3. 将模型存储在 /data/models(容器外部):跨更新持久化

10.3 常见问题解决

问题原因解决方案
HSA_STATUS_ERROR_OUT_OF_RESOURCES缺少 renderD udev 规则确保 /etc/udev/rules.d/99-amd-kfd.rules 包含 renderD[0-9]* 规则
容器无法访问 GPU设备权限问题ls -la /dev/kfd /dev/dri/ 所有设备应为 crw-rw-rw- (0666)
只有 15.5GB VRAM 可见内核太旧升级到内核 6.16.9+
cmake: command not found缺少构建工具sudo dnf install -y cmake gcc-c++ git libcurl-devel
hf: command not foundHuggingFace CLI 路径使用 ~/.pyenv/versions/3.14.0/bin/hf 或重新安装
(Producer: ‘LLVM22.0.0git’ Reader: ‘LLVM 20.0.0git’)AMD SDK 编译的版本跟当前编译器版本不一致 用SDK里面的编译器(clang++),或者降级 SDK

11.4 性能基准

  • Llama-2-7B: ~50-52 tokens/秒(类似 Apple M4 Max)
  • Qwen_Qwen3.5 27B 模型 (Q4): ~10-20 tokens/秒(完全适合内存)
  • 内存带宽: ~212 GB/s 内部,~84 GB/s CPU-to-GPU
  • Deepseek 系列无法稳定运行,不知道咋回事

第 11 阶段:快速状态检查脚本

保存以下脚本以快速检查系统状态:

#!/bin/bash
echo "=== LLM Server Quick Status ==="
echo "Kernel: $(uname -r)"
echo "ROCm: $(cat /opt/rocm/.info/version 2>/dev/null || echo 'Not found')"
echo "GTT: $(echo "scale=1; $(cat /sys/class/drm/card*/device/mem_info_gtt_total 2>/dev/null | head -1) / 1024^3" | bc) GB"
echo "GPU: $(rocminfo 2>/dev/null | grep "Marketing Name:" | grep -v CPU | head -1 | cut -d: -f2 | xargs)"
echo "Containers: $(distrobox list 2>/dev/null | tail -n +2 | wc -l)"

结论

GMKTEC EVO-X2 搭载 Ryzen AI Max+ 395 APU,为本地大语言模型推理提供了强大的平台。通过本指南,你可以:

  1. 正确配置 BIOS 和内核以获得最大内存访问
  2. 安装和优化 AMD ROCm 驱动程序
  3. 使用容器化环境确保可重复性和易更新性
  4. 编译和运行 llama.cpp 进行高效推理
  5. 运行高达 70B 参数的模型,性能媲美高端独立 GPU

关键优势:

  • 128GB 统一内存:无需多 GPU 配置即可运行大模型
  • ROCm rocWMMA 支持:矩阵运算加速
  • 容器化部署:易于管理和更新
  • 开源软件栈:完全透明和可定制
  • 服务器硬件:兼容性不错,ubuntu 安装过程无坑,后续加上AMD驱动也不复杂

随着 ROCm 对 gfx1151 支持的持续成熟,该平台将成为本地 AI 推理的强有力竞争者。

参考资源

  1. kyuz0/amd-strix-halo-toolboxes – 预构建容器镜像
  2. pablo-ross/strix-halo-gmktec-evo-x2 – Ubuntu 优化设置
  3. Gygeek/Framework-strix-halo-llm-setup – 完整 LLM 部署指南
  4. AMD ROCm 文档 – 官方 ROCm 文档
  5. llama.cpp GitHub – llama.cpp 项目

注意:由于硬件和软件快速迭代,建议定期检查上述 GitHub 仓库和 AMD 文档以获取最新更新。

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress