LLM-modellen uitvoeren op RK3576
Converteer DeepSeek-R1-Distill-Qwen-1.5B naar RKLLM op een Ubuntu x86_64-pc, implementeer het via SSH/SCP op RK3576 en voer het officiële C++-voorbeeld uit.
Snelstart: LLM-modellen uitvoeren op RK3576
| Onderdeel | Omgeving van deze verificatie |
|---|---|
| PC | Ubuntu 20.04.6 LTS, x86_64, Python 3.11, NVIDIA GTX 1070 8 GB |
| Board | reComputer RK3576, Debian 12 / Armbian 26.05.0-trunk |
| Boardkernel | 6.1.115-vendor-seeed-rk3576 |
| RKNPU-stuurprogramma | v0.9.8 |
| SDK | RKLLM-Toolkit / Runtime 1.3.0, repositorycommit 878f936 |
| Voorbeeldaccount en -adres | BOARD_USER@BOARD_IP |
Uitvoeren in de lokale terminal van het board:
sudo apt update
sudo apt install -y openssh-server git
sudo systemctl enable --now sshUitvoeren op de pc:
sudo apt update
sudo apt install -y git wget openssh-client
ssh BOARD_USER@BOARD_IP#1. Een ontbrekend RKNPU-stuurprogramma oplossen
Uitvoeren op het board:
uname -m
uname -r
mountpoint -q /sys/kernel/debug || sudo mount -t debugfs debugfs /sys/kernel/debug
sudo cat /sys/kernel/debug/rknpu/version
sudo cat /sys/kernel/debug/rknpu/load
grep "^CONFIG_ROCKCHIP_RKNPU=" /boot/config-$(uname -r)
sudo dmesg | grep -i rknpu | tail -n 20
for node in /sys/class/drm/renderD*; do
printf '%s -> ' "$node"
readlink -f "$node/device/driver"
doneFragment uit de werkelijke uitvoer van het board:
RKNPU driver: v0.9.8
NPU load: Core0: 0%, Core1: 0%
/sys/class/drm/renderD129 -> /sys/bus/platform/drivers/RKNPU
CONFIG_ROCKCHIP_RKNPU=yrenderD129 is het knooppunt op dit board, geen vast nummer. SDK 1.3.0 vereist stuurprogramma v0.9.8 of nieuwer; CONFIG_ROCKCHIP_RKNPU=y betekent dat het in de kernel is ingebouwd, dus afwezigheid in lsmod is normaal. Als het versiebestand ontbreekt, controleer dan ook dmesg en de stuurprogrammakoppeling.
Controleer op het hier gebruikte reComputer RK3576 Seeed/Armbian Debian-systeem eerst de bijbehorende kernel- en device-tree-pakketten:
sudo apt update
apt-cache policy linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576Controleer of de kandidaatversies van beide pakketten uit de pakketbron van dit board komen. Installeer of herinstalleer daarna de juiste pakketten als het stuurprogramma ontbreekt of ouder is dan 0.9.8:
sudo apt install --reinstall linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576
sudo reboot#2. RKLLM Runtime en RKLLM-Toolkit installeren en controleren
| Component | Installatielocatie | Functie |
|---|---|---|
| RKNPU-kernelstuurprogramma | Boardkernel | Toegang tot de NPU-hardware |
RKLLM Runtime librkllmrt.so | Board aarch64 | .rkllm laden en een C/C++-inferentie-API bieden |
RKLLM-Toolkit rkllm_toolkit | Ubuntu x86_64-pc | .rkllm converteren, kwantiseren en exporteren |
#2.1 Op beide apparaten dezelfde SDK-versie ophalen
Uitvoeren op de pc:
mkdir -p ~/RKLLM_Project
cd ~/RKLLM_Project
git clone --branch release-v1.3.0 --depth 1 https://github.com/airockchip/rknn-llm.gitUitvoeren op het board: Dit voorbeeld haalt alleen de bestanden op die nodig zijn om te bouwen en uit te voeren, zodat het board minder opslag gebruikt.
mkdir -p ~/RKLLM_Project
cd ~/RKLLM_Project
git clone --filter=blob:none --sparse --depth 1 --branch release-v1.3.0 \
https://github.com/airockchip/rknn-llm.git
cd rknn-llm
git sparse-checkout set examples/rkllm_api_demo/deploy rkllm-runtime/Linux#2.2 Runtime op het board controleren
Uitvoeren op het board:
cd ~/RKLLM_Project/rknn-llm
file rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so
ldd rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.sofile moet AArch64 ELF tonen en ldd mag geen not found melden. Runtime vereist geen pip install. Bij het bouwen van het voorbeeld in sectie 4 kopieert CMake de overeenkomende librkllmrt.so naar lib/ in de implementatiemap; stel LD_LIBRARY_PATH in vóór het uitvoeren. Op dit board vond ldd afhankelijkheden zoals libgomp.so.1. Als je uitvoer not found bevat, installeer dan eerst de ontbrekende bibliotheken op het board.
#2.3 Toolkit op de pc installeren
Het volgende voorbeeld gebruikt Ubuntu x86_64 en Python 3.11 in een geïsoleerde Conda-omgeving. Als Miniforge al is geïnstalleerd, begin dan bij de regel source.
Uitvoeren op de pc:
cd ~/RKLLM_Project
wget -O Miniforge3-Linux-x86_64.sh \
https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p "$HOME/miniforge3"
source "$HOME/miniforge3/etc/profile.d/conda.sh"
conda create -n rkllm-1.3.0 python=3.11 -y
conda activate rkllm-1.3.0
python -m pip install --upgrade pip
python -m pip install ./rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-1.3.0-cp311-cp311-linux_x86_64.whl
python -m pip install huggingface_hub
python -m pip check
python -c 'from rkllm.api import RKLLM; print("RKLLM-Toolkit import OK")'
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
python -c 'import torch; print("CUDA available:", torch.cuda.is_available())'In de wheel-bestandsnaam staat cp311 voor Python 3.11 en linux_x86_64 voor de pc-architectuur; installeer dit wheel niet op het board. Deze test gebruikte een bestaande ~/miniconda3-installatie en gaf No broken requirements found., RKLLM-Toolkit import OK en CUDA available: True. De bovenstaande opdrachten voor een nieuwe installatie gebruiken Miniforge. Sectie 3 vereist ook een werkend NVIDIA-stuurprogramma op de pc.
#3. Het LLM-model op een Ubuntu-pc converteren
#3.1 Het originele model downloaden
Uitvoeren op de pc:
source "$HOME/miniforge3/etc/profile.d/conda.sh"
conda activate rkllm-1.3.0
mkdir -p ~/RKLLM_Project/models
hf download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B \
config.json tokenizer.json tokenizer_config.json generation_config.json model.safetensors \
--local-dir ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B
ls -lh ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B/model.safetensorsHier wordt het originele Hugging Face-model gedownload; dat kan niet rechtstreeks aan Runtime op het board worden gegeven. De conversie gebruikt data_quant.json uit de officiële voorbeeldmap als demonstratiekalibratieset; vervang deze voor productie door vraag-en-antwoordgegevens die de doelsituaties vertegenwoordigen.
#3.2 Het RK3576-model genereren
Uitvoeren op de pc: Deze test gebruikte een CUDA-omgeving met NVIDIA GTX 1070. Maak het conversiescript met de volgende parameters.
cat > ~/RKLLM_Project/convert_rk3576.py <<'PY'
from pathlib import Path
from rkllm.api import RKLLM
root = Path.home() / 'RKLLM_Project'
model = root / 'models/DeepSeek-R1-Distill-Qwen-1.5B'
dataset = root / 'rknn-llm/examples/rkllm_api_demo/export/data_quant.json'
output = root / 'models/DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllm'
llm = RKLLM()
ret = llm.load_huggingface(model=str(model), model_lora=None,
device='cuda', dtype='float16',
custom_config=None, load_weight=True)
if ret != 0:
raise RuntimeError(f'load_huggingface failed: {ret}')
ret = llm.build(do_quantization=True, optimization_level=1,
quantized_dtype='W4A16', quantized_algorithm='normal',
target_platform='RK3576', num_npu_core=2,
extra_qparams=None, dataset=str(dataset),
hybrid_rate=0, max_context=4096)
if ret != 0:
raise RuntimeError(f'build failed: {ret}')
ret = llm.export_rkllm(str(output))
if ret != 0:
raise RuntimeError(f'export_rkllm failed: {ret}')
print(output)
PY
python ~/RKLLM_Project/convert_rk3576.py
ls -lh ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllmRK3576 gebruikt W4A16-kwantisatie, het algoritme normal en 2 NPU-kernen; deze combinatie wordt ondersteund op dit platform. max_context=4096 komt overeen met het latere uitvoerargument. De conversie op de pc slaagde en leverde een W4A16-model van ongeveer 1.4 GB op. Plaats het modelbestand op het bijbehorende RK3576-board.
#4. Het C++-voorbeeld op het board implementeren en uitvoeren
#4.1 De officiële llm_demo op het board bouwen
Uitvoeren op het board: Gebruik de eigen aarch64-compiler van het board in plaats van het pc-crosscompilerpad dat vastligt in het officiële build-linux.sh.
sudo apt update
sudo apt install -y cmake g++ make
cd ~/RKLLM_Project/rknn-llm
cmake -S examples/rkllm_api_demo/deploy \
-B examples/rkllm_api_demo/deploy/build/native \
-DCMAKE_BUILD_TYPE=Release
cmake --build examples/rkllm_api_demo/deploy/build/native -j2
cmake --install examples/rkllm_api_demo/deploy/build/native
ls -lh examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64/llm_demo \
examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64/lib/librkllmrt.so#4.2 Het model overzetten en uitvoeren
Uitvoeren op de pc:
scp ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllm \
BOARD_USER@BOARD_IP:~/RKLLM_Project/rknn-llm/examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64/
sha256sum ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllm
ssh BOARD_USER@BOARD_IPUitvoeren op het board:
cd ~/RKLLM_Project/rknn-llm/examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64
sha256sum ./DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllm
export LD_LIBRARY_PATH="$PWD/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
ldd ./llm_demo | grep -E 'librkllmrt|not found'
export RKLLM_LOG_LEVEL=1
./llm_demo ./DeepSeek-R1-Distill-Qwen-1.5B_W4A16_rk3576.rkllm 128 4096De SHA-256-waarden op pc en board moeten overeenkomen; in deze test waren beide ce4412147c33c78eb1364458757fbc607acc0ad3ed1fed5cf6894e91506d2051. Voer bij de prompt user: 1+1等于多少?请只回答数字。 in. Fragment uit de werkelijke RK3576-uitvoer:
rkllm init start
I rkllm: rkllm-runtime version: 1.3.0, rknpu driver version: 0.9.8, platform: RK3576
I rkllm: rkllm-toolkit version: 1.3.0, max_context_limit: 4096, npu_core_num: 2, target_platform: RK3576, model_dtype: W4A16
rkllm init success
...
1+1等于\boxed{2}De exacte formulering van het antwoord kan variëren. 128 is het maximale aantal gegenereerde tokens in deze sessie en 4096 is de contextlimiet; typ exit om te stoppen.
Als ldd not found toont, herstel dan eerst de ontbrekende gedeelde bibliotheek. Als initialisatie mislukt, controleer dan de stuurprogrammaversie, modelintegriteit, platformparameters en Toolkit/Runtime-versies. .rkllm-bestanden voor RK3576 en RK3588 zijn niet onderling uitwisselbaar.