llama.cpp ZenDNN 后端如何在 AMD EPYC 上构建并启动 llama-server 推理服务
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
在 AMD EPYC 服务器上用 llama.cpp 跑推理时,默认走的是通用 CPU 后端。ZenDNN 后端可以让矩阵乘法(MUL_MAT、MUL_MAT_ID)走 AMD 针对 EPYC 优化的 LowOHA MatMul 算子,其余算子仍由标准 CPU 后端处理。这篇文档对应的任务路径是:在 Linux 上开启-DGGML_ZENDNN=ON构建 llama.cpp,下载一个 BF16 或 Q8_0 的 GGUF 模型,然后用llama-server起一个 8080 端口的推理服务,并从启动日志确认 ZenDNN 后端确实被初始化。
适用前提(来自 docs/backend/ZenDNN.md):
- 操作系统:Linux,已验证 Ubuntu 20.04 / 22.04 / 24.04。
- CPU:AMD EPYC 9005 系列(Turin,Zen 5)、9004 系列(Genoa,Zen 4)、7003 系列(Milan,Zen 3),或 AMD Ryzen AI MAX(Strix Halo)。BF16 算子仅在 Zen 4 / Zen 5 上可用,更老的 CPU 上相关运算会退回 FP32。
- 注意区分:ZenDNN 是 AMD 面向 EPYC 的库,与 IBM 的 zDNN 不是同一个东西。
构建开启 ZenDNN 后端的 llama.cpp
有两种方式。推荐第一种,不需要手动安装 ZenDNN:CMake 会自动下载并构建 ZenDNN。
# 自动下载并构建 ZenDNN(推荐) cmake -B build -DGGML_ZENDNN=ON -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release -j $(nproc)docs/build.md 中说明:首次构建会自动下载并构建 ZenDNN,大约需要 5–10 分钟,之后的构建会快很多。
可选分支:如果你想自己构建 ZenDNN 或固定某个版本,先按 ZenDNN 的说明从源码构建(需要 CMake >= 3.25),再通过ZENDNN_ROOT指向安装目录:
# 方式一:环境变量 export ZENDNN_ROOT=/path/to/ZenDNN/build/install # 替换为你实际的 ZenDNN 安装目录 cmake -B build -DGGML_ZENDNN=ON -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release -j $(nproc) # 方式二:直接在 CMake 参数里指定 cmake -B build -DGGML_ZENDNN=ON -DZENDNN_ROOT=/path/to/ZenDNN/build/install -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release -j $(nproc)上面的ZENDNN_ROOT指向 ZenDNN 自己构建后的安装目录,/path/to/ZenDNN/build/install是源文档给出的占位路径,需要替换成你的真实路径。CMake 侧的行为可以在 ggml/src/ggml-zendnn/CMakeLists.txt 中核对:未设置ZENDNN_ROOT时自动下载构建,设置了则使用该自定义安装。
下载 BF16 或 Q8_0 模型
ZenDNN 后端目前支持 FP32、BF16 和 Q8_0 三种数据类型;其他量化格式会退回标准 CPU 后端。文档给出的示例模型是 Llama-3.1-8B-Instruct 的 BF16 GGUF:
# 从 Hugging Face 下载 BF16 GGUF 模型 huggingface-cli download meta-llama/Llama-3.1-8B-Instruct-GGUF --local-dir models/也可以只下载 Q8_0 权重的单个文件:
huggingface-cli download meta-llama/Llama-3.1-8B-Instruct-GGUF \ Llama-3.1-8B-Instruct-Q8_0.gguf \ --local-dir models/关于精度选择,文档给出的事实是:BF16 在 Zen 4 / Zen 5 EPYC 上性能最好;Q8_0 的加速主要在 prefill / prompt 处理这类大矩阵乘法占主导的阶段体现,逐 token 生成速度可能与标准 CPU 后端接近,取决于模型、批大小、线程数和 CPU 拓扑。
启动 llama-server
在启动前设置文档推荐的算子环境变量,然后启动服务:
# Blocked AOCL DLP 算法,文档标注为推荐配置 export ZENDNNL_MATMUL_ALGO=1 ./build/bin/llama-server \ -m models/Llama-3.1-8B-Instruct.BF16.gguf \ --host 0.0.0.0 \ --port 8080 \ -t 64参数说明以文档为准:ZENDNNL_MATMUL_ALGO=1选用 Blocked AOCL DLP 算法,是文档明确推荐的性能配置;--host 0.0.0.0表示监听所有地址(tools/server/README.md中--host默认值为127.0.0.1,即不设置时只有本机可访问);-t 64是文档示例中的线程数,对应高核心数 EPYC 的示例场景,可按实际核数调整。
启动后访问http://localhost:8080即可使用服务端点。
多路(multi-socket)NUMA 机器上,文档给出的可选优化是手动绑定 NUMA 节点:
numactl --cpunodebind=0 --membind=0 ./build/bin/llama-server ...已知问题一节明确写了:多路系统上可能需要手动 NUMA 绑定才能达到最佳性能,上面的numactl命令是文档给出的绑定方式。
验证 ZenDNN 后端已生效
文档 Q&A 给出的验证方式:查看 llama.cpp 运行时的日志输出,应当能看到 ZenDNN 后端被初始化的提示信息,也可以直接检查输出中的 backend 名称。
docs/build.md 的 ZenDNN 小节还提供了一个最小推理测试命令,可以直接确认模型能跑通生成:
./build/bin/llama-cli -m PATH_TO_MODEL -p "Building a website can be done in 10 steps:" -n 50其中PATH_TO_MODEL替换为你的 GGUF 文件路径,-n 50表示生成 50 个 token。
限制与边界
- 加速范围:目前只有 MUL_MAT 和 MUL_MAT_ID 两个算子走 ZenDNN,attention、激活等其他算子仍由标准 CPU 后端处理。文档 TODO 中列了扩展算子支持,但尚未落地。
- 量化格式:除 FP32、BF16、Q8_0 外的量化格式会回落到标准 CPU 后端。
- BF16 依赖 Zen 4 / Zen 5;Milan(Zen 3)上没有 BF16 加速。
- 性能预期:文档 Q&A 给出的说法是,矩阵乘法部分相对标准 CPU 推理大致是 1.1x–2x 的提速,具体取决于模型大小、批大小和 CPU 架构;文档同时说明,小模型、批大小或线程数不合适时未必能体现出加速,并建议开启 ZenDNN 自身的 profiling 确认 LowOHA MatMul 确实被调用(profiling 选项属于 ZenDNN 库的文档范畴,本仓库文档未展开)。
如果启动后日志里看不到 ZenDNN 后端初始化信息,先回到构建环节确认:-DGGML_ZENDNN=ON是否加上、使用的是否为build/bin/llama-server这个新构建产物。更细的硬件支持、算子列表和环境变量说明见 docs/backend/ZenDNN.md。
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考