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也受支持,不使用--pure的Q4_0量化也能工作。但是,相比纯Q4_0量化,性能会有所下降。
CMake配置选项
OpenCL后端提供了以下CMake选项来控制后端行为:
| CMake选项 | 默认值 | 描述 |
|---|---|---|
GGML_OPENCL_EMBED_KERNELS | ON | 将OpenCL内核嵌入到可执行文件中 |
GGML_OPENCL_USE_ADRENO_KERNELS | ON | 使用为Adreno优化的内核 |
Android平台
使用Ubuntu 22.04来构建Android目标平台。确保以下工具可以从命令行访问:
- Git
- CMake 3.29
- Ninja
- Python3
I. 环境设置
- 安装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"
- 安装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. 环境设置
- 安装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