我们很高兴地宣布,可以将基于OpenCL的全新后端用于llama.cpp项目。此项工作针对骁龙SoC中的高通Adreno GPU进行了充分优化,标志着本公司持续努力提高llama.cpp的性能和多功能性的重要里程碑;作为得到广泛认可的项目,llama.cpp针对大语言模型(LLM),并一直在开源社区内积极发展。Llama.cpp的Adreno OpenCL后端目前正通过Codelinaro上传到开源社区。
在Adreno上使用OpenCL有何益处?
OpenCL(开放计算语言)是一种框架,可用于编写跨异构平台(包括CPU、GPU和其他处理器)执行的程序。利用OpenCL,我们可以使用在多种移动设备中得到广泛使用的Adreno GPU的计算能力。通过这种集成方式,我们能够优化llama.cpp,以便在这些设备上实现更好的性能和更高的效率。
主要功能与优点
1. 性能提升:全新后端显著提高了llama.cpp在Adreno GPU上的性能,实现了更快的计算和更高效的处理。
2. 更为广泛的兼容性:后端已针对Adreno GPU进行了高度优化。但是,后端可以在支持OpenCL 3.0标准的所有GPU上运行,同时具有子群支持,从而确保更为广泛的兼容性及可访问性。
3. 高度的灵活性:用户可以针对不同的GPU进行后端修改和优化,因为当前的解决方案使用了所有标准的OpenCL功能。例如,后端可以使用针对其他GPU的供应商扩展项目。
4. 开源协作:此项更新证明了开源协作的力量。我们与社区密切合作,使该后端能够满足开发人员和用户的需求。
全新后端利用OpenCL的各项功能将计算密集型任务卸载到GPU,从而释放CPU用于其他操作。这种并行处理能力对于需要高计算能力的应用程序(例如:机器学习)特别有益。
测试lama.cpp模型和平台
我们已用各种大语言模型对llama.cpp进行了严格测试,以确认其稳健性和性能。该类测试包括:
• Meta公司的llama模型(包括llama2和3),其参数为7B和8B等。
• Gemma 1和Gemma 2(2B)模型,Phi3 mini。
• Mistral 7B模型
• Qwen1&2 7B、百川7B等双语模型。
后端已经由骁龙SoC驱动的诸多高级设备上进行了测试:
• 搭载骁龙X Elite和骁龙X Plus芯片、运行Windows 11的笔记本电脑
• 由第1代、第2代和第3代骁龙8处理器、以及最新骁龙8 Elite处理器驱动的安卓智能手机
这些测试证明了后端在不同硬件配置下有效处理各种复杂模型的能力。
如何利用Windows on Snapdragon在安卓和基于骁龙X Elite放入WoS上构建和运行llama.cpp
支持Adreno OpenCL后端的llama.cpp已在骁龙8 Gen1、2、3、Elite移动平台驱动的Android设备和骁龙X Elite计算平台驱动的WoS设备上充分优化。以下为在这两种平台上构建和运行llama.cpp的说明。
安卓设备的步骤
必备软件(其他版本也可以)和硬件列表
• Ubuntu 22.04
• python3、CMake、Make和Ninja
• C/C++编译器
• 安卓NDK 26.3.11579264版,安装在/opt/android-sdk/ndk/26.3.11579264/中
• 由高通骁龙8 Gen 1、2、3、Elite移动平台驱动的安卓设备。
准备OpenCL
运行OpenCL所需要的文件无法直接通过NDK分发获得。用户必须从官方的Khronos® OpenCL库免费下载OpenCL头文件和ICD加载器,然后,将这些文件与安卓NDK一起用于构建llama.cpp可执行文件。
获取官方OpenCL头文件
wget https://github.com/KhronosGroup/OpenCL-Headers/archive/refs/tags/v2022.05.18.tar.gz && tar xvf v2022.05.18.tar.gz
cd OpenCL-Headers-2022.05.18 && \
cp -r CL /opt/android-sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
构建OpenCL ICD加载器
wget https://github.com/KhronosGroup/OpenCL-ICD-Loader/archive/refs/tags/v2022.05.18.tar.gz && \
tar xvf v2022.05.18.tar.gz
cd OpenCL-ICD-Loader-2022.05.18
mkdir build_ndk && cd build_ndk
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=/opt/android-sdk/ndk/26.3.11579264/build/cmake/android.toolchain.cmake \
-DOPENCL_ICD_LOADER_HEADERS_DIR=/opt/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
make
cp libOpenCL.so /opt/android-sdk/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android
利用Adreno OpenCL后端构建llama.cpp
git clone https://github.com/CodeLinaro/llama.cpp llama.cpp-adreno
cd llama.cpp-adreno && git checkout origin/adreno-support
mkdir build && cd build
cmake -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=/opt/android-sdk/ndk/26.3.11579264/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28 \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_OPENMP=OFF \
-DGGML_OPENCL=ON \
-DGGML_OPENCL_SMALL_ALLOC=ON \
-DGGML_OPENCL_USE_ADRENO_KERNELS=ON \
-DGGML_OPENCL_EMBED_KERNELS=ON \
..
ninja
如果构建成功,则可执行文件位于build/bin
具有Windows on Snapdragon的骁龙X Elite所采用的步骤
必备软件(其他版本也可)和硬件列表
• Visual Studio 2022(社区版或专业版)
• python3、CMake和Ninja
• LLVM 19(可以从https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.0下载)
• 一台由骁龙X Elite驱动的笔记本电脑
准备OpenCL
可以利用与安卓环境类似的方法获得OpenCL头文件和ICD加载器。为简化起见,我们假定OpenCL文件安装在C:\OpenCL中。
OpenCL头文件
git clone https://github.com/KhronosGroup/OpenCL-Headers
cd OpenCL-Headers
mkdir build && cd build
cmake .. `
-DBUILD_TESTING=OFF `
-DOPENCL_HEADERS_BUILD_TESTING=OFF `
-DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF `
-DCMAKE_INSTALL_PREFIX="C:\\OpenCL\\opencl-arm64-release"
cmake --build . --target install
OpenCL ICD加载器
git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader
cd OpenCL-ICD-Loader
mkdir build-arm64-release && cd build-arm64-release
cmake .. `
-A arm64 `
-DCMAKE_PREFIX_PATH="C:\\OpenCL\\opencl-arm64-release" `
-DCMAKE_INSTALL_PREFIX="C:\\OpenCL\\opencl-arm64-release"
cmake --build . --target install --config release
构建llama.cpp
git clone https://github.com/CodeLinaro/llama.cpp llama.cpp-adreno-clo
cd llama.cpp-adreno-clo && git checkout origin/adreno-support -b adreno-support
mkdir build && cd build
cmake .. `
-G Ninja `
-DCMAKE_PREFIX_PATH="C:\\OpenCL\\opencl-arm64-release" `
-DBUILD_SHARED_LIBS=OFF `
-DGGML_OPENMP=OFF `
-DGGML_OPENCL=ON `
-DGGML_OPENCL_SMALL_ALLOC=ON `
-DGGML_OPENCL_USE_ADRENO_KERNELS=ON `
-DGGML_OPENCL_EMBED_KERNELS=ON
cmake --build .
如果构建成功,则可执行文件位于build/bin
运行可执行文件
以下为运行llama.cpp可执行文件的示例:
./llama-cli -m ggml-model-qwen1.5-7b-chat-Q4_0.gguf -b 128 -ngl 99 -c 2048 -p "Hello"
请注意,Q4_0量化方案已经对Adreno OpenCL后端进行了权重优化。其他量化方案(例如:FP16和Q6)目前正在进行权重优化,我们很快就会进行更新。
未来工作
高通团队目前正致力于将更多Adreno特定功能引入OpenCL后端。Adreno GPU支持各种各样的扩展,从而可以实现更好的性能和更高的功率。例如,我们支持整数点积和片上全局内存等功能(请参考通过高通开发人员获得的Adreno软件开发工具包)。
结论
为Adreno GPU添加OpenCL GPU后端是llama.cpp向前迈出的重要一步。我们很高兴看到社区将如何利用这一增强功能,并期待您的反馈。
想要了解更多内容吗?请加入我们的意见Discord社区,与高通科技公司的专家交流,与使用本公司技术的其他开发人员联系,并随时了解以开发人员为中心的最新消息和产品更新内容。
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
高通与骁龙品牌产品均为高通科技公司和/或其子公司的产品。
关于作者
王宏强
主任工程师/经理