RK3588 上的 LLM(三):板端部署 RKLLM 并进行大模型推理(以 RK3588 为例)

本教程记录了如何在 RK3588 开发版上部署 RKLLM 并使用其进行大模型推理的过程,包含基于命令行的运行和服务端部署(本文以 Gradio 前后端为例)

注:运行 RKLLM 需要 RKNPU 驱动版本至少为 0.9.8,升级方法可以参考合集中升级 RKNPU 驱动版本的文章

0、安装 RKLLM Runtime:

首先拉取rknn-llm源码:

git clone https://github.com/airockchip/rknn-llm && cd rknn-llm

安装 RKLLM 的 Runtime 到/usr/lib

sudo install rrkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so /usr/lib

1、使用命令行运行:

从源码编译llm_demo

g++ -std=c++11 ./examples/rkllm_api_demo/deploy/src/llm_demo.cpp -o llm_demo -lrkllmrt

此时,在当前目录下会生成一个llm_demo可执行文件,此程序可以运行转换过后的模型(有关 RKLLM 的模型转换请参考这里,这里以此教程转换出的Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm模型文件为例,这里假设你已经上传此模型文件到~目录):

#  直接输入 llm_demo 可查看使用说明
llm_demo ~/Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm 2048 4096

成功运行后可直接在终端中与其对话

2、使用官方脚本搭建服务端:

官方给出了两个脚本用于搭建 RKLLM 服务器,分别基于 Flask 和 Gradio,这里以 Gradio 为例:
Gradio 服务器的脚本位于 rknn-llm 中的examples/rkllm_server_demo/rkllm_server/gradio_server.py,可以新建一个文件夹存放此项目(假设你当前位于rknn-llm文件夹下):

mkdir ~/rkllm_gradio
cp ./examples/rkllm_server_demo/rkllm_server/gradio_server.py ~/rkllm_gradio
cd ~/rkllm_gradio

随后,创建一个虚拟环境(这里以 python-venv 为例,也可使用 conda 等虚拟环境):

python -m venv venv && source venv/bin/activate
# 从清华源安装
pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple
# --rkllm_model_path 参数为模型文件的位置,这里以转换出的`Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm`模型文件为例,这里假设你已经上传此模型文件到 ~ 目录
# --target_platform 参数为当前开发板的芯片型号,这里为rk3588
python gradio_server.py --rkllm_model_path ~/Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm --target_platform rk3588

运行后会自动监听8080端口(若无占用),此时电脑访问http://开发板ip:8080/即可直接进入网页端

2.1、使用 API 连接

Gradio 支持使用 python API 进行连接,以下是一份示例代码:

from gradio_client import Client
import sys
import time
import argparse

def main():

    parser = argparse.ArgumentParser(description='Gradio客户端连接到RKLLM后端')
    parser.add_argument('--text', '-t', type=str, required=True, help='要发送给模型的输入文本')
    args = parser.parse_args()

    # 后端URL
    url = "http://127.0.0.1:8080"

    try:
        # 创建客户端连接
        client = Client(url, verbose=False)
#        print(f"已连接到后端: {url}")
    except Exception as e:
        print(f"连接失败: {e}")
        sys.exit(1)

    # 输入文本
    input_text = args.text  # 替换为您的输入
    # 如果需要从用户输入获取,取消下一行注释:
    # input_text = input("请输入您的消息: ")

    try:
        # 第一步:调用get_user_input端点,清空输入框并更新历史
#        print("发送用户消息...")
        result1 = client.predict(
            user_message=input_text,
            history=[],  # 空历史记录
            api_name="/get_user_input"
        )

        # result1返回 (inputtextbox, value_3)
        # inputtextbox是清空后的输入框,value_3是更新后的历史
        updated_history = result1[1]
#        print(f"更新后的历史: {updated_history}")

        # 第二步:调用get_RKLLM_output端点,获取模型回复
#        print("等待模型回复...")
        job = client.submit(
            history=updated_history,
            api_name="/get_RKLLM_output",
            fn_index=1  # 第二个端点
        )

#        print("流式输出开始:")
        last_response = ""
        for output in job:
            # 输出是更新后的历史记录
            if output and len(output) > 0:
                # 获取最后一条消息的助手回复
                last_exchange = output[-1]
                if len(last_exchange) > 1 and last_exchange[1]:
                    current_response = last_exchange[1]
                    # 只打印新增的部分
                    new_text = current_response[len(last_response):]
                    if new_text:
                        print(new_text, end='', flush=True)
                        last_response = current_response
            time.sleep(0.05)  # 稍微延迟以避免过于频繁的检查

#        print("\n流式输出结束。")
        print("\n ")

    except Exception as e:
        print(f"请求失败: {e}")

if __name__ == "__main__":
    main()
posted @ 2025-11-07 14:37  Sivon  阅读(11)  评论(0)    收藏  举报