Exécuter des modèles LLM sur RK3588

Convertissez DeepSeek-R1-Distill-Qwen-1.5B au format RKLLM sur un PC Ubuntu x86_64, déployez-le sur RK3588 via SSH/SCP et lancez l’exemple C++ officiel.


Démarrage rapide : exécuter des modèles LLM sur RK3588

ÉlémentEnvironnement utilisé pour cette vérification
PCUbuntu 20.04.6 LTS, x86_64, Python 3.11, NVIDIA GTX 1070 8 GB
CartereComputer RK3588, Debian 12 / Armbian 26.08.0-trunk
Noyau de la carte6.1.115-vendor-seeed-rk3588
Pilote RKNPUv0.9.8
SDKRKLLM-Toolkit / Runtime 1.3.0, commit du dépôt 878f936
Compte et adresse d’exempleBOARD_USER@BOARD_IP

À exécuter dans le terminal local de la carte :

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

À exécuter sur le PC :

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

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

Extrait de la sortie réelle de la carte :

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 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 RK3588 utilisé ici, inspectez d’abord les paquets correspondants du noyau et de l’arbre de périphériques :

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

Aprè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 :

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

#2. Installer et vérifier RKLLM Runtime et RKLLM-Toolkit

ComposantEmplacementFonction
Pilote du noyau RKNPUNoyau de la carteAccéder au matériel NPU
RKLLM Runtime librkllmrt.soCarte aarch64Charger .rkllm et fournir une API d’inférence C/C++
RKLLM-Toolkit rkllm_toolkitPC Ubuntu x86_64Convertir, quantifier et exporter .rkllm

#2.1 Obtenir la même version du SDK sur les deux appareils

À exécuter sur le 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

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

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 Vérifier Runtime sur la carte

À exécuter sur la carte :

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

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())'

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 :

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

Vous 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 RK3588

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

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 utilise la quantification W8A8, l’algorithme normal et 3 cœurs NPU ; c’est la combinaison de l’exemple officiel. max_context=4096 correspond à l’argument d’exécution ci-dessous. La conversion sur PC a réussi et produit un modèle W8A8 d’environ 2.0 GB. Placez le fichier sur la carte RK3588 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.

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 Transférer et exécuter le modèle

À exécuter sur le 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

À exécuter sur la carte :

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

Les valeurs SHA-256 du PC et de la carte doivent correspondre ; elles étaient toutes deux 95fb13cf8287c2fa0e6338c550b0ceeea9eb2dfe752c55a2d0b519035bff78ee dans ce test. À l’invite user:, saisissez 1+1等于多少?请只回答数字。. Extrait de la sortie réelle du RK3588 :

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}\)。

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.

#Références