跳到主要内容

RKLLM 使用与大语言模型部署

本文档将讲述如何使用 RKLLM 将 Huggingface 格式的大语言模型部署到 RK3588 上利用 NPU 进行硬件加速推理

目前支持模型

这里以 TinyLLAMA 1.1B 为例子,完整讲述如何从 0 开始部署大语言模型到搭载 RK3588 芯片的开发版上,并使用 NPU 进行硬件加速推理

提示

如没安装与配置 RKLLM 环境,请参考 RKLLM 安装

模型转换

这里以 TinyLLAMA 1.1B 为例子,用户也可以选择任意目前支持模型列表中的链接

  • x86 PC 工作站中下载 TinyLLAMA 1.1B 所有文件, 如没安装 git-lfs,请自行安装
    git clone https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0
  • 激活 rkllm conda 环境, 可参考RKLLM conda 安装
    conda activate rkllm
  • 更改 rknn-llm/rkllm-toolkit/examples/huggingface/test.py 中 modelpath 模型路径与 rkllm 导出路径
    modelpath = 'Your Huggingface LLM model'
    ret = llm.export_rkllm("./Your_Huggingface_LLM_model.rkllm")
  • 运行模型转换脚本
    cd rknn-llm/rkllm-toolkit/examples/huggingface
    python3 test.py
    转换成功后可得到 rkllm 模型

编译可执行文件

  • 下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
  • 修改主程序代码, 这里修改两个地方
    74 param.num_npu_core = 3; // rk3588 num_npu_core 的取值范围 [1,3]
    118 string text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;
    119 // string text = input_str;
  • 修改 rknn-llm/rkllm-runtime/examples/rkllm_api_demo/build-linux.sh 编译脚本中 gcc 路径
    GCC_COMPILER_PATH=gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
  • 运行模型转换脚本
    cd rknn-llm/rkllm-runtime/examples/rkllm_api_demo
    bash build-linux.sh
    生成的可执行文件在 build/build_linux_aarch64_Release/llm_demo

板端部署

本地终端模式

  • 将转换成功后的 rkllm 模型与编译后的二进制文件 llm_demo 复制到板端
  • 导入环境变量
    ulimit -n 102400
    export LD_LIBRARY_PATH=rknn-llm/rkllm-runtime/runtime/Linux/librkllm_api/aarch64:$LD_LIBRARY_PATH
  • 运行 llm_demo,输入 exit 退出 bash taskset f0 ./llm_demo your_rkllm_path rkllm_2.webp

Gradio 模式

服务端
  • 安装 gradio
    pip3 install gradio
  • 复制 librkllmrt.sorkllm_server/lib
    cd rknn-llm/rkllm-runtime
    cp ./runtime//Linux/librkllm_api/aarch64/librkllmrt.so ./examples/rkllm_server_demo/rkllm_server/lib
  • 修改 gradio_server.py, 禁用 GPU 进行 prefill 加速
    rknnllm_param.use_gpu = False
  • 启动 gradio server
    cd examples/rkllm_server_demo/rkllm_server
    python3 gradio_server.py --target_platform rk3588 --rkllm_model_path your_model_path
  • 浏览器访问开发板 ip 8080 端口 rkllm_3.webp
客户端

用户可以在开发板开启 gradio 服务端后在同网络环境其他设备上通过 Gradio API 调用 LLM gradio server

  • 安装 gradio_client
    pip3 install gradio_client
  • 修改 chat_api_gradio.py 中的 ip 地址,用户需要根据自己部署的具体网址进行修改
    # 用户需要根据自己部署的具体 ip 进行修改
    client = Client("http://192.168.2.209:8080/")
  • 运行 chat_api_gradio.py bash cd rknn-llm/rkllm-runtime/examples/rkllm_server_demo python3 chat_api_gradio.py rkllm_4.webp

Falsk 模式

服务端
  • 安装 flask

    pip3 install flask==2.2.2 Werkzeug==2.2.2
  • 复制 librkllmrt.sorkllm_server/lib

    cd rknn-llm/rkllm-runtime
    cp ./runtime//Linux/librkllm_api/aarch64/librkllmrt.so ./examples/rkllm_server_demo/rkllm_server/lib
  • 修改 flask_server.py, 禁用 GPU 进行 prefill 加速

    rknnllm_param.use_gpu = False
  • 启动 flask server, 端口 8080 bash cd examples/rkllm_server_demo/rkllm_server python3 flask_server.py --target_platform rk3588 --rkllm_model_path your_model_path rkllm_5.webp

客户端

用户可以在开发板开启 flask 服务端后在同网络环境其他设备上通过 flask API 调用 flask server, 户在进行自定义功能的开发的过程中,只需参考该 API 访问示例使用对应的收发结 构体进行数据的包装、解析即可

  • 修改 chat_api_flask.py 中的 ip 地址,用户需要根据自己部署的具体网址进行修改
    # 用户需要根据自己部署的具体 ip 进行修改
    server_url = 'http://192.168.2.209:8080/rkllm_chat'
  • 运行 chat_api_flask.py bash cd rknn-llm/rkllm-runtime/examples/rkllm_server_demo python3 chat_api_flask.py rkllm_6.webp

部分模型性能对比

ModelParameter SizeChipChip CountInference Speed
TinyLlama1.1BRK3588115.03 token/s
Qwen1.8BRK3588114.18 token/s
Phi33.8BRK358816.46 token/s
ChatGLM36BRK358813.67 token/s