目前大模型研究非常广泛,但是对于个人用户如何部署一个大模型通常是比较麻烦的,而llama.cpp项目作为一个使用cpp来完成大模型推理的开源工具,对于没有丰富硬件资源的用户来说是一个很好用的工具,可以将中意的大模型十分简单的部署在自己的设备上。以下内容为使用llama.cpp将大模型部署在端侧设备K230上。

1. llama.cpp

  1. 下载源码

    1
    git clone https://github.com/ggerganov/llama.cpp.git
  2. 准备K230编译工具链

    首先说明一点,llama.cpp是一个纯c/c++的项目,虽然有相应的python文件作为模型转换工作,但是对于直接部署模型来说并不是很重要(毕竟个人用户也没有什么机会自己训练一个大模型,而预训练好的大模型在huggingface是很多的,同时llama.cpp需要的gguf格式的模型也可以在fuggingface上找到)。既然是c项目,那么很容易就可以通过交叉编译来生成K230上可运行的程序。

也可以使用带有rvv intrinsic的工具链进行编译,例如gcc14,这个自行尝试即可

K230的编译工具链很容易获取,编译过K230_sdk镜像的话,是可以在其toolchain目录下找到对应的工具链,拿来直接用就好。(现在我假设你已经有了噢)

1
drwxr-xr-x 10 curio curio 4.0K 11月 20 12:24 Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V3.0.1

现在还缺少K230相关的编译选项,可以通过K230的编译器nncase repo来获取,保留以下内容即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)

if(DEFINED ENV{RISCV_ROOT_PATH})
file(TO_CMAKE_PATH $ENV{RISCV_ROOT_PATH} RISCV_ROOT_PATH)
endif()

if(NOT RISCV_ROOT_PATH)
message(FATAL_ERROR "RISCV_ROOT_PATH env must be defined")
endif()

set(RISCV_ROOT_PATH ${RISCV_ROOT_PATH} CACHE STRING "root path to riscv toolchain")
set(CMAKE_C_COMPILER "${RISCV_ROOT_PATH}/bin/riscv64-unknown-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "${RISCV_ROOT_PATH}/bin/riscv64-unknown-linux-gnu-g++")
set(CMAKE_FIND_ROOT_PATH "${RISCV_ROOT_PATH}/riscv64-unknown-linux-gnu")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(ENABLE_VULKAN_RUNTIME OFF)


set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany -fstack-protector-strong -fPIE -pie -Wl,-z,now -Wl,-z,relro")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany -fstack-protector-strong -fPIE -pie -Wl,-z,now -Wl,-z,relro")


// 开启rvv, K230的工具链没有添加这个宏定义,如果使用gcc14的话不需要定义。
// add_definitions(-D__riscv_v_intrinsic)
// 当前不推荐开启,llama.cpp 的rvv实现有问题

将以上内容写入到.cmake 文件中,在后面编译中会用到

  1. 编译
    1
    2
    3
    4
    export RISCV_ROOT_PATH=/PATH/TO/YOUR/TOOLCHAIN/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V3.0.1/
    cd llama.cpp
    cmake . -B build -DCMAKE_TOOLCHAIN_FILE=/PATH/TO/YOUR/TOOLCHAIN/k230.cmake -DCMAKE_BUILD_TYPE=Release
    cmake --build build --config Release -j

成功编译后可以在build/bin目录下找到llama-cli

  1. 下载模型
    直接在huggingface上下载

  2. 准备上板执行
    将llama.cpp 和 qwen2.5-0.5b-instruct-q2_k.gguf拷贝到K230上

  3. 执行命令

    1
    ./llama-cli -m qwen2.5-0.5b-instruct-q2_k.gguf -p "system name whatever" -cnv

    这里的-cnv是用于开启对话模式,稍等几分钟就可以进行对话(虽然现在推理还很慢,如果开启rvv优化,这个2bit 量化的模型在K230上性能可以达到0.8t/s)