LLM-modellen uitvoeren op RK3588

Converteer DeepSeek-R1-Distill-Qwen-1.5B naar RKLLM op een Ubuntu x86_64-pc, implementeer het via SSH/SCP op RK3588 en voer het officiële C++-voorbeeld uit.


Snelstart: LLM-modellen uitvoeren op RK3588

OnderdeelOmgeving van deze verificatie
PCUbuntu 20.04.6 LTS, x86_64, Python 3.11, NVIDIA GTX 1070 8 GB
BoardreComputer RK3588, Debian 12 / Armbian 26.08.0-trunk
Boardkernel6.1.115-vendor-seeed-rk3588
RKNPU-stuurprogrammav0.9.8
SDKRKLLM-Toolkit / Runtime 1.3.0, repositorycommit 878f936
Voorbeeldaccount en -adresBOARD_USER@BOARD_IP

Uitvoeren in de lokale terminal van het board:

bash
sudo apt update
sudo apt install -y openssh-server git
sudo systemctl enable --now ssh

Uitvoeren op de pc:

bash
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:

bash
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"
done

Fragment uit de werkelijke uitvoer van het board:

text
RKNPU driver: v0.9.8
NPU load:  Core0:  0%, Core1:  0%, Core2:  0%
/sys/class/drm/renderD130 -> /sys/bus/platform/drivers/RKNPU
CONFIG_ROCKCHIP_RKNPU=y

renderD130 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 RK3588 Seeed/Armbian Debian-systeem eerst de bijbehorende kernel- en device-tree-pakketten:

bash
sudo apt update
apt-cache policy linux-image-vendor-seeed-rk3588 linux-dtb-vendor-seeed-rk3588

Controleer 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:

bash
sudo apt install --reinstall linux-image-vendor-seeed-rk3588 linux-dtb-vendor-seeed-rk3588
sudo reboot

#2. RKLLM Runtime en RKLLM-Toolkit installeren en controleren

ComponentInstallatielocatieFunctie
RKNPU-kernelstuurprogrammaBoardkernelToegang tot de NPU-hardware
RKLLM Runtime librkllmrt.soBoard aarch64.rkllm laden en een C/C++-inferentie-API bieden
RKLLM-Toolkit rkllm_toolkitUbuntu x86_64-pc.rkllm converteren, kwantiseren en exporteren

#2.1 Op beide apparaten dezelfde SDK-versie ophalen

Uitvoeren op de pc:

bash
mkdir -p ~/RKLLM_Project
cd ~/RKLLM_Project
git clone --branch release-v1.3.0 --depth 1 https://github.com/airockchip/rknn-llm.git

Uitvoeren 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.

bash
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:

bash
cd ~/RKLLM_Project/rknn-llm
file rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so
ldd rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so

file 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:

bash
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:

bash
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.safetensors

Hier 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 RK3588-model genereren

Uitvoeren op de pc: Deze test gebruikte een CUDA-omgeving met NVIDIA GTX 1070. Maak het conversiescript met de volgende parameters.

bash
cat > ~/RKLLM_Project/convert_rk3588.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_W8A8_rk3588.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='W8A8', quantized_algorithm='normal',
                target_platform='RK3588', num_npu_core=3,
                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_rk3588.py
ls -lh ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B_W8A8_rk3588.rkllm

RK3588 gebruikt W8A8-kwantisatie, het algoritme normal en 3 NPU-kernen; dit is de combinatie uit het officiële voorbeeld. max_context=4096 komt overeen met het latere uitvoerargument. De conversie op de pc slaagde en leverde een W8A8-model van ongeveer 2.0 GB op. Plaats het modelbestand op het bijbehorende RK3588-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.

bash
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:

bash
scp ~/RKLLM_Project/models/DeepSeek-R1-Distill-Qwen-1.5B_W8A8_rk3588.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_W8A8_rk3588.rkllm
ssh BOARD_USER@BOARD_IP

Uitvoeren op het board:

bash
cd ~/RKLLM_Project/rknn-llm/examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64
sha256sum ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_rk3588.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_W8A8_rk3588.rkllm 128 4096

De SHA-256-waarden op pc en board moeten overeenkomen; in deze test waren beide 95fb13cf8287c2fa0e6338c550b0ceeea9eb2dfe752c55a2d0b519035bff78ee. Voer bij de prompt user: 1+1等于多少?请只回答数字。 in. Fragment uit de werkelijke RK3588-uitvoer:

text
rkllm init start
I rkllm: rkllm-runtime version: 1.3.0, rknpu driver version: 0.9.8, platform: RK3588
I rkllm: rkllm-toolkit version: 1.3.0, max_context_limit: 4096, npu_core_num: 3, target_platform: RK3588, model_dtype: W8A8
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.

#Bronnen