Rockchip · AI & Linux Hub

KI-Inferenz

RKNN2 SDK V2.5.0 · Bereitstellung verschlüsselter Modelle

RKNN2 SDK V2.5.0 · Bereitstellung verschlüsselter Modelle · Vollständige Entwicklerhandbuchreihe

· ArmSoM Editorial · Rockchip source documentation · 5 Min. Lesezeit

Plattformreferenz nach dem Rockchip RKNN2 SDK Development Guide V2.5.0. Erfasst werden nur die im Original genannten SoCs sowie Linux-/Android-Runtime- und Toolkit-Kombinationen. Funktionen gelten unter den jeweiligen Chip-, SDK-, Treiber- und Kernelbedingungen und nicht automatisch für jedes ArmSoM-Board. Prüfen Sie vor der Bereitstellung BSP, NPU-Treiber, Runtime und Modellversion des konkreten Boards. Es erfolgte keine ArmSoM-Hardwarevalidierung; Protokolle, Leistungswerte und Beispiele stammen aus dem Original.

Quellen und Prüfung: Chinesisch folgt der chinesischen V2.5.0 (182 Seiten); Englisch, Russisch und Deutsch folgen der englischen V2.5.0 (208 Seiten). Quellenspezifische technische Angaben bleiben erhalten; Inhalte älterer Versionen werden nicht als neue Fakten dargestellt. Chinesische Abbildungen stammen aus dem chinesischen PDF, EN/RU/DE-Abbildungen aus dem englischen PDF einschließlich separat extrahierter Vektorflussdiagramme. Abschnitts- und Formelnummern bleiben erhalten. Einige Querverweise verwenden alte Kapitelnummern; Dynamic-Shape-Beispiele enthalten „1224+140=264“, TP_NORM-Aussagen widersprechen sich, und init()/rknn.val_perf() weichen von späteren API-Beschreibungen ab. Diese Quellenprobleme bleiben dokumentiert und sind vor Ausführung anhand der tatsächlichen V2.5.0-Header und API-Referenzen zu prüfen. Code und Parameter bleiben erhalten; PDF-Umbrüche und Tabellenfortsetzungen wurden bereinigt.

Rockchip RKNN2 SDK V2.5.0

RKNN2 SDK V2.5.0 · 18/22

1. Softwarestack und Grundbegriffe

2. Entwicklungsumgebung, Versionen und Board-Anbindung

3. Entwicklungsablauf und Schnittstellenwahl

4. Modellkonvertierung und ONNX-Bearbeitung

5. Quantisierung, hybride Quantisierung und QAT

6. Inferenz sowie Genauigkeits-, Leistungs- und Speicherbewertung

7. Runtime-Lebenszyklus, Layouts und Speicher

8. Zero-Copy-Schnittstellen und Ein-/Ausgabebedingungen

9. C-API-Bereitstellung und Codegenerierung

10. Python-Bereitstellung mit Toolkit Lite2

11. Matmul-API und Matrixlayouts

12. NPU-Mehrkernkonfiguration und Leistung

13. Modelle mit dynamischen Formen und Bereitstellung

14. Inferenz mit mehreren Batches

15. NPU-SRAM auf RK3588/RK3576

16. Cache-Kohärenz und Sparse-Inferenz

17. Benutzerdefinierte Operatoren: Python und C API

Bereitstellung verschlüsselter Modelle

19. Diagnose von Genauigkeitsproblemen

20. Leistungsanalyse und Netzwerkoptimierung

21. Speicheranalyse, gemeinsame Nutzung und Wiederverwendung

22. FAQ, Fehlerbehandlung und Referenzen

4.2.2 Verschlüsselte Modelle bereitstellen

Das RKNN-SDK unterstützt Offline-Modellverschlüsselung und Entschlüsselung zur Laufzeit.

Modellverschlüsselung ist nur ein Teil des Schutzes und verhindert Angriffe nicht vollständig. Direkten Zugriff Dritter möglichst vermeiden und den Schutz auf Systemebene verstärken.

Hinweis: Das ältere Verfahren rknn.export_encrypted_rknn_model()/crypt_level bleibt kompatibel, wird aber nicht mehr empfohlen. Das hier beschriebene hybride Verfahren verwenden.

Verwendet wird eine hybride Verschlüsselungsarchitektur:

AES-256-CTR: symmetrische Verschlüsselung des Modellkörpers, leistungsfähig und mit Entschlüsselung per wahlfreiem Zugriff; nur 256bit werden unterstützt.

RSA-OAEP: asymmetrischer Schutz des AES-Schlüssels für sichere Schlüsselverteilung.

Schlüsselsystem:

Key Typ Owner Purpose
Benutzerschlüssel Symmetrischer AES-256-Schlüssel Vom Benutzer erzeugt Modellkörper ver-/entschlüsseln
RK-Schlüsselpaar Asymmetrisches RSA-2048-Schlüsselpaar Von RK vorinstalliert Öffentlicher Schlüssel verschlüsselt den Benutzerschlüssel; der im Chip eingebaute private Schlüssel entschlüsselt ihn.

Format der verschlüsselten Datei:

