🛠 Exploiter le NPU 6 TOPS avec le SDK RKNN
Objectifs
Déployer un modèle de vision sur le NPU 6 TOPS (INT4/INT8/INT16/FP16 mixte) du RK3588 avec le SDK RKNN de Rockchip : convertir un modèle (ONNX/TF/PyTorch) en .rknn sur un PC x86_64, puis l'exécuter sur la carte avec le runtime rknn-lite. Attention à la bifurcation vendor/mainline : le NPU (comme MPP/RGA et le blob Mali fermé) vit sur les images vendor BSP 5.10 (Debian 11 / Ubuntu 22.04 / Orange Pi OS) ; sous Armbian mainline, le NPU n'est pas exploitable — basculer sur l'image vendor pour ce tuto.
Matériel
- Orange Pi 5 Plus sous image vendor (le wiki documente l'installation ; NPU listé sur la page produit)
- PC x86_64 Linux pour la conversion (rknn-toolkit2 : github.com/airockchip/rknn-toolkit2)
- Alimentation 5 V / 4 A ; caméra MIPI CSI ou images de test
Code complet
# --- Sur le PC x86_64 : conversion du modèle (Python 3.8-3.10 requis) ---
# git clone https://github.com/airockchip/rknn-toolkit2
# pip install rknn-toolkit2/rknn-toolkit2/packages/rknn_toolkit2-*.whl # wheel selon version
python3 convert.py # exemple : ONNX -> RKNN, quantification INT8 sur jeu d'images
# --- Sur l'Orange Pi 5 Plus (image vendor ARM64) ---
sudo apt install -y python3-pip
pip3 install rknn_toolkit_lite2/rknn_toolkit_lite2/packages/rknn_toolkit_lite2-*.whl
scp model.rknn orangepi@<ip-de-la-carte>:~/
#!/usr/bin/env python3
"""Inférence NPU avec rknn-lite2 (API du SDK airockchip/rknn-toolkit2)."""
import numpy as np
from rknnlite.api import RKNNLite
rknn = RKNNLite
assert rknn.load_rknn("model.rknn") == 0
# Utiliser les 3 cœurs NPU ; CORE_0 seul pour laisser du marge
assert rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2) == 0
input_name = rknn.get_input_name(0)[0]
img = np.zeros((224, 224, 3), dtype=np.uint8) # remplacer par la vraie image
outputs = rknn.inference(inputs=[img])
print("Sortie :", np.asarray(outputs[0]).shape)
rknn.release
Vérification attendue
La conversion sur PC produit model.rknn sans erreur ; sur la carte, init_runtime renvoie 0 (le runtime a ouvert /dev/rga et le device NPU) et inference imprime la forme du tenseur de sortie. Les exemples du dépôt rknn-toolkit2 (ex. mobilenet, yolov5) affichent classes et scores ; le NPU apparaît dans ls /dev/ | grep rknpu sur les images vendor.
Erreurs fréquentes
- Essayer sous Armbian mainline : pas de driver NPU ni de blob ; revenir à l'image vendor BSP 5.10 pour le RKNN (panfrost/codecs stateless ne couvrent pas le NPU).
- Incompatibilité de versions : le wheel rknn-toolkit2 (conversion PC) et rknn_toolkit_lite2 (carte) doivent correspondre à la même version du SDK.
- Incompatibilité Python : les wheels visent des versions précises (3.8–3.10 selon le SDK) ; vérifier
python3 --versionavant pip install. - > CPU avec les 4 à 32 Go de RAM.
Autres tutoriels pour cette carte
- Allumer une LED via le GPIO 40 broches (libgpiod)
- Lire un bouton poussoir et afficher dans la console
- Premier script Python : fiche signalétique de la carte et LED
- Variation d'intensité d'une LED avec PWM (sysfs pwm)
- Lire un capteur I2C (BMP280) depuis le bus du connecteur
- Exploiter le double Ethernet 2,5 GbE et sécuriser le SSH
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash