开发板咨询电话热线:13378450634
X86,PCBA咨询电话:18620626517

RK3588+RK1828多模态AI问答机器人性能实测

 二维码
发表时间:2026-08-10 16:30作者:广州定昌电子gzdcsmt.com

开发一款多模态机器人,用时下的RK3588主板非常合适,定昌RK3588板卡(DC_EN588)支持RK182X算力卡,可拓展算力至26TOPS,支持Qwen2.5-3B、Qwen3-VL-2B、Qwen2.5-VL-7B、Qwen3-8B等模型。满足多模态机器人的问答功能开发需求。


一:硬件平台+固件


1)RK3588板卡(DC_EN588)

2)  RK182X算力卡


图片


二:问答机器人产品特点


这是我们基于 RK1828 的端侧大模型体验页。模型在板子上跑,您手机连同一 Wi‑Fi 打开页面就能问。可以打字、说话,也能传图;需要的话旁边数字人会跟着念答案——全程私有部署,适合政府、园区、工位助手这类不能上云的场景。


RK3588+RK1828大模型部署


支持的模型多


RK3588+RK1828大模型部署2

三:实测数据


测试代码:


#!/usr/bin/env python3

import json, time, subprocess, urllib.request, os

MODELS = ["Qwen2.5-3B", "Qwen3-VL-2B", "Qwen2.5-VL-7B", "Qwen3-8B"]

BASE = "http://127.0.0.1:8080"

PROMPT = "请用大约80个汉字介绍RK3588芯片的主要特点和典型应用场景。"

MAX_TOKENS = 128

RUNS = 2

def http_json(url, data=None, timeout=300):    

req = urllib.request.Request(url, method="GET" if data is None else "POST")    

if data is not None:

     body = json.dumps(data).encode()

     req.add_header("Content-Type", "application/json")

     req.data = body    

with urllib.request.urlopen(req, timeout=timeout) as r:

     return json.loads(r.read().decode())

def wait_model(timeout=240):

 t0 = time.time()

 while time.time() - t0 < timeout:

     try:

         j = http_json(BASE + "/v1/models", timeout=3)

         data = j.get("data") or []

        if data:

             return data[0].get("id", ""), time.time() - t0

     except Exception:

         pass

     time.sleep(2)

 return None, time.time() - t0

def switch_model(name):

script = "/userdata/models/%s/switch_to.sh" % name

 p = subprocess.run(

     "echo 123456 | sudo -S bash %s" % script,

    shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,

     text=True, timeout=120)

 return p.returncode, (p.stdout or "")[-400:]

def chat(max_tokens=MAX_TOKENS):

 t0 = time.time()

 j = http_json(BASE + "/v1/chat/completions", {

     "messages": [{"role": "user", "content": PROMPT}],

    "max_tokens": max_tokens,

     "temperature": 0.1,

     "stream": False,

 }, timeout=300)

 wall = time.time() - t0

 usage = j.get("usage") or {}

 timings = j.get("timings") or {}

 content = ((j.get("choices") or [{}])[0].get("message") or {}).get("content") or ""

 return {

     "wall_s": round(wall, 3),

     "prompt_tokens": usage.get("prompt_tokens"),

     "completion_tokens": usage.get("completion_tokens"),

     "prompt_tok_s": round(timings.get("prompt_per_second") or 0, 2),

    "gen_tok_s": round(timings.get("predicted_per_second") or 0, 2),

     "prompt_ms": round(timings.get("prompt_ms") or 0, 1),

    "gen_ms": round(timings.get("predicted_ms") or 0, 1),

    "reply_preview": content.replace("\n", " ")[:100],

     "model_id": j.get("model"),

}

def model_size_gb(name):

 p = "/userdata/models/%s" % name

 out = subprocess.check_output(["du", "-sbL", p], text=True).split()[0]

 return round(int(out) / (1024 ** 3), 2)

results = []

