RKLLM — local language models on the NPU
RKLLM runs large language models directly on the board's NPU. A chatbot, a summarizer, or a voice assistant that works with no cloud, no API cost, and no data leaving the device. For products where privacy or offline operation is the point, this is a strong differentiator.
What it can realistically run
Small, quantized instruction models — the 1.5B–3B class — run interactively. Qwen2.5-1.5B, DeepSeek-R1-Distill-Qwen-1.5B and similar are the sweet spot. Larger models load but slow down; on edge hardware, smaller-and-quantized beats larger-and-sluggish for a responsive product.
Be honest with your product expectations: this is not a datacenter GPU. It is enough for structured, bounded language tasks — summarize this text, answer from this context, format this into speech — which is exactly what most on-device assistants need.
The workflow (same shape as RKNN)
- Convert on an x86 Linux PC with RKLLM-Toolkit — turns a Hugging Face
model into a quantized
.rkllmfile. - Deploy on the board with RKLLM Runtime (C/C++ API) — loads the
.rkllmand runs inference through the NPU.
Conversion is PC-only, exactly like RKNN.
Step 1 — Convert on a PC
Recommended: x86 Ubuntu 20.04, Python managed with miniforge. Install the
RKLLM-Toolkit wheel from the rknn-llm release, then:
from rkllm.api import RKLLM
llm = RKLLM()
# Point at a downloaded Hugging Face model directory
llm.load_huggingface(model='./Qwen2.5-1.5B-Instruct')
# Quantize. w8a8 and w4a16 are the supported types; w8a8 is the common start.
llm.build(
do_quantization=True,
optimization_level=1,
quantized_dtype='w8a8',
target_platform='rk3588', # or rk3576
)
llm.export_rkllm('Qwen2.5-1.5B-Instruct_W8A8_RK3588.rkllm')
The filename convention tells you what you built: quantization type (W8A8) and
target chip (RK3588). Keep it — it prevents deploying an RK3576 model to an
RK3588 by accident.
Step 2 — Check the board's NPU driver
RKLLM needs a newer NPU driver than plain RKNN — v0.9.6 or above.
cat /sys/kernel/debug/rknpu/version
If it is below 0.9.6, update the RKNPU2 userspace package and driver before going
further. failed to open rknpu module at runtime almost always means the driver
is missing or too old.
Step 3 — Deploy and run on the board
Copy the .rkllm to the board, then run it through the RKLLM Runtime. Rockchip's
rknn-llm repo ships a llm_demo you can build and use directly:
# on the board
scp user@pc:Qwen2.5-1.5B-Instruct_W8A8_RK3588.rkllm .
# run the demo runtime (args: model, max_new_tokens, max_context)
./llm_demo Qwen2.5-1.5B-Instruct_W8A8_RK3588.rkllm 512 512
For a real product you embed the RKLLM Runtime C API in your own application: load the model once, then feed prompts and stream tokens back through a callback. The repo's demo source is the reference implementation to build from.
Where this fits an Itemptechnology product
A local LLM on the board turns a signage or kiosk device into something that can speak, summarize and answer on its own — offline, private, no running cost.
Concrete pairings with the rest of the platform:
- A kiosk that answers customer questions from a fixed knowledge base, with no network dependency and no per-query cloud bill.
- A signage player that generates a spoken daily briefing on-device — weather, schedule, notices — combining a local LLM with text-to-speech.
- A device that summarizes or reformats content locally before displaying it, keeping source data on the device.
For anything voice-facing, pair the LLM output with TTS. For structured knowledge answering, a small model plus a retrieval step over your own documents beats a larger model trying to hold everything in weights.
Related
- On-device AI overview — RKNN vs RKLLM
- RKNN — vision models, and the AI path for RK3568/RK3566
- Boards that run RKLLM: KTM-S88CD, KTM-S76
- RK3588 · RK3576
rknn-llm moves fast — supported models, quantization types and driver
requirements change between releases. Verify against the current
airockchip/rknn-llm repo before building.