Exécuter des modèles LLM sur RK3576
Convertissez DeepSeek-R1-Distill-Qwen-1.5B au format RKLLM sur un PC Ubuntu x86_64, déployez-le sur RK3576 via SSH/SCP et lancez l’exemple C++ officiel.
Démarrage rapide : exécuter des modèles LLM sur RK3576
| Élément | Environnement utilisé pour cette vérification |
|---|---|
| PC | Ubuntu 20.04.6 LTS, x86_64, Python 3.11, NVIDIA GTX 1070 8 GB |
| Carte | reComputer RK3576, Debian 12 / Armbian 26.05.0-trunk |
| Noyau de la carte | 6.1.115-vendor-seeed-rk3576 |
| Pilote RKNPU | v0.9.8 |
| SDK | RKLLM-Toolkit / Runtime 1.3.0, commit du dépôt 878f936 |
| Compte et adresse d’exemple | BOARD_USER@BOARD_IP |
À exécuter dans le terminal local de la carte :
sudo apt update
sudo apt install -y openssh-server git
sudo systemctl enable --now sshÀ exécuter sur le PC :
sudo apt update
sudo apt install -y git wget openssh-client
ssh BOARD_USER@BOARD_IP#1. Résoudre l’absence du pilote RKNPU
À exécuter sur la carte :
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"
doneExtrait de la sortie réelle de la carte :
RKNPU driver: v0.9.8
NPU load: Core0: 0%, Core1: 0%
/sys/class/drm/renderD129 -> /sys/bus/platform/drivers/RKNPU
CONFIG_ROCKCHIP_RKNPU=yrenderD129 est le nœud de cette carte, pas un numéro fixe. Le SDK 1.3.0 exige un pilote v0.9.8 ou plus récent ; CONFIG_ROCKCHIP_RKNPU=y indique qu’il est intégré au noyau, donc son absence de lsmod est normale. Si le fichier de version manque, vérifiez aussi dmesg et la liaison du pilote.
Sur le système Debian Seeed/Armbian du reComputer RK3576 utilisé ici, inspectez d’abord les paquets correspondants du noyau et de l’arbre de périphériques :
sudo apt update
apt-cache policy linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576Après avoir confirmé que les versions candidates des deux paquets proviennent du dépôt de cette carte, installez ou réinstallez les paquets adaptés si le pilote manque ou est antérieur à 0.9.8 :
sudo apt install --reinstall linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576
sudo reboot#2. Installer et vérifier RKLLM Runtime et RKLLM-Toolkit
| Composant | Emplacement | Fonction |
|---|---|---|
| Pilote du noyau RKNPU | Noyau de la carte | Accéder au matériel NPU |
RKLLM Runtime librkllmrt.so | Carte aarch64 | Charger .rkllm et fournir une API d’inférence C/C++ |
RKLLM-Toolkit rkllm_toolkit | PC Ubuntu x86_64 | Convertir, quantifier et exporter .rkllm |
#2.1 Obtenir la même version du SDK sur les deux appareils
À exécuter sur le PC :
mkdir -p ~/RKLLM_Project
cd ~/RKLLM_Project
git clone --branch release-v1.3.0 --depth 1 https://github.com/airockchip/rknn-llm.gitÀ exécuter sur la carte : Cet exemple ne récupère que les fichiers nécessaires à la compilation et à l’exécution pour économiser l’espace de la carte.
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 Vérifier Runtime sur la carte
À exécuter sur la carte :
cd ~/RKLLM_Project/rknn-llm
file rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so
ldd rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.sofile doit indiquer un fichier AArch64 ELF et ldd ne doit pas afficher not found. Runtime ne nécessite pas pip install. Lors de la compilation de l’exemple à la section 4, CMake copie le même librkllmrt.so dans le répertoire de déploiement lib/ ; définissez LD_LIBRARY_PATH avant l’exécution. Sur cette carte, ldd a trouvé des dépendances comme libgomp.so.1. Si votre sortie indique not found, installez d’abord les bibliothèques manquantes sur la carte.
#2.3 Installer Toolkit sur le PC
L’exemple suivant utilise Ubuntu x86_64 et Python 3.11 dans un environnement Conda isolé. Si Miniforge est déjà installé, commencez à la ligne source.
À exécuter sur le 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())'Dans le nom de la roue, cp311 désigne Python 3.11 et linux_x86_64 l’architecture du PC ; n’installez pas cette roue sur la carte. Ce test utilisait une installation ~/miniconda3 existante et a produit No broken requirements found., RKLLM-Toolkit import OK et CUDA available: True. Les commandes d’installation initiale ci-dessus utilisent Miniforge. La section 3 exige également un pilote NVIDIA fonctionnel sur le PC.
#3. Convertir le modèle LLM sur un PC Ubuntu
#3.1 Télécharger le modèle d’origine
À exécuter sur le 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.safetensorsVous téléchargez ici le modèle Hugging Face d’origine, qui ne peut pas être transmis directement à Runtime sur la carte. La conversion utilise data_quant.json du répertoire d’exemple officiel comme jeu d’étalonnage de démonstration ; en production, remplacez-le par des questions-réponses représentatives des usages visés.
#3.2 Générer le modèle RK3576
À exécuter sur le PC : Ce test utilisait un environnement CUDA avec une NVIDIA GTX 1070. Créez le script de conversion avec les paramètres suivants.
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 utilise la quantification W4A16, l’algorithme normal et 2 cœurs NPU ; cette combinaison est prise en charge par la plateforme. max_context=4096 correspond à l’argument d’exécution ci-dessous. La conversion sur PC a réussi et produit un modèle W4A16 d’environ 1.4 GB. Placez le fichier sur la carte RK3576 correspondante.
#4. Déployer et exécuter l’exemple C++ sur la carte
#4.1 Compiler le llm_demo officiel sur la carte
À exécuter sur la carte : Utilisez le compilateur aarch64 natif de la carte plutôt que le chemin du compilateur croisé PC fixé dans le build-linux.sh officiel.
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 Transférer et exécuter le modèle
À exécuter sur le 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_IPÀ exécuter sur la carte :
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 4096Les valeurs SHA-256 du PC et de la carte doivent correspondre ; elles étaient toutes deux ce4412147c33c78eb1364458757fbc607acc0ad3ed1fed5cf6894e91506d2051 dans ce test. À l’invite user:, saisissez 1+1等于多少?请只回答数字。. Extrait de la sortie réelle du RK3576 :
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}La formulation exacte de la réponse peut varier. 128 est le nombre maximal de tokens générés pour cette exécution et 4096 la limite de contexte ; saisissez exit pour quitter.
Si ldd affiche not found, corrigez d’abord la bibliothèque partagée manquante. Si l’initialisation échoue, vérifiez la version du pilote, l’intégrité du modèle, les paramètres de plateforme et les versions Toolkit/Runtime. Les fichiers .rkllm de RK3576 et RK3588 ne sont pas interchangeables.