Rockchip · AI & Linux Hub

KI-Inferenz

RKNN-Toolkit2 Python API V2.5.0 — Modellkonfiguration und Quantisierungsparameter

RKNN-Toolkit2 Python API V2.5.0 — Modellkonfiguration und Quantisierungsparameter | Vollständige Parameter, Beispiele und Plattformgrenzen

· ArmSoM · 9 Min. Lesezeit

Plattform und Quelle

Dieser Artikel basiert auf dem RKNN-V2.5.0-PDF des Herstellers und gilt nur für die dort genannten Chips und Schnittstellen. Bei ArmSoM-Boards zuerst SoC, NPU-Treiber, Toolkit/Runtime, SDK/BSP und Kernelversion prüfen. Eine ArmSoM-Hardwareprüfung wurde nicht durchgeführt; Beispiele und Messwerte stammen aus der Quelle, nicht aus ArmSoM-Tests.

Seriennavigation

3 API zur Modellkonfiguration

Vor dem Erstellen des RKNN-Modells dieses zunächst über config konfigurieren.

API config
Beschreibung Parameter für die Modellkonvertierung festlegen.
Parameter mean_values: Mittelwerte der Eingabe. Der Parameter ist eine Liste mit einer oder mehreren Mittelwert-Unterlisten. Bei mehreren Modelleingaben werden mehrere Unterlisten verwendet. Die Länge jeder Unterliste entspricht der Kanalzahl der Eingabe. Beispielsweise bedeutet [[128,128,128]], dass von den Werten aller drei Kanäle einer Eingabe jeweils 128 abgezogen wird.
Standardwert: None; alle Mittelwerte sind damit null.
Parameter std_values: Normalisierungswerte der Eingabe. Der Parameter ist eine Liste mit einer oder mehreren Unterlisten von Normalisierungswerten. Bei mehreren Eingaben werden mehrere Unterlisten verwendet. Die Länge jeder Unterliste entspricht der Kanalzahl der Eingabe. Beispielsweise bedeutet [[128,128,128]], dass von den Werten der drei Kanäle einer Eingabe zunächst der Mittelwert abgezogen und das Ergebnis anschließend durch 128 geteilt wird.
Standardwert: None; alle std-Werte sind damit eins.
Parameter quant_img_RGB2BGR: Gibt an, ob beim Laden eines Quantisierungsbildes zuerst RGB2BGR ausgeführt werden muss. Bei mehreren Eingaben werden die jeweiligen Parameter mit ‘,’ getrennt, etwa [True, True, False]. Standardwert: False.
Diese Einstellung wird meist für Caffe-Modelle verwendet. Beim Training der meisten Caffe-Modelle werden die Datensatzbilder zunächst mit RGB2BGR umgewandelt; in diesem Fall ist True einzustellen.
Die Einstellung gilt nur für Quantisierungsbilder im Format jpg/png/bmp. Beim Lesen von npy wird sie ignoriert. Wenn die Modelleingabe BGR verwendet, müssen daher auch die npy-Daten im BGR-Format vorliegen.
Die Einstellung wird nur zum Lesen der Bilder während der Quantisierung (Schnittstelle build) oder der Quantisierungsgenauigkeitsanalyse (accuracy_analysis) verwendet und nicht im endgültigen RKNN-Modell gespeichert. Bei einer BGR-Modelleingabe muss deshalb vor dem Aufruf von inference des Toolkits oder der run-Funktion der C-API sichergestellt sein, dass die importierten Bilddaten ebenfalls BGR verwenden.
Parameter quantized_dtype: Quantisierungstyp. Unterstützt werden “w8a8”, “w4a16”, “w8a16” und “w16a16i_dfp”. Standard: “w8a8”.
- w8a8: Gewichte und Aktivierungen werden asymmetrisch mit 8 Bit quantisiert. RK2118 wird nicht unterstützt.
- w4a16: Gewichte werden symmetrisch mit 4 Bit quantisiert; Aktivierungen verwenden 16-Bit-Gleitkommazahlen. Unterstützt werden Faltungen mit ‘group=1’ und konstanten Gewichten sowie MatMul mit konstanten Eingaben (automatische Umwandlung in äquivalente 1x1-Faltungen); andere Operatoren werden nicht unterstützt. Nur RK3576/RV1126B.
- w8a16: Asymmetrische 8-Bit-Gewichte und 16-Bit-Gleitkommaaktivierungen. Nur RK3562.
- w16a16i_dfp: Gewichte und Aktivierungen verwenden dynamische 16-Bit-Festkommaquantisierung. Nur RV1103/RV1106.
Parameter quantized_algorithm: Algorithmus zur Berechnung der Quantisierungsparameter jedes Layers. Unterstützt werden normal, mmse, kl_divergence und gdq. Standardwert: normal.
normal ist schnell. Empfohlen werden gewöhnlich etwa 20-100 Quantisierungsdaten; mehr Daten verbessern die Genauigkeit möglicherweise nicht weiter.
mmse ist wegen seines iterativen Durchprobierens langsamer, erreicht jedoch meist eine höhere Genauigkeit als normal. Empfohlen werden etwa 20-50 Daten. Je nach Quantisierungsdauer kann ihre Anzahl entsprechend erhöht oder verringert werden.
kl_divergence benötigt mehr Zeit als normal, aber deutlich weniger als mmse. In manchen Szenarien, etwa bei ungleichmäßiger Merkmalsverteilung, erzielt kl_divergence bessere Ergebnisse. Empfohlen werden etwa 20-100 Daten.
gdq gilt nur für w4a16 und w8a16 und kann deren Gewichtsgenauigkeit wirksam verbessern. Empfohlen werden mehr als 200 Daten.
Parameter quantized_method: Unterstützt werden layer, channel und group{SIZE}. Standardwert: channel.
- layer: Jedes Gewicht besitzt nur einen Satz Quantisierungsparameter.
- channel: Jeder Gewichtskanal besitzt einen eigenen Satz Quantisierungsparameter. channel ist meist genauer als layer.
- group{SIZE}: Aufbauend auf channel werden die Gewichte jedes Ausgabekanals entlang des Eingabekanals entsprechend {SIZE} in mehrere Gruppen unterteilt. Jede Gruppe besitzt einen Parametersatz. group{SIZE} ist gewöhnlich genauer als channel. {SIZE} ist ein Vielfaches von 32 zwischen 32 und 256, etwa ‘group32’ oder ‘group128’. group{SIZE} gilt derzeit nur bei quantized_dtype = w4a16.
Parameter float_dtype: Datentyp für Gleitkommadaten im nicht quantisierten Fall. Unterstützt wird float16. Standardwert: float16.
Parameter optimization_level: Optimierungsstufe des Modells. Standardwert: 3.
Damit lassen sich einige oder alle bei der Konvertierung verwendeten Optimierungsregeln deaktivieren. Bei 3 sind alle Optimierungen eingeschaltet. Bei 2 oder 1 werden einige Optionen deaktiviert, die die Genauigkeit bestimmter Modelle beeinflussen können. Bei 0 werden alle Optimierungen ausgeschaltet.
Parameter target_platform: Zielchip des RKNN-Modells: ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk2118’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’, ‘rk3588’. Die Signatur verwendet None als Standard, doch None ist kein gültiger Konfigurationswert. Der Parameter muss beim Aufruf von config gesetzt werden.
Parameter custom_string: Fügt dem RKNN-Modell eine benutzerdefinierte Zeichenfolge hinzu, die zur Laufzeit abgefragt werden kann. Standardwert: None.
Parameter remove_weight: Entfernt die Gewichte, um ein untergeordnetes RKNN-Modell zu erzeugen, das die Gewichte mit dem vollständigen RKNN-Modell teilen kann. Dies reduziert den Speicherverbrauch. Standardwert: False.
Parameter compress_weight: Komprimiert die Modellgewichte und kann dadurch die Größe des RKNN-Modells reduzieren. Standardwert: False.
Parameter single_core_mode: Gibt an, ob nur ein Einkernmodell erzeugt werden soll. Dies kann Modellgröße und Speicherverbrauch reduzieren. Standardwert: False. Gilt nur für RK3588 / RK3576. Standardwert: False.
Parameter model_pruning: Beschneidet das Modell. Bei Modellen mit dünn besetzten Gewichten können dadurch Größe und Rechenaufwand des konvertierten RKNN-Modells reduziert werden. Standardwert: False.
Parameter op_target: Legt das Ausführungsziel jeder Operation fest (NPU/CPU/GPU usw.). Format: {‘op0_output_name’:’cpu’, ‘op1_output_name’:’cpu’, …}; alternativ über op_type: {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. Beide Verfahren lassen sich kombinieren, beispielsweise {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. Standardwert: None.
‘op0_output_name’ und ‘op1_output_name’ sind die Ausgabetensornamen der jeweiligen OP und können den Ergebnissen von accuracy_analysis entnommen werden. ‘cpu’ und ‘npu’ bedeuten, dass die zu diesem Tensor gehörige OP auf CPU bzw. NPU ausgeführt wird. Verfügbar sind ‘cpu’ / ‘npu’ / ‘gpu’ / ‘auto’; ‘auto’ wählt das Ziel automatisch.
Auch op_type wird aus den Ergebnissen von accuracy_analysis ermittelt. Damit kann das Ausführungsziel aller OP dieses Typs im Modell eingestellt werden, etwa {‘Add’:’cpu’, ‘Expand’:’cpu’,….}.
Parameter dynamic_input: Simuliert dynamische Eingaben anhand mehrerer vom Benutzer vorgegebener Eingabeform-Sätze. Format: [[input0_shapeA, input1_shapeA, …], [input0_shapeB, input1_shapeB, …], …].
Standardwert: None; experimentell.
Beispielsweise lautet die ursprüngliche Eingabeform [1,3,224,224], [1,3,height,width] oder [1,3,-1,-1], das bereitzustellende Modell muss jedoch drei Formen unterstützen: [1,3,224,224], [1,3,192,192] und [1,3,160,160]. Dafür kann dynamic_input=[[[1,3,224,224]], [[1,3,192,192]], [[1,3,160,160]]] gesetzt werden. Bei der Inferenz mit dem konvertierten RKNN-Modell müssen Daten der entsprechenden Form übergeben werden.
Hinweise:
1. Die Funktion kann nur aktiviert werden, wenn das ursprüngliche Modell selbst dynamische Eingaben unterstützt; andernfalls entsteht ein Fehler.
2. Ist die ursprüngliche Eingabeform dynamisch, dürfen unterschiedliche Werte nur für dynamische Achsen gesetzt werden.
Parameter quantize_weight: Wenn ‘do_quantization’ von rknn.build False ist, wird die Größe des rknn-Modells durch Quantisierung einiger Gewichte reduziert.
Standardwert: False.
Parameter remove_reshape: Entfernt mögliche ‘Reshape’ an Modelleingängen und -ausgängen, um die Laufzeitleistung zu verbessern. Standardwert: False.
Hinweis: Dies kann die Form der Eingabe- oder Ausgabeknoten verändern. Beachten Sie die Warnmeldungen während der Konvertierung und berücksichtigen Sie die Auswirkungen der Formänderungen bei der Bereitstellung.
Parameter sparse_infer: Führt zur Leistungssteigerung eine dünn besetzte Inferenz auf bereits ausgedünnten Modellen aus. Gilt nur für RK3576/RV1126B. Standardwert: False.
Parameter enable_flash_attention: Gibt an, ob Flash Attention aktiviert werden soll. Standardwert: False.
Hinweis: FlashAttention basiert auf https://arxiv.org/abs/2307.08691. Durch die Cache-Nutzung innerhalb der Schleife lassen sich Beschleunigung und geringerer Bandbreitenbedarf erreichen. Die Modellgröße kann dabei jedoch steigen. Entscheiden Sie anhand des jeweiligen Szenarios und Modells. Weitere Details stehen bei ‘exSDPAttention’ in ‘RKNN Compiler Support Operator List’.
Parameter auto_hybrid_cos_thresh: Schwellenwert des Kosinusabstands bei der automatischen gemischten Modellquantisierung. Standardwert: 0.98.
Parameter auto_hybrid_euc_thresh: Schwellenwert des euklidischen Abstands bei der automatischen gemischten Modellquantisierung. Standardwert: None, also nicht aktiviert.
Parameter memory_plan_strategy: Verfahren zur Zuweisung des internen Speichers beim Kompilieren des RKNN-Modells; beeinflusst den Speicherbedarf während der Inferenz. Optionen: “BestFit”, “GreedyBySize”, “GreedyByLifetime”, “SlowPeakGrowth”. Standard: “BestFit”.
BestFit — Aufgaben nach Startzeit sortieren; bei gleicher Startzeit hat die Aufgabe mit dem größten Speicherbedarf Vorrang. Adressen nacheinander zuweisen und unter den freien Blöcken im bereits zugewiesenen Adressraum den größenmäßig passendsten Block wählen.
GreedyBySize — Aufgaben nach Speicherbedarf sortieren; bei gleicher Größe hat die frühere Startzeit Vorrang. Nacheinander zuweisen und einen freien Block mit möglichst passender Größe im bereits zugewiesenen Adressraum suchen.
GreedyByLifetime — nach Startzeit sortieren, bei Gleichstand größere Aufgaben zuerst. Endadressen zugewiesener Blöcke und Adresse 0 als Kandidaten sammeln. Einen Kandidaten mit längster Lebensdauer ohne Konflikt im unteren Bereich wählen; bis zum Abschluss wiederholen.
SlowPeakGrowth — nach Startzeit sortieren, bei Gleichstand größere Aufgaben zuerst. Endadressen zugewiesener Blöcke und Adresse 0 sammeln. Die Aufgabe mit dem kleinsten Wachstum des Spitzenspeicherbedarfs und einen konfliktfreien Kandidaten im unteren Bereich wählen; bis zum Abschluss wiederholen.
Parameter compute_order: Topologische Reihenfolge des Graphen während der RKNN-Inferenz. Beeinflusst den internen Speicherbedarf bestimmter Modelle, insbesondere mit mehreren Zweigen. Optionen “WidthFirst” und “DepthFirst”; Standard “WidthFirst”.
Rückgabewert 0: Konfiguration erfolgreich.
Bei ungültiger Konfiguration wird ValueError ausgelöst.

Beispielcode:

# model config
rknn.config(mean_values=[[103.94, 116.78, 123.68]],
           std_values=[[58.82, 58.82, 58.82]],
           quant_img_RGB2BGR=True,
           target_platform='rk3566')

Quelle und redaktionelle Hinweise

Technische Kapitel sind nach Anwendung aufgeteilt. Code, Bezeichner und Parameter bleiben erhalten. Chinesisch folgt der chinesischen Quelle, Englisch, Russisch und Deutsch der englischen. Für Kapitel ohne Abbildungen wurden keine erfundenen Bilder hinzugefügt.

Redaktionelle Hinweise: Protokolle mit SDK 1.5.2 bleiben historische Beispiele, keine V2.5.0-Messungen. Die Python-Zelle für Ubuntu20.04 unterscheidet sich: chinesisch 3.8/3.9, englisch 3.8/3.8; ebenso für Debian11; im ARM64-Abschnitt ist Debian weiterhin als x64 bezeichnet. Quellwerte bleiben erhalten; tatsächliches Installationspaket prüfen. V2.5.0 ergänzt C++ codegen und präzisiert Quantisierung und Speicherstrategien; alte Parameter ersetzen nicht die neue Quelle.

RKNN-Toolkit2 · ArmSoM documentation

Dieses Thema entdecken → · Lernpfade →