跳到主要内容

LLAMA.CPP OpenCL后端

背景介绍

OpenCL(开放计算语言)是一个开放、免费的跨平台并行编程标准,适用于超级计算机、云服务器、个人电脑、移动设备和嵌入式平台中的各种加速器。OpenCL定义了一种基于C99的编程语言来编程这些设备,以及用于控制平台和在计算设备上执行程序的应用程序编程接口(API)。与CUDA类似,OpenCL被广泛用于GPU编程,并得到大多数GPU厂商的支持。

Llama.cpp + OpenCL

llama.cpp的OpenCL后端主要是为了通过OpenCL技术在高通Adreno GPU上运行llama.cpp而设计的。由于OpenCL的可移植性,该后端也可以在某些Intel GPU上运行,尽管性能并非最优。

操作系统支持

操作系统支持状态验证平台
Android支持骁龙8 Gen 3, 骁龙8 Elite
Windows支持Windows 11 Arm64 搭配骁龙X Elite
Linux支持Ubuntu 22.04 WSL2 搭配Intel 12700H

硬件支持

Adreno GPU

已验证设备

Adreno GPU支持状态
Adreno 750 (骁龙8 Gen 3)支持
Adreno 830 (骁龙8 Elite)支持
Adreno X85 (骁龙X Elite)支持

数据类型支持

数据类型支持状态
Q4_0支持
Q6_K支持,但未优化

模型准备

您可以参考通用的模型准备和量化指南来进行模型准备。

目前我们支持Q4_0量化并对其进行了优化。为了在Adreno GPU上获得最佳性能,请在使用llama-quantize时添加--pure参数。例如:

./llama-quantize --pure ggml-model-qwen2.5-3b-f16.gguf ggml-model-qwen-3b-Q4_0.gguf Q4_0

由于Q6_K也受支持,不使用--pureQ4_0量化也能工作。但是,相比纯Q4_0量化,性能会有所下降。

CMake配置选项

OpenCL后端提供了以下CMake选项来控制后端行为:

CMake选项默认值描述
GGML_OPENCL_EMBED_KERNELSON将OpenCL内核嵌入到可执行文件中
GGML_OPENCL_USE_ADRENO_KERNELSON使用为Adreno优化的内核

Android平台

使用Ubuntu 22.04来构建Android目标平台。确保以下工具可以从命令行访问:

  • Git
  • CMake 3.29
  • Ninja
  • Python3

I. 环境设置

  1. 安装NDK
cd ~
wget https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip && \
unzip commandlinetools-linux-8512546_latest.zip && \
mkdir -p ~/android-sdk/cmdline-tools && \
mv cmdline-tools latest && \
mv latest ~/android-sdk/cmdline-tools/ && \
rm -rf commandlinetools-linux-8512546_latest.zip

yes | ~/android-sdk/cmdline-tools/latest/bin/sdkmanager "ndk;26.3.11579264"
  1. 安装OpenCL头文件和库
mkdir -p ~/dev/llm
cd ~/dev/llm

git clone https://github.com/KhronosGroup/OpenCL-Headers && \
cd OpenCL-Headers && \
cp -r CL ~/android-sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include

cd ~/dev/llm

git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader && \
cd OpenCL-ICD-Loader && \
mkdir build_ndk26 && cd build_ndk26 && \
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=$HOME/android-sdk/ndk/26.3.11579264/build/cmake/android.toolchain.cmake \
-DOPENCL_ICD_LOADER_HEADERS_DIR=$HOME/android-sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=24 \
-DANDROID_STL=c++_shared && \
ninja && \
cp libOpenCL.so ~/android-sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android

II. 构建llama.cpp

cd ~/dev/llm

git clone https://github.com/ggml-org/llama.cpp && \
cd llama.cpp && \
mkdir build-android && cd build-android

cmake .. -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=$HOME/android-sdk/ndk/26.3.11579264/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28 \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_OPENCL=ON

ninja

Windows 11 Arm64平台

使用搭载骁龙X Elite的Windows 11 Arm64设备。确保以下工具可以从命令行访问:

  • Git
  • CMake 3.29
  • Clang 19
  • Ninja
  • Visual Studio 2022
  • Powershell 7

Visual Studio提供必要的头文件和库,尽管不直接用于构建。或者,也可以安装Visual Studio Build Tools而不是完整的Visual Studio。

以下命令使用Powershell 7。如果使用较旧版本的Powershell,这些命令可能无法正常工作。

I. 环境设置

  1. 安装OpenCL头文件和库
mkdir -p ~/dev/llm

cd ~/dev/llm
git clone https://github.com/KhronosGroup/OpenCL-Headers && cd OpenCL-Headers
mkdir build && cd build
cmake .. -G Ninja `
-DBUILD_TESTING=OFF `
-DOPENCL_HEADERS_BUILD_TESTING=OFF `
-DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF `
-DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl"
cmake --build . --target install

cd ~/dev/llm
git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader && cd OpenCL-ICD-Loader
mkdir build && cd build
cmake .. -G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" `
-DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl"
cmake --build . --target install

II. 构建llama.cpp


mkdir -p ~/dev/llm
cd ~/dev/llm

git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
mkdir build && cd build

cmake .. -G Ninja `
-DCMAKE_TOOLCHAIN_FILE="$HOME/dev/llm/llama.cpp/cmake/arm64-windows-llvm.cmake" `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" `
-DBUILD_SHARED_LIBS=OFF `
-DGGML_OPENCL=ON
ninja

已知问题

  • 目前OpenCL后端不支持Adreno 6xx系列GPU。

待办事项

  • Q6_K的性能优化
  • 支持并优化Q4_K