cix p1 OpenHarmony 6.0r 上使用mali g720调用vulkan进行端侧推理

笔者之前发布过此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)的文章,使用的是一张amd的rx580显卡。理论上支持vulkan的GPU都可以使用vulkan后端的llama.cpp (GPU)进行端侧推理。之前笔者没有将相关成果开源,现在将成果开源如下:

gitee地址:https://gitee.com/cix_oh/cix_p1_oh

github地址:https://github.com/lbkg/cix_p1_oh

cix p1 OpenHarmony上不同gpu上使用llama.cpp Vulkan 后端进行端侧推理

Mali-G720-Immortalis

javascript 复制代码
# llama-bench -m /data/qwen1_5-0_5b-chat-q2_k.gguf -ngl 100                                                                                                                        
ggml_vulkan: Found 1 Vulkan devices:                                                                                                                                               
ggml_vulkan: 0 = Mali-G720-Immortalis (Mali-G720-Immortalis) | uma: 1 | fp16: 1 | bf16: 0 | warp size: 16 | shared memory: 32768 | int dot: 1 | matrix cores: KHR_coopmat          
| model                          |       size |     params | backend    | ngl |            test |                  t/s |                                                           
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |                                                           
| qwen2 0.5B Q2_K - Medium       | 278.92 MiB |   619.57 M | Vulkan     | 100 |           pp512 |         75.59 ± 0.03 |                                                           
| qwen2 0.5B Q2_K - Medium       | 278.92 MiB |   619.57 M | Vulkan     | 100 |           tg128 |         50.75 ± 0.71 |                                                           
                                                                                                                                                                                   
build: unknown (0)

AMD Radeon RX 580

javascript 复制代码
# llama-bench -m /data/qwen1_5-0_5b-chat-q2_k.gguf -ngl 100
ggml_vulkan: Found 1 Vulkan devices:
ggml_vulkan: 0 = AMD Radeon RX 580 2048SP (RADV POLARIS10) (radv) | uma: 0 | fp16: 0 | bf16: 0 | warp size: 64 | shared memory: 65536 | int dot: 0 | matrix cores: none
| model                          |       size |     params | backend    | ngl |            test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |
| qwen2 0.5B Q2_K - Medium       | 278.92 MiB |   619.57 M | Vulkan     | 100 |           pp512 |       2397.45 ± 1.92 |
| qwen2 0.5B Q2_K - Medium       | 278.92 MiB |   619.57 M | Vulkan     | 100 |           tg128 |        131.39 ± 8.65 |

build: unknown (0)

可以看到差距挺明显,如果需要高性能的LLM推理,还是使用一张桌面级显卡更好。

移植llama.cpp vulkan到OpenHarmony步骤

1.在交叉编译前在x86编译主机上安装glslc工具,后面编译llama.cpp需要提前编译glslc

如果你想要使用最新版本的 shaderc,或者包管理器中的版本不符合你的需求,你可以从源码进行编译安装。

javascript 复制代码
## 下载v2025.1或者主线版本
git clone -b v2025.1 https://github.com/google/shaderc.git
cd shaderc

# 初始化子模块
git submodule update --init --recursive

# 配置和编译
./utils/git-sync-deps
mkdir build
cd build
cmake -DCMAKE\_BUILD\_TYPE=Release ..
cmake --build .

# 安装
sudo cmake --install .

通过以上步骤,你就能在 Linux 系统中安装 glslc 工具了。

2.开始交叉编译带有vulkan后端的llama.cpp

这一步需要交叉编译出来的oh vulkansdk,详细请参考开源!cix p1芯片适配OpenHarmony6.0r,对接vulkan同时提供vulkansdk工具

javascript 复制代码
wget https://codeload.github.com/ggml-org/llama.cpp/zip/refs/tags/b6049

unzip b6049

cd llama.cpp-b6049

OpenHarmony/prebuilts/ohos-sdk/linux/xx/native/build-tools/cmake/bin/cmake  -B build \
-DGGML_VULKAN=ON \
-DLLAMA_CURL=OFF \
-DVULKAN_LOADER_INSTALL_DIR=/OpenHarmony/vulkansdk_oh \
-DVULKAN_HEADERS_INSTALL_DIR=/OpenHarmony/vulkansdk_oh \
-DCMAKE_TOOLCHAIN_FILE=/OpenHarmony/prebuilts/ohos-sdk/linux/xx/native/build/cmake/ohos.toolchain.cmake \
-DVulkan_LIBRARY=/OpenHarmony/vulkansdk_oh/lib/libvulkan.so.1.4.313 \
-DVulkan_INCLUDE_DIR=/OpenHarmony/vulkansdk_oh/include \
-DCMAKE_EXE_LINKER_FLAGS="-L/OpenHarmony/prebuilts/clang/ohos/ohos-arm64/llvm/lib -Wl,-rpath=/OpenHarmony/prebuilts/clang/ohos/ohos-arm64/llvm/lib"

# 开始编译
OpenHarmony/prebuilts/ohos-sdk/linux/xx/native/build-tools/cmake/bin/cmake --build build --config Release -- -j32

# 安装到指定目录
cd build 
make install DESTDIR=/xxx/install

3.手动测试

注意要将oh源码下的prebuilts/clang/ohos/ohos-arm64/llvm/lib/libomp.so推到开发板中

下载模型 https://www.modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GGUF/files

https://www.modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat-GGUF/file/view/master/qwen1_5-0_5b-chat-q2_k.gguf?status=2

javascript 复制代码
# 创建 /dev/shm 目录
mkdir /dev/shm
# OpenMP 多线程库尝试访问共享内存 (/dev/shm) 
chmod 777 /dev/shm

llama-cli -m /data/qwen1_5-0_5b-chat-q2_k.gguf -ngl 100 

llama-bench -m /data/qwen1_5-0_5b-chat-q2_k.gguf -ngl 100

笔者已经在https://gitee.com/cix_oh/cix_p1_oh/tree/6.0.0_tag_kernel_6.6.101_g720/搭配好了环境,读者可直接编译体验

往期文档回顾:

1.此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)

2.以此芯p1芯片为例研究OpenHarmony上GPU (Vulkan) 加速在深度学习推理中的价值

3.开源!移植此芯p1芯片驱动到OpenHarmony社区内核上

4.cix p1芯片OpenHarmony社区内核版本从6.6.89升级到6.6.101

5.开源!!!cix p1 芯片OpenHarmony社区公版6.6.101适配AMD显卡

6.cix p1芯片OpenHarmony标准系统烧录方法

7.开源!cix p1芯片适配OpenHarmony6.0r,对接vulkan同时提供vulkansdk工具