HarmonyOS: Verwendung der MindSpore Lite-Engine zur Modellinferenz

Szeneneinführung

MindSpore Lite ist eine KI-Engine, die KI-Modellinferenzfunktionen für verschiedene Hardwaregeräte bereitstellt. Sie wird häufig in Anwendungen wie Bildklassifizierung, Zielerkennung, Gesichtserkennung und Texterkennung eingesetzt.

In diesem Artikel wird der allgemeine Entwicklungsprozess für die Modellinferenz mithilfe der MindSpore Lite-Inferenz-Engine vorgestellt.

Basiskonzept

Bitte verstehen Sie vor der Entwicklung die folgenden Konzepte.

Tensor : Er ist Arrays und Matrizen sehr ähnlich und stellt die grundlegende Datenstruktur in MindSpore Lite-Netzwerkoperationen dar.

Float16-Inferenzmodus : Float16, auch als halbe Genauigkeit bekannt, verwendet 16 Bit zur Darstellung einer Zahl. Der Float16-Inferenzmodus bedeutet, dass bei der Argumentation halbe Genauigkeit verwendet wird.

Schnittstellenbeschreibung

Hier sind einige Schnittstellen, die am allgemeinen Entwicklungsprozess der MindSpore Lite-Inferenz beteiligt sind. Einzelheiten finden Sie in der folgenden Tabelle.

Kontextbezogene Schnittstellen

Modellbezogene Schnittstellen

Tensorbezogene Schnittstellen

Entwicklungsschritte

Der Entwicklungsprozess der Verwendung von MindSpore Lite für die Modellinferenz ist in der folgenden Abbildung dargestellt. Abbildung 1  Entwicklungsprozess der Modellinferenz mit MindSpore Lite

Bevor Sie den Hauptprozess starten, müssen Sie auf die relevanten Header-Dateien verweisen und eine Funktion schreiben, um eine zufällige Eingabe zu generieren, wie folgt:

#include <stdlib.h>#include <stdio.h>#include "mindspore/model.h"
//生成随机的输入int GenerateInputDataWithRandom(OH_AI_TensorHandleArray inputs) {
   
     for (size_t i = 0; i < inputs.handle_num; ++i) {
   
       float *input_data = (float *)OH_AI_TensorGetMutableData(inputs.handle_list[i]);    if (input_data == NULL) {
   
         printf("MSTensorGetMutableData failed.\n");      return OH_AI_STATUS_LITE_ERROR;    }    int64_t num = OH_AI_TensorGetElementNum(inputs.handle_list[i]);    const int divisor = 10;    for (size_t j = 0; j < num; j++) {
   
         input_data[j] = (float)(rand() % divisor) / divisor;  // 0--0.9f    }  }  return OH_AI_STATUS_SUCCESS;}

Geben Sie dann die Hauptentwicklungsschritte ein, einschließlich Modellvorbereitung, Lesen, Kompilieren, Argumentieren und Freigeben. Spezifische Entwicklungsprozesse und Details finden Sie in den folgenden Entwicklungsschritten und Beispielen.

1. Modellvorbereitung.

Das benötigte Modell kann direkt heruntergeladen oder über das Modellkonvertierungstool bezogen werden.

a. Wenn das heruntergeladene Modell im .ms-Format vorliegt, kann es direkt verwendet werden. In diesem Artikel wird mobilenetv2.ms als Beispiel verwendet.

b. Wenn es sich um ein Modell eines Drittanbieter-Frameworks wie TensorFlow, TensorFlow Lite, Caffe, ONNX usw. handelt, können Sie es mit dem Modellkonvertierungstool in eine Modelldatei im .ms-Format konvertieren.

2. Erstellen Sie einen Kontext und legen Sie Parameter wie die Anzahl der Threads und den Gerätetyp fest.

// 创建并配置上下文,设置运行时的线程数量为2,绑核策略为大核优先
OH_AI_ContextHandle context = OH_AI_ContextCreate();
if (context == NULL) {
  printf("OH_AI_ContextCreate failed.\n");
  return OH_AI_STATUS_LITE_ERROR;
}
const int thread_num = 2;
OH_AI_ContextSetThreadNum(context, thread_num);
OH_AI_ContextSetThreadAffinityMode(context, 1);
//设置运行设备为CPU,不使用Float16推理
OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
if (cpu_device_info == NULL) {
  printf("OH_AI_DeviceInfoCreate failed.\n");
  OH_AI_ContextDestroy(&context);
  return OH_AI_STATUS_LITE_ERROR;
}
OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
OH_AI_ContextAddDeviceInfo(context, cpu_device_info);

3. Erstellen, laden und kompilieren Sie das Modell.

Rufen Sie OH_AI_ModelBuildFromFile auf, um das Modell zu laden und zu kompilieren.

In diesem Beispiel ist der an OH_AI_ModelBuildFromFile übergebene Parameter argv[1] der über die Konsole eingegebene Modelldateipfad.

// 创建模型OH_AI_ModelHandle model = OH_AI_ModelCreate();if (model == NULL) {
   
     printf("OH_AI_ModelCreate failed.\n");  OH_AI_ContextDestroy(&context);  return OH_AI_STATUS_LITE_ERROR;}
// 加载与编译模型,模型的类型为OH_AI_MODELTYPE_MINDIRint ret = OH_AI_ModelBuildFromFile(model, argv[1], OH_AI_MODELTYPE_MINDIR, context);if (ret != OH_AI_STATUS_SUCCESS) {
   
     printf("OH_AI_ModelBuildFromFile failed, ret: %d.\n", ret);  OH_AI_ModelDestroy(&model);  return ret;}

