在llama.cpp中为高通Adreno GPU引入全新的OpenCLTM GPU后端
发表于 2024-12-11 22:27:09

我们很高兴地宣布,可以将基于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模型(包括llama23),其参数为7B8B等。

• Gemma 1Gemma 22B)模型,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社区,与高通科技公司的专家交流,与使用本公司技术的其他开发人员联系,并随时了解以开发人员为中心的最新消息和产品更新内容。

在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。

高通与骁龙品牌产品均为高通科技公司和/或其子公司的产品。

关于作者

王宏强

主任工程师/经理

阅读更多

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】