Offset Length Content
0 – 63 64 Byte Unverschlüsselter RKNN-Dateiheader; RKCE-Verschlüsselungskennung an Offset 24–47.
64+ body Mit AES-256-CTR verschlüsselter Modellkörper

Schlüssel-Umschlag user_key_iv.enc: RKKE-Header (16 Byte) + RSA-OAEP(AES key ‖ AES IV).

4.2.2.1 VERSCHLÜSSELUNG AUF PC/SERVER

Konvertierungsskript, Beispiele und öffentlicher RK-Schlüssel befinden sich in rknpu2/examples/rknn_encrypt_demo im Projekt rknpu2.

Ein konvertiertes .rknn-Modell mit rknn_model_encrypt.py verschlüsseln:

python3 rknn_model_encrypt.py --model model.rknn \
                                --rk-pubkey rk_public_key.pem \
                                [--output-dir ./encrypted] \
                                [--aes-bits 256]

Ausgabedateien:

File Beschreibung
model.rknn Verschlüsseltes Modell: Klartext-RKNN-Header + RKCE-Kennung + AES-CTR-Chiffrat
model_key.bin RSA-OAEP-verschlüsselter Schlüssel-Umschlag mit RKKE-Header; zusammen mit dem Modell bereitstellen.

Rockchip stellt den öffentlichen Schlüssel rk_public_key.pem bereit. Ein damit verschlüsselter Benutzerschlüssel kann nur vom im Chip eingebauten privaten RSA-Schlüssel entschlüsselt werden.

4.2.2.2 VERSCHLÜSSELTE MODELLE AUF DEM BOARD LADEN

Zur Laufzeit wird der Schlüssel-Umschlag über rknn_init_extend.user_key übergeben; rknn_init() entschlüsselt intern. Der anschließende Inferenzablauf entspricht einem unverschlüsselten Modell. Laden ist über einen Dateipfad (size=0) oder einen Speicherpuffer möglich.

#include "rknn_api.h"

/* 1. Load the key envelope into memory */
size_t key_env_size = 0;
void* key_env = load_file("model_key.bin", &key_env_size);
if (!key_env) {
    printf("load key envelope failed!\n");
    return -1;
}

/* 2. Pass the key envelope via rknn_init_extend.user_key */
rknn_init_extend init_ext;
rknn_decrypt_key_mem key_mem;
memset(&init_ext, 0, sizeof(rknn_init_extend));
key_mem.key_data = key_env;
key_mem.key_size = (uint32_t)key_env_size;
init_ext.user_key = &key_mem;

/* 3. rknn_init decrypts internally; subsequent usage is the same as a plaintext
model */
rknn_context ctx = 0;
int ret = rknn_init(&ctx, (void*)"model.rknn", 0, 0, &init_ext);
if (ret < 0) {
    if (ret == RKNN_ERR_KEY_INVALID)
        printf("key envelope invalid / RSA unwrap failed\n");
    else if (ret == RKNN_ERR_DECRYPT_FAILED)
        printf("AES-CTR model body decryption failed\n");
    else if (ret == RKNN_ERR_SOC_BIND_FAILED)
        printf("current SoC is not in the bound platform list\n");
    memset(key_env, 0, key_env_size);
    free(key_env);
    return -1;
}

/* 4. The user-side key memory can be released after rknn_init returns */
memset(key_env, 0, key_env_size);
free(key_env);

/* 5. Proceed with the normal inference flow: rknn_query / rknn_inputs_set /
rknn_run / ... */

rknn_decrypt_key_mem und der über key_data referenzierte Puffer gehören dem Aufrufer. Die Runtime kopiert den Umschlag innerhalb von rknn_init(); danach kann er freigegeben werden. Vorher den Schlüsselspeicher möglichst mit memset auf 0 setzen, um das Risiko einer Schlüsseloffenlegung zu verringern.

Unterstützte Plattformen: RK3562/RK3566/RK3568/RK3576/RK3588/RV1126B/RV1106/RV1103B

4.2.2.3 KOMPATIBILITÄT VERSCHLÜSSELTER MODELLE MIT EXTERNER SPEICHERZUWEISUNG UND SPEICHERWIEDERVERWENDUNG

Bei Initialisierung sind verschlüsselte Modelle nur mit der Wiederverwendung extern zugewiesenen Internal-Speichers kompatibel. Mit RKNN_FLAG_INTERNAL_ALLOC_OUTSIDE initialisieren und Speicher über rknn_set_internal_mem() setzen. Mehrere Modelle können denselben Internal-Block wiederverwenden. Details siehe „Internal Memory Reuse“ in 5.3.3.

Verschlüsselte Modelle sind mit folgenden Funktionen inkompatibel:

Gemeinsame Gewichte: Initialisierung mit RKNN_FLAG_SHARE_WEIGHT_MEM wird nicht unterstützt.

Externe Gewichtsspeicherzuweisung: rknn_set_weight_mem() wird nicht unterstützt.

Kontextwiederverwendung: rknn_dup_context() wird nicht unterstützt.

Dieses Thema entdecken → · Lernpfade →