for name in MODELS:

 print("\n===== %s =====" % name, flush=True)

 row = {"name": name, "size_gb": model_size_gb(name), "type": "VLM" if "VL" in name else "LLM"}

 t_sw = time.time()

 rc, out = switch_model(name)

 mid, load_wait = wait_model(240)

 row["load_s"] = round(time.time() - t_sw, 1)

 row["load_wait_s"] = round(load_wait, 1)

 row["model_id"] = mid

 row["switch_rc"] = rc

 print("loaded id=%s load_s=%.1f" % (mid, row["load_s"]), flush=True)

 if not mid:

    row["error"] = "load timeout"

     results.append(row)

     continue

 try:

     chat(32)

 except Exception as e:

     row["error"] = "warmup failed: %s" % e

     results.append(row)

     continue    runs = []

 for i in range(RUNS):

     try:

         r = chat(MAX_TOKENS)

         runs.append(r)

         print("  run%d: gen=%.2f tok/s prompt=%.2f tok/s wall=%.3fs n=%s" % (

             i + 1, r["gen_tok_s"], r["prompt_tok_s"], r["wall_s"], r["completion_tokens"]), flush=True)        except Exception as e:

         print("  run%d err: %s" % (i + 1, e), flush=True)

 if runs:

     row["gen_tok_s_avg"] = round(sum(r["gen_tok_s"] for r in runs) / len(runs), 2)

     row["prompt_tok_s_avg"] = round(sum(r["prompt_tok_s"] for r in runs) / len(runs), 2)

     row["wall_s_avg"] = round(sum(r["wall_s"] for r in runs) / len(runs), 3)

     row["completion_tokens_avg"] = round(sum((r["completion_tokens"] or 0) for r in runs) / len(runs), 1)

     row["prompt_tokens"] = runs[0]["prompt_tokens"]

     row["reply_preview"] = runs[-1]["reply_preview"]

     row["runs"] = runs    results.append(row)print("\n===== SUMMARY_JSON =====")print(json.dumps(results, ensure_ascii=False, indent=2))




图片

这个模型怎么选呢

要快 / 多模态 → Qwen3-VL-2B

纯文本、Prefill 敏感 → Qwen2.5-3B

能力更强的多模态 → Qwen2.5-VL-7B

最大文本(含思考链,首段会慢)→ Qwen3-8B


四:源码分析


4-1):整体架构


浏览器 (局域网 :5000)

 │  SSE /query、上传图、ASR、设置

 ▼

Flask app.py  ──openai──►  rkllm3-server :8080  ──►  RK182x NPU

 │                                          ▲

 │                         │ switch_to.sh 改软链后 systemctl restart

 │                         │    

 ├─ TTS 队列 (edge-tts → espeak 回退 → ffplay)    

 └─ Unix DGRAM /tmp/dh_ipc.sock ──► digital_man.service(可选)


两套 systemd 服务:


rkllm3.service

依赖 rknn3.service,跑 /userdata/models/rkllm3_server.sh → 当前模型的

run.sh → rkllm3-server


web.service

python3 /userdata/web/app.py --webbrowser,配 PulseAudio/TTS 环境,root 跑




对以上RK3588+RK182X算力卡开发智能问答机器人感兴趣的,欢迎给我们致电或在线留言,另外我们还有多款算力板卡可供挑选,涵盖高中低算力,欢迎进一步咨询了解。


欢迎您申请主板样品

欢迎您申请主板样品

副标题

你的姓名
*
你的联系方式
*
你的公司名称
补充说明
提交
如你有任何需求或对此款产品感兴趣,或者询工厂价,都可以给我们留言,24小时内会有专业工程师回复你,竭诚为你服务。
姓名
*
手机或微信号
*
欢迎给我们留言
提交留言
开发板咨询电话: 13378450634(刘经理)|  X86主板,SMT,PCBA加工咨询电话:18620626517(朱经理)
©2025 广州市定昌电子科技有限公司 版权所有
抖音视频账号
安卓主板
微信咨询
SMT主板加工
微信咨询
地址:广州市番禺区大龙街新水坑路段49号开达工业园4栋2,3楼
VIP客户一对一对接