4. Geben Sie die Daten ein.

Der Eingabetensor muss mit Daten gefüllt werden, bevor das Modell ausgeführt wird. In diesem Beispiel werden Zufallsdaten zum Auffüllen des Modells verwendet.

// 获得输入张量OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);if (inputs.handle_list == NULL) {
   
     printf("OH_AI_ModelGetInputs failed, ret: %d.\n", ret);  OH_AI_ModelDestroy(&model);  return ret;}// 使用随机数据填充张量ret = GenerateInputDataWithRandom(inputs);if (ret != OH_AI_STATUS_SUCCESS) {
   
     printf("GenerateInputDataWithRandom failed, ret: %d.\n", ret);  OH_AI_ModelDestroy(&model);  return ret;}

5. Führen Sie eine Argumentation durch.

Verwenden Sie die Schnittstelle OH_AI_ModelPredict für die Modellinferenz.

// 执行模型推理OH_AI_TensorHandleArray outputs;ret = OH_AI_ModelPredict(model, inputs, &outputs, NULL, NULL);if (ret != OH_AI_STATUS_SUCCESS) {
   
     printf("OH_AI_ModelPredict failed, ret: %d.\n", ret);  OH_AI_ModelDestroy(&model);  return ret;}

6. Holen Sie sich die Ausgabe.

Nachdem die Modellinferenz abgeschlossen ist, können die Inferenzergebnisse über den Ausgabetensor abgerufen werden.

// 获取模型的输出张量,并打印
for (size_t i = 0; i < outputs.handle_num; ++i) {
  OH_AI_TensorHandle tensor = outputs.handle_list[i];
  int64_t element_num = OH_AI_TensorGetElementNum(tensor);
  printf("Tensor name: %s, tensor size is %zu ,elements num: %lld.\n", OH_AI_TensorGetName(tensor),
        OH_AI_TensorGetDataSize(tensor), element_num);
  const float *data = (const float *)OH_AI_TensorGetData(tensor);
  printf("output data is:\n");
  const int max_print_num = 50;
  for (int j = 0; j < element_num && j <= max_print_num; ++j) {
    printf("%f ", data[j]);
  }
  printf("\n");
}

7. Geben Sie das Modell frei.

Wenn Sie das MindSpore Lite-Inferenz-Framework nicht mehr verwenden, müssen Sie das erstellte Modell freigeben.

// 释放模型OH_AI_ModelDestroy(&model);

Inbetriebnahme und Überprüfung

1. Schreiben Sie CMakeLists.txt.

cmake_minimum_required(VERSION 3.14)project(Demo)
add_executable(demo main.c)
target_link_libraries(        demo        mindspore-lite.huawei        pthread        dl)

● Um die ohos-sdk-Crosskompilierung zu verwenden, müssen Sie den nativen Toolchain-Pfad für CMake festlegen, d. h. -DCMAKE_TOOLCHAIN_FILE="/xxx/native/build/cmake/ohos.toolchain.camke".

● Die Toolkette kompiliert standardmäßig 64-Bit-Programme. Wenn Sie 32-Bit-Programme kompilieren möchten, müssen Sie Folgendes hinzufügen: -DOHOS_ARCH="armeabi-v7a".

2. Laufen.

● Verwenden Sie hdc_std, um eine Verbindung zum Gerät herzustellen und demo und mobilenetv2.ms in dasselbe Verzeichnis im Gerät zu verschieben.

● Verwenden Sie die hdc_std-Shell, um das Gerät aufzurufen, geben Sie das Verzeichnis ein, in dem sich die Demo befindet, und führen Sie den folgenden Befehl aus, um das Ergebnis zu erhalten.

./demo mobilenetv2.ms

Erhalten Sie die folgende Ausgabe:

# ./QuickStart ./mobilenetv2.ms                                            
Tensor name: Softmax-65, tensor size is 4004 ,elements num: 1001.
output data is:
0.000018 0.000012 0.000026 0.000194 0.000156 0.001501 0.000240 0.000825 0.000016 0.000006 0.000007 0.000004 0.000004 0.000004 0.000015 0.000099 0.000011 0.000013 0.000005 0.000023 0.000004 0.000008 0.000003 0.000003 0.000008 0.000014 0.000012 0.000006 0.000019 0.000006 0.000018 0.000024 0.000010 0.000002 0.000028 0.000372 0.000010 0.000017 0.000008 0.000004 0.000007 0.000010 0.000007 0.000012 0.000005 0.000015 0.000007 0.000040 0.000004 0.000085 0.000023 

おすすめ

転載: blog.csdn.net/HarmonyOSDev/article/details/134999000