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.2. Abfragen
Modellattribute, SDK-Version, Speicherbedarf und weitere Informationen abfragen.
rknn_query
rknn_query fragt Modell- und SDK-Informationen ab: Ein- und Ausgaben, schichtweise Laufzeiten, gesamte Inferenzzeit, SDK-Version, Speicherverbrauch, benutzerdefinierte Zeichenfolgen und weitere Informationen.
| API | rknn_query |
|---|---|
| Beschreibung | Fragt Modell- und SDK-Informationen ab. |
| Parameter | rknn_context context: rknn_contex-Objekt (Quellschreibweise). |
| Parameter | rknn_query_cmd: Abfragebefehl. |
| Parameter | void* info: Strukturobjekt für das Abfrageergebnis. |
| Parameter | uint32_t size: Größe des info-Strukturobjekts. |
| Rückgabe | int: Fehlercode (siehe Statuscodes). |
Im beschriebenen Stand unterstützt das SDK folgende Abfragebefehle:
| Abfragebefehl | Ergebnisstruktur | Funktion |
|---|---|---|
| RKNN_QUERY_IN_OUT_NUM | rknn_input_output_num | Anzahl der Ein- und Ausgabetensoren. |
| RKNN_QUERY_INPUT_ATTR | rknn_tensor_attr | Eingabetensorattribute. |
| RKNN_QUERY_OUTPUT_ATTR | rknn_tensor_attr | Ausgabetensorattribute. |
| RKNN_QUERY_PERF_DETAIL | rknn_perf_detail | Laufzeit jeder Netzwerkschicht; nur mit über rknn_init gesetztem RKNN_FLAG_COLLECT_PERF_MASK. |
| RKNN_QUERY_PERF_RUN | rknn_perf_run | Gesamte Inferenzzeit in Mikrosekunden ohne das Setzen von Ein- und Ausgaben. |
| RKNN_QUERY_SDK_VERSION | rknn_sdk_version | SDK-Version. |
| RKNN_QUERY_MEM_SIZE | rknn_mem_size | Speichergröße der Gewichte und internen Netzwerktensoren. |
| RKNN_QUERY_CUSTOM_STRING | rknn_custom_string | Benutzerdefinierte Zeichenfolgen im RKNN-Modell. |
| Abfragebefehl | Ergebnisstruktur | Funktion |
|---|---|---|
| RKNN_QUERY_NATIVE_INPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native Eingabetensorattribute abfragen, die die NPU unmittelbar liest. |
| RKNN_QUERY_NATIVE_OUTPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native Ausgabetensorattribute unmittelbar von der NPU abfragen. |
| RKNN_QUERY_NATIVE_NC1HWC2_INPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native Eingabetensorattribute abfragen. Entspricht RKNN_QUERY_NATIVE_INPUT_ATTR. |
| RKNN_QUERY_NATIVE_NC1HWC2_OUTPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native Ausgabetensorattribute abfragen; das Original bezeichnet diese als von der NPU gelesene Eingabeattribute. Entspricht RKNN_QUERY_NATIVE_OUTPUT_ATTR. |
| RKNN_QUERY_NATIVE_NHWC_INPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native Eingabetensorattribute abfragen. Laut Original identisch mit RKNN_QUERY_NATIVE_INPUT_ATTR. |
| RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR | rknn_tensor_attr | Bei Zero-Copy native NHWC-Ausgabeattribute abfragen; das Original bezeichnet sie als von der NPU gelesene Eingabeattribute. |
| RKNN_QUERY_DEVICE_MEM_INFO | rknn_tensor_mem | Speicherattribute des Modellpuffers abfragen. |
| RKNN_QUERY_INPUT_DYNAMIC_RANGE | rknn_input_range | Für dynamische Modelle Anzahl und Liste der Formen, Datenlayout und zugehörige Eingabenamen abfragen. |
| RKNN_QUERY_CURRENT_INPUT_ATTR | rknn_tensor_attr | Aktuelle Eingabeattribute einer dynamischen Modellinferenz abfragen. |
| RKNN_QUERY_CURRENT_OUTPUT_ATTR | rknn_tensor_attr | Aktuelle Ausgabeattribute einer dynamischen Modellinferenz abfragen. |
| RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR | rknn_tensor_attr | Aktuelle native NPU-Eingabeattribute einer dynamischen Modellinferenz abfragen. |
| RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR | rknn_tensor_attr | Aktuelle native NPU-Ausgabeattribute einer dynamischen Modellinferenz abfragen. |
Nachfolgend wird jeder Abfragebefehl erläutert.
1. SDK-Version abfragen
RKNN_QUERY_SDK_VERSION fragt die Version des RKNN SDK ab. Zunächst ist ein Objekt der Struktur rknn_sdk_version zu erstellen.
Codebeispiel:
rknn_sdk_version version;
ret = rknn_query(ctx, RKNN_QUERY_SDK_VERSION, &version,
sizeof(rknn_sdk_version));
printf("sdk api version: %s\n", version.api_version);
printf("driver version: %s\n", version.drv_version);
2. Anzahl der Ein- und Ausgabetensoren abfragen
RKNN_QUERY_IN_OUT_NUM fragt die Anzahl der Ein- und Ausgabetensoren des Modells ab. Zunächst ein Objekt der Struktur rknn_input_output_num erstellen.
Codebeispiel:
rknn_input_output_num io_num;
ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
printf("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);
3. Eingabetensorattribute abfragen (allgemeine API)
RKNN_QUERY_INPUT_ATTR fragt Eingabetensorattribute ab. Zuerst rknn_tensor_attr erzeugen. Hinweis: Auf RV1106/RV1103/RV1106B/RV1103B/RK2118 wird der ursprünglich nativ eingegebene Tensor abgefragt.
Codebeispiel:
rknn_tensor_attr input_attrs[io_num.n_input];
memset(input_attrs, 0, sizeof(input_attrs));
for (int i = 0; i < io_num.n_input; i++) {
input_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));
}
4. Ausgabetensorattribute abfragen (allgemeine API)
RKNN_QUERY_OUTPUT_ATTR fragt die Attribute des Modellausgabetensors ab. Zunächst ein Objekt der Struktur rknn_tensor_attr erstellen.
Codebeispiel:
rknn_tensor_attr output_attrs[io_num.n_output];
memset(output_attrs, 0, sizeof(output_attrs));
for (int i = 0; i < io_num.n_output; i++) {
output_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));
}
5. Schichtweise Inferenzzeit des Modells abfragen
Nach rknn_run fragt RKNN_QUERY_PERF_DETAIL die schichtweise Inferenzzeit in Mikrosekunden ab. Voraussetzung ist RKNN_FLAG_COLLECT_PERF_MASK im Parameter flag von rknn_init.
Codebeispiel:
rknn_context ctx;
int ret = rknn_init(&ctx, model_data, model_data_size, RKNN_FLAG_COLLECT_PERF_MASK, NULL);
...
ret = rknn_run(ctx,NULL);
...
rknn_perf_detail perf_detail;
ret = rknn_query(ctx, RKNN_QUERY_PERF_DETAIL, &perf_detail, sizeof(perf_detail));
6. Gesamte Inferenzzeit des Modells abfragen
Nach rknn_run fragt RKNN_QUERY_PERF_RUN die Modellinferenzzeit in Mikrosekunden ohne das Setzen der Ein- und Ausgaben ab.
Codebeispiel:
rknn_context ctx;
int ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);
...
ret = rknn_run(ctx,NULL);
...
rknn_perf_run perf_run;
ret = rknn_query(ctx, RKNN_QUERY_PERF_RUN, &perf_run, sizeof(perf_run));
7. Speicherzuweisung des Modells abfragen
Nach rknn_init kann RKNN_QUERY_MEM_SIZE bei eigener Speicherzuweisung durch den Benutzer den Gewichtsspeicher und internen Netzwerkspeicher ohne Ein- und Ausgaben abfragen. Dazu muss der Parameter flag von rknn_init RKNN_FLAG_MEM_ALLOC_OUTSIDE enthalten.
Codebeispiel:
rknn_context ctx;
int ret = rknn_init(&ctx, model_data, model_data_size, RKNN_FLAG_MEM_ALLOC_OUTSIDE , NULL);
rknn_mem_size mem_size;
ret = rknn_query(ctx, RKNN_QUERY_MEM_SIZE, &mem_size, sizeof(mem_size));
8. Benutzerdefinierte Modellzeichenfolge abfragen
Nach rknn_init ruft RKNN_QUERY_CUSTOM_STRING eine bei der RKNN-Modellerzeugung hinzugefügte benutzerdefinierte Zeichenfolge ab. Beispielsweise kann “RGB” bei der Konvertierung kennzeichnen, dass die Eingabe ein dreikanaliges RGB- statt BGR-Bild ist. Zur Laufzeit werden die Daten anhand der abgefragten Information “RGB” in ein RGB-Bild konvertiert.
Codebeispiel:
rknn_context ctx;
int ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);
rknn_custom_string custom_string;
ret = rknn_query(ctx, RKNN_QUERY_CUSTOM_STRING, &custom_string, sizeof(custom_string));
9. Native Eingabetensorattribute abfragen (Zero-Copy-API)
RKNN_QUERY_NATIVE_INPUT_ATTR, gleichbedeutend mit RKNN_QUERY_NATIVE_NC1HWC2_INPUT_ATTR, fragt native Attribute des Modelleingabetensors ab. Zunächst ein Objekt der Struktur rknn_tensor_attr erstellen.
Codebeispiel:
rknn_tensor_attr input_attrs[io_num.n_input];
memset(input_attrs, 0, sizeof(input_attrs));
for (int i = 0; i < io_num.n_input; i++) {
input_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_NATIVE_INPUT_ATTR, &(input_attrs[i]),
sizeof(rknn_tensor_attr));
}
9. Native Ausgabeattribute abfragen (Zero-Copy-API)
RKNN_QUERY_NATIVE_OUTPUT_ATTR, gleichbedeutend mit RKNN_QUERY_NATIVE_NC1HWC2_OUTPUT_ATTR, fragt native Attribute des Modellausgabetensors ab. Zunächst ein Objekt der Struktur rknn_tensor_attr erstellen.
Codebeispiel:
rknn_tensor_attr output_attrs[io_num.n_output];
memset(output_attrs, 0, sizeof(output_attrs));
for (int i = 0; i < io_num.n_output; i++) {
output_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_NATIVE_OUTPUT_ATTR,
&(output_attrs[i]), sizeof(rknn_tensor_attr));
}
10. Native Eingabeattribute abfragen (Zero-Copy-API)
RKNN_QUERY_NATIVE_NHWC_INPUT_ATTR fragt NHWC-Attribute des Modelleingabetensors ab. Zunächst ein Objekt der Struktur rknn_tensor_attr erstellen.
Codebeispiel:
rknn_tensor_attr input_attrs[io_num.n_input];
memset(input_attrs, 0, sizeof(input_attrs));
for (int i = 0; i < io_num.n_input; i++) {
input_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_NATIVE_NHWC_INPUT_ATTR,
&(input_attrs[i]), sizeof(rknn_tensor_attr));
}
11. Native Ausgabetensorattribute abfragen (Quellüberschrift; der folgende Text betrifft die Eingabe, Zero-Copy-API)
RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR fragt NHWC-Attribute des Modellausgabetensors ab. Zunächst ein Objekt der Struktur rknn_tensor_attr erstellen.
Codebeispiel:
rknn_tensor_attr output_attrs[io_num.n_output];
memset(output_attrs, 0, sizeof(output_attrs));
for (int i = 0; i < io_num.n_output; i++) {
output_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_NATIVE_NHWC_OUTPUT_ATTR,
&(output_attrs[i]), sizeof(rknn_tensor_attr));
}
12. Modellpufferspeicher abfragen (Hinweis: RV1106/RV1103/RV1106B/RV1103B/RK2118 unterstützen diese Schnittstelle)
Nach rknn_init fragt RKNN_QUERY_DEVICE_MEM_INFO Attribute des intern in der Runtime erstellten Modellpuffers ab, einschließlich fd und physischer Adresse.
rknn_tensor_mem mem_info;
memset(&mem_info, 0, sizeof(mem_info));
ret = rknn_query(ctx, RKNN_QUERY_DEVICE_MEM_INFO, &mem_info, sizeof(mem_info));
13. Vom RKNN-Modell unterstützte dynamische Eingabeformen abfragen
Hinweis: RV1106/RV1103/RV1106B/RV1103B/RK2118 unterstützen diese Schnittstelle nicht.
Nach rknn_init mit RKNN_QUERY_INPUT_DYNAMIC_RANGE die unterstützten Eingabeformen abfragen, einschließlich Anzahl, Liste, Layout, Namen und weiterer Angaben. Zunächst ein Objekt der Struktur rknn_input_range erstellen.
Beispielcode:
rknn_input_range dyn_range[io_num.n_input];
memset(dyn_range, 0, io_num.n_input * sizeof(rknn_input_range));
for (uint32_t i = 0; i < io_num.n_input; i++) {
dyn_range[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_INPUT_DYNAMIC_RANGE, &dyn_range[i],
sizeof(rknn_input_range));
}
14. Aktuelle dynamische Form der Eingabe des RKNN-Modells abfragen
Nach rknn_set_input_shapes mit RKNN_QUERY_CURRENT_INPUT_ATTR die aktuellen Attribute der Eingabe abfragen. Zuerst rknn_tensor_attr erzeugen. RV1106/RV1103/RV1103B/RV1106B/RK2118 unterstützen diesen Befehl nicht.
Beispielcode:
rknn_tensor_attr cur_input_attrs[io_num.n_input];
memset(cur_input_attrs, 0, io_num.n_input * sizeof(rknn_tensor_attr));
for (uint32_t i = 0; i < io_num.n_input; i++) {
cur_input_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_CURRENT_INPUT_ATTR, &(cur_input_attrs[i]),
sizeof(rknn_tensor_attr));
}
15. Aktuelle dynamische Form der Ausgabe des RKNN-Modells abfragen
Nach rknn_set_input_shapes mit RKNN_QUERY_CURRENT_OUTPUT_ATTR die aktuellen Attribute der Ausgabe abfragen. Zuerst rknn_tensor_attr erzeugen. RV1106/RV1103/RV1103B/RV1106B/RK2118 unterstützen diesen Befehl nicht.
Beispielcode:
rknn_tensor_attr cur_output_attrs[io_num.n_output];
memset(cur_output_attrs, 0, io_num.n_output * sizeof(rknn_tensor_attr));
for (uint32_t i = 0; i < io_num.n_output; i++) {
cur_output_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_CURRENT_OUTPUT_ATTR, &(cur_output_attrs[i]),
sizeof(rknn_tensor_attr));
}
16. Aktuelle dynamische Form der nativen Eingabe des RKNN-Modells abfragen
Nach rknn_set_input_shapes mit RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR die aktuellen Attribute der nativen Eingabe abfragen. Zuerst rknn_tensor_attr erzeugen. RV1106/RV1103/RV1103B/RV1106B/RK2118 unterstützen diesen Befehl nicht.
Beispielcode:
rknn_tensor_attr cur_input_attrs[io_num.n_input];
memset(cur_input_attrs, 0, io_num.n_input * sizeof(rknn_tensor_attr));
for (uint32_t i = 0; i < io_num.n_input; i++) {
cur_input_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_CURRENT_NATIVE_INPUT_ATTR,
&(cur_input_attrs[i]), sizeof(rknn_tensor_attr));
}
17. Aktuelle dynamische Form der nativen Ausgabe des RKNN-Modells abfragen
Nach rknn_set_input_shapes mit RKNN_QUERY_CURRENT_OUTPUT_ATTR die aktuellen Attribute der nativen Ausgabe abfragen. Zuerst rknn_tensor_attr erzeugen. RV1106/RV1103/RV1103B/RV1106B/RK2118 unterstützen diesen Befehl nicht.
Beispielcode:
rknn_tensor_attr cur_output_attrs[io_num.n_output];
memset(cur_output_attrs, 0, io_num.n_output * sizeof(rknn_tensor_attr));
for (uint32_t i = 0; i < io_num.n_output; i++) {
cur_output_attrs[i].index = i;
ret = rknn_query(ctx, RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR, &(cur_output_attrs[i]),
sizeof(rknn_tensor_attr));
}
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.
