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
- Plattformen, Header und Linken
- Speicherbesitz und allgemeine/Zero-Copy-Abläufe
- Gerät, Kontext und Initialisierungsflags
- Modell-, Tensor- und dynamische Formabfragen
- Eingabe, Ausführung, Ausgabe und dynamische Formen
- Tensorspeicher zuweisen und synchronisieren
- Matrixmultiplikations-APIs und dynamische Formen
- Benutzerdefinierte Operatoren registrieren und abfragen
- Statuscodes, Tensoren, Speicher und Erweiterungstypen
- Strukturen zur Matrixmultiplikation
- Operatortypen und Migration veralteter APIs
5.3. Inferenz ausführen
Eingaben setzen, Inferenz ausführen, Ausgaben abrufen und dynamische Formen einstellen.
rknn_inputs_set
rknn_inputs_set setzt die Modelleingabedaten. Mehrere Eingaben werden unterstützt, jeweils als rknn_input-Objekt. Deren Felder sind vor Übergabe an rknn_inputs_set zu setzen. Auf RV1106/RV1103/RV1103B/RV1106B/RK2118 nicht verfügbar.
| API | rknn_inputs_set |
|---|---|
| Beschreibung | Setzt die Modelleingabedaten. |
| Parameter | rknn_context context: rknn_contex-Objekt (Quellschreibweise). |
| Parameter | uint32_t n_inputs: Anzahl der Eingaben. |
| Parameter | rknn_input inputs[]: Array von rknn_input. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
rknn_input inputs[1];
memset(inputs, 0, sizeof(inputs));
inputs[0].index = 0;
inputs[0].type = RKNN_TENSOR_UINT8;
inputs[0].size = img_width*img_height*img_channels;
inputs[0].fmt = RKNN_TENSOR_NHWC;
inputs[0].buf = in_data;
inputs[0].pass_through = 0;
ret = rknn_inputs_set(ctx, 1, inputs);
rknn_run
rknn_run führt eine Modellinferenz aus. Zuvor müssen die Eingabedaten über rknn_inputs_set oder die Zero-Copy-Schnittstelle konfiguriert werden.
| API | rknn_run |
|---|---|
| Beschreibung | Führt eine Modellinferenz aus. |
| Parameter | rknn_context context: rknn_contex-Objekt (Quellschreibweise). |
| Parameter | rknn_run_extend* extend: für Erweiterungen reserviert; im beschriebenen Stand ungenutzt, nur NULL zulässig. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
ret = rknn_run(ctx, NULL);
rknn_outputs_get
rknn_outputs_get ruft Modellausgaben ab. Mehrere Ausgaben sind möglich; jede ist ein rknn_output-Objekt, das vor dem Aufruf erzeugt und initialisiert werden muss. RV1106/RV1103/RV1106B/RV1103B/RK2118 werden nicht unterstützt.
Es gibt zwei Möglichkeiten, Puffer für Ausgabedaten bereitzustellen:
- Der Benutzer weist die Puffer selbst zu und gibt sie frei. Dann ist rknn_output.is_prealloc auf 1 zu setzen; rknn_output.buf zeigt auf den Benutzerpuffer.
- rknn weist den Speicher zu. Dann ist rknn_output.is_prealloc auf 0 zu setzen. Nach Ausführung wird rknn_output.buf mit den Ausgabedaten erstellt.
| API | rknn_outputs_get |
|---|---|
| Beschreibung | Ruft die Inferenz-Ausgabedaten ab. |
| Parameter | rknn_context context: rknn_context-Objekt. |
| Parameter | uint32_t n_outputs: Anzahl der Ausgaben. |
| Parameter | rknn_output outputs[]: Array von rknn_output. |
| Parameter | rknn_run_extend* extend: für Erweiterungen reserviert; derzeit ungenutzt, nur NULL zulässig. Typ quellengetreu beibehalten. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
rknn_output outputs[io_num.n_output];
memset(outputs, 0, sizeof(outputs));
for (int i = 0; i < io_num.n_output; i++) {
outputs[i].index = i;
outputs[i].is_prealloc = 0;
outputs[i].want_float = 1;
}
ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
rknn_outputs_release
rknn_outputs_release gibt die Ressourcen des rknn_output-Objekts frei.
| API | rknn_outputs_release |
|---|---|
| Beschreibung | Gibt das rknn_output-Objekt frei. |
| Parameter | rknn_context context: rknn_context-Objekt. |
| Parameter | uint32_t n_outputs: Anzahl der Ausgaben. |
| Parameter | rknn_output outputs[]: Array der freizugebenden rknn_output. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
ret = rknn_outputs_release(ctx, io_num.n_output, outputs);
rknn_set_input_shape (veraltet)
Diese Schnittstelle ist veraltet. Eingabeformen sind mit rknn_set_input_shapes zu binden. In der aktuellen Version ist die alte Schnittstelle nicht verfügbar. Für ihre weitere Nutzung sind SDK 1.5.0 und dessen Anleitung erforderlich.
rknn_set_input_shapes
Bei dynamischen RKNN-Eingabeformen muss die aktuelle Form vor der Inferenz gesetzt werden. Übergeben werden Eingabeanzahl und rknn_tensor_attr-Array mit Form und Layout. index, name, dims und fmt jedes Elements ausfüllen; andere Felder sind nicht erforderlich. Zuvor können mit rknn_query die Anzahl und die Liste unterstützter dynamischer Formen abgefragt werden. Die Eingabeform muss in dieser Liste enthalten sein. Beim ersten Lauf und jedem Formwechsel ist ein Aufruf erforderlich; ansonsten muss er nicht wiederholt werden.
| API | rknn_set_input_shapes |
|---|---|
| Beschreibung | Setzt die aktuell verwendete Modelleingabeform. |
| Parameter | rknn_context context: rknn_context-Objekt. |
| Parameter | uint32_t n_inputs: Anzahl der Eingabetensoren. |
| Parameter | rknn_tensor_attr *: Zeiger auf das Attributarray sämtlicher Eingabeformen. Für jede Eingabe sind index, name, dims, fmt und n_dims zu setzen; weitere Felder sind nicht erforderlich. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Codebeispiel:
for (int i = 0; i < io_num.n_input; i++) {
for (int j = 0; j < input_attrs[i].n_dims; ++j) {
input_attrs[i].dims[j] = dyn_range[i].dyn_range[0][j];
}
}
ret = rknn_set_input_shapes(ctx, io_num.n_input, input_attrs);
if (ret < 0) {
fprintf(stderr, "rknn_set_input_shapes error! ret=%d\n", ret);
return -1;
}
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.
Hinweise zur Quelle: Kapitelnummern und Beispielausgaben bleiben erhalten; ältere SDK-Versionen in Protokollen sind nicht die aktuelle Dokumentversion. Die Runtime-Quelle springt von Kapitel 3 zu 5 und wiederholt Abfragenummern. Die rknn_init-Tabelle bezeichnet extend als deaktiviert, spätere Typen beschreiben jedoch user_key und gemeinsame Gewichte. Der Text zur nativen dynamischen Ausgabe nennt RKNN_QUERY_CURRENT_OUTPUT_ATTR, das Beispiel RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR. Einige native NHWC/NC1HWC2-Beschreibungen verwechseln Ein- und Ausgabe. Mit tatsächlichen V2.5.0-Headern und Ziel-SDK abgleichen; das Verhalten wurde nicht getestet. Der RK2118-Verweis heißt im Original RKNN3_RK2118_Quick_Start.pdf, im aktuellen Verzeichnis liegt eine RKNN2-Kurzanleitung.
