Qwen3-1.7B LLM 文本对话
本例程提供 OpenAI 兼容 REST API(POST /v1/chat/completions),在 RK3588 + RK1828 上跑 Qwen3-1.7B 纯文本对话。
整体框图
客户端 curl /v1/chat/completions
│
▼
rkllm3-server (RK1828 NPU via PCIe)
├─→ Tokenize (gguf SentencePiece)
├─→ Embed lookup (mmap)
├─→ LLM decode (Qwen3-1.7B,103 tokens/s)
└─→ response (OpenAI ChatCompletion JSON)两条处理域:
- RK3588:HTTP 服务进程、tokenizer、JSON 编解码
- RK1828(PCIe 协处理器):
rkllm3-server走/dev/dri/renderD128(PCIe 地址0004:41:00.0)做 LLM decode
1. 装好依赖
# 1. rkllm3-server 二进制
which rkllm3-server
# 2. RK1828 NPU 节点
ls -l /dev/dri/renderD128
# 3. rknn3 systemd 服务
systemctl is-active rknn3
# 4. 模型文件
ls -lh /userdata/models/Qwen3-1.7B/实测输出(节选):
/usr/bin/rkllm3-server
crw-rw---- 1 root video 226, 128 8月27日 11:11 /dev/dri/renderD128
active
total 1.7G
-rw-r--r-- 1 linaro linaro 24M Qwen3-1.7B.rknn
-rw-r--r-- 1 linaro linaro 1.1G Qwen3-1.7B.weight
-rw-r--r-- 1 linaro linaro 5.7M Qwen3-1.7B.tokenizer.gguf
-rw-r--r-- 1 linaro linaro 594M Qwen3-1.7B.embed.bin二进制 / NPU 节点 / 服务 / 模型齐全,合计 ~1.7 GB(运行时 RSS ~2.1 GB,加 swap 4 GB 可稳定跑)。
2. 模型文件
/userdata/models/Qwen3-1.7B/
Qwen3-1.7B.rknn 24M LLM 结构
Qwen3-1.7B.weight 1.1G LLM 权重
Qwen3-1.7B.tokenizer.gguf 5.7M tokenizer(SentencePiece BPE)
Qwen3-1.7B.embed.bin 594M 词嵌入(可 mmap)合计 ~1.7 GB(运行时 RSS ~2.1 GB,加 4 GB swap 可稳定跑)。
3. 一键部署
cd /home/linaro/qwen3-llm
bash install.sh # 交互式(预检查 → y/n → 验证)
bash install.sh --yes # 跳过确认install.sh 预检查 3 项:5 个文件(rkllm3-server + 4 个模型文件)/ rknn3.service / /dev/dri/renderD128。
4. 日常使用
4.1 make info — 看环境
make info实测输出(节选):
--- rkllm3-server ---
/usr/bin/rkllm3-server
--- 模型 ---
-rw-r--r-- 1 linaro linaro 24M Qwen3-1.7B.rknn
-rw-r--r-- 1 linaro linaro 1.1G Qwen3-1.7B.weight
-rw-r--r-- 1 linaro linaro 5.7M Qwen3-1.7B.tokenizer.gguf
-rw-r--r-- 1 linaro linaro 594M Qwen3-1.7B.embed.bin
--- rknn3 service ---
active4.2 make run — 后台启动 server
make run实测输出:
[server] starting rkllm3-server on 127.0.0.1:7878...
[server] PID 12345, log=/tmp/qwen3_llm.log后台启动命令:
nohup rkllm3-server \
-m /userdata/models/Qwen3-1.7B/Qwen3-1.7B.rknn \
--weight /userdata/models/Qwen3-1.7B/Qwen3-1.7B.weight \
--vocab /userdata/models/Qwen3-1.7B/Qwen3-1.7B.tokenizer.gguf \
--embed /userdata/models/Qwen3-1.7B/Qwen3-1.7B.embed.bin \
--embed-mmap \
-a Qwen3-1.7B \
--host 127.0.0.1 --port 7878 \
-c 8192 -n 256 \
> /tmp/qwen3_llm.log 2>&1 &4.3 make health — 健康检查
make health实测输出:
{
"object": "list",
"data": [
{
"id": "Qwen3-1.7B",
"object": "model",
"created": 1787815326,
"owned_by": "rknn",
"meta": {
"vocab_type": 2,
"n_vocab": 151936,
"n_ctx_train": -1,
"n_embd": 2048,
"n_params": 0,
"size": 0
}
}
]
}4.4 make chat PROMPT="..." — 跑一次对话
make chat PROMPT="用一句话介绍深圳视美泰有限公司"实测输出:
![Qwen3-1.7B 对话实测 — 两次 make chat 分别询问公司介绍 / 自我介绍,含 thinking 过程与 [usage] 统计](/wiki/images/RK1828/Qwen3-1.7b%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C.png)
性能:~103 tokens/s(实测 timings.predicted_per_second)。
Qwen3-1.7B LLM 已验证端到端跑通:rkllm3-server → OpenAI 兼容 API → 中文理解 + thinking 推理 + 流式输出 token。
4.5 make stop / make clean
make stop # kill PID,kill 后台 server
make clean # stop + rm /tmp/qwen3_llm.log5. REST API(OpenAI 兼容)
5.1 GET /v1/models
列出已加载的模型:
curl -s http://127.0.0.1:7878/v1/models5.2 POST /v1/chat/completions
OpenAI ChatCompletion API 兼容。
请求:
{
"model": "Qwen3-1.7B",
"messages": [{ "role": "user", "content": "你好,介绍下你自己" }],
"max_tokens": 128,
"stream": false
}响应:
{
"choices": [
{
"finish_reason": "length",
"index": 0,
"message": { "role": "assistant", "content": "..." }
}
],
"model": "Qwen3-1.7B",
"usage": {
"prompt_tokens": 16,
"completion_tokens": 128,
"total_tokens": 144
},
"timings": { "predicted_per_second": 103.5 }
}6. 客户端示例
Python(OpenAI SDK)
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:7878/v1", api_key="EMPTY")
resp = client.chat.completions.create(
model="Qwen3-1.7B",
messages=[{"role": "user", "content": "你好"}],
max_tokens=256,
)
print(resp.choices[0].message.content)curl
curl -s -X POST http://127.0.0.1:7878/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"Qwen3-1.7B",
"messages":[{"role":"user","content":"你好"}],
"max_tokens":256,"stream":false}' | jq .choices[0].message.content流式(stream=true)
curl -s -X POST http://127.0.0.1:7878/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"Qwen3-1.7B",
"messages":[{"role":"user","content":"你好"}],
"max_tokens":256,"stream":true}'7. 性能
| 指标 | 实测 |
|---|---|
| 冷启动 → 端口 ready | ~5 秒(LLM 加载 + embed mmap) |
| 文本生成速度 | 103.5 tokens/s |
| 128 tokens 耗时 | 1236 ms |
| prompt_tokens | 16(中文系统 prompt + 用户问题) |
| 模型参数量 | 1.7 B |
| vocab 大小 | 151,936 |
| embed 维度 | 2048 |
| ctx 大小 | 8192(-c 参数可改) |
| 运行时 RSS | ~2.1 GB |
8. 关键事实速查
| 项目 | 取值 |
|---|---|
| 模型路径 | /userdata/models/Qwen3-1.7B/ |
| 二进制路径 | /usr/bin/rkllm3-server |
| HTTP 端口 | 7878 |
| 服务 API | GET /v1/models / POST /v1/chat/completions |
| 兼容性 | OpenAI ChatCompletion(部分字段,如 timings 是 rkllm 扩展) |
| PID 文件 | /tmp/.qwen3_llm.pid |
| log 文件 | /tmp/qwen3_llm.log |
| embed | mmap(加速冷启动) |
| thinking 模式 | 默认开启(可 prompt 绕过) |
| install.sh 自动装包 | 不装包 |
9. 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
which rkllm3-server 找不到 | 二进制没装 | 联系 SDK 提供方补装 /usr/bin/rkllm3-server |
make run 后 make health 不响应 | 还在加载(~5 秒) | sleep 10 && make health 重试 |
make chat 返回 connection refused | server 没跑 | make run && sleep 5 && make health |
生成内容含 <think>... 块 | Qwen3 默认开启 thinking | 在 prompt 加"直接回答不要思考",或在 messages 里加 {"role": "system", "content": "不要思考,直接回答"} |
想用 /completion(llama.cpp 风格) | rkllm3-server 仅 OpenAI 风格 | 改用 /v1/chat/completions |
embed 没 mmap,启动慢 | Makefile 已加 --embed-mmap | 检查 Makefile run target |
| token 速度比预期慢 | 可能并发 / 内存压力 | nvidia-smi 等价(rk):cat /sys/kernel/debug/rknpu/load(如有),或 free -m 看内存 |
install.sh 报 /dev/dri/renderD128 缺失 | NPU 驱动没起来 | sudo systemctl restart rknn3 |
10. 已知限制
/completion不支持:rkllm3-server 仅 OpenAI 风格,不是 llama.cpp 原生 API- thinking 模式:Qwen3 默认开启
<think>...块,首次回答会比较啰嗦(可在 prompt 里要求"直接回答不要思考"绕过) - token 速度:1.7B 模型 ~103 tokens/s,4B 模型会更慢
- 不含视觉:仅纯文本对话
相关文档
- RTSP 推流 + AI 分析 — 摄像头 + NPU + RTSP 端到端
- PaddleOCR-VL OCR — 文字识别 HTTP 服务
