笔者之前发布过此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)的文章,使用的是一张amd的rx580显卡。理论上支持vulkan的GPU都可以使用vulkan后端的llama.cpp (GPU)进行端侧推理。之前笔者没有将相关成果开源,现在将成果开源如下:
gitee地址:https://gitee.com/cix_oh/cix_p1_oh
- 移植好的oh llama.cpp vulkan : https://gitee.com/cix_oh/llama.cpp_vulkan_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
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