在阿里 PPU 环境中编译使用 llama.cpp

环境介绍

本文基于以下环境编写:

  • Ubuntu 24.04
  • PPU SDK v2.0.0
  • CUDA 兼容 SDK 12.9

编译过程

首先将 llama.cpp 代码仓库克隆到你喜欢的目录,例如我这里是 ~/work/llama.cpp/src

git clone https://github.com/ggml-org/llama.cpp.git -b v0.4.0 --depth 1 ~/work/llama.cpp/src

保存 patch 文件 ~/work/llama.cpp/ppu.patch

diff --git a/ggml/src/ggml-cuda/topk-moe.cu b/ggml/src/ggml-cuda/topk-moe.cu
index 5af6cc2..4341f34 100644
--- a/ggml/src/ggml-cuda/topk-moe.cu
+++ b/ggml/src/ggml-cuda/topk-moe.cu
@@ -5,6 +5,10 @@
 #include 
<cmath>
 #include 
<initializer_list>

+#if defined(USE_HGGC)
+#define __isnanf(x) isnan(x)
+#endif
+
 // Kernel config struct - passed by value to CUDA kernel
 struct topk_moe_config {
     bool use_sigmoid;

创建目录 /opt/llama.cpp

mkdir -p /opt/llama.cpp

保存编译脚本 ~/work/llama.cpp/build.sh

#!/usr/bin/env bash

ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
cd $ROOT_DIR/src

git apply ../ppu.patch

CUDA_ROOT="${CUDA_HOME:-/usr/local/PPU_SDK/CUDA_SDK}"
NVCC="${CUDA_ROOT}/bin/nvcc"

CUDA_ARCH="$(
    "${NVCC}" --list-gpu-arch |
    while IFS= read -r arch; do
        case "${arch}" in
            compute_[0-9]*) printf '%s\n' "${arch#compute_}" ;;
        esac
    done |
    sort -V |
    tail -n 1
)"

echo "CUDA architecture: ${CUDA_ARCH}"

cmake -S . -B build-ppu -G Ninja \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX="/opt/llama.cpp" \
    -DCMAKE_CUDA_COMPILER="${NVCC}" \
    -DCUDAToolkit_ROOT="${CUDA_ROOT}" \
    -DCMAKE_CUDA_ARCHITECTURES="${CUDA_ARCH}" \
    -DCMAKE_INSTALL_RPATH="\$ORIGIN/../lib;\$ORIGIN;${CUDA_ROOT}/lib64;/usr/local/PPU_SDK/lib" \
    -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
    -DGGML_CUDA=ON \
    -DLLAMA_BUILD_TESTS=OFF \
    -DLLAMA_BUILD_EXAMPLES=OFF \
    -DLLAMA_BUILD_TOOLS=ON \
    -DLLAMA_BUILD_SERVER=ON \
    -DLLAMA_BUILD_APP=ON

cmake --build build-ppu --config Release --parallel 48
cmake --install build-ppu --config Release

编译完成后会将可执行安装到 /opt/llama.cpp,将如下内容追加至 /etc/profile 末尾:

export LLAMA_CPP_HOME=/opt/llama.cpp
export PATH=$LLAMA_CPP_HOME/bin:$PATH

重新连接会话即可使用。

上一篇