코딩뚠뚠

[머신러닝 공부] Tiny ML -5 / 어플리케이션 구축-1 본문

공부/ML&DL

[머신러닝 공부] Tiny ML -5 / 어플리케이션 구축-1

로디네로 2021. 12. 8. 23:42
반응형

 

 

Chapter5. 어플리케이션 구축

 

"
이번 챕터에서는 모델을 실행하는 어플리케이션을 구축해 본다.
"




5장의 목차는 아래와 같다

 

  1. 테스트코드 작성
  2. 프로젝트 파일의 구조 파악
  3. 소스코드 구성 파악

 

 

저번챕터에서는 모델을 빌드하고 훈련시켜봤다.

 

하지만 모델은 전체적인 어플리케이션의 일부일 뿐이며 이를 사용하려면 필요한 환경을 설정하고 입,출력을 제공해야 하며 동작하는 코드로 모델을 랩핑 해야만한다.

 

이번 장 에서는 모델을 TinyML 어플리케이션에 적용하는 과정을 진행해 볼 것이다.

 

 


 

 

1. 테스트코드 작성

구동을 구현한 짧은 코드로 앞으로 작성할 완성될 코드의 논리를 증명해낼 수 있다.

(동작 메커니즘이 같으나 복잡한 구현을 하지 않은 예제코드이다.)

 

 

GitHub - yunho0130/tensorflow-lite: O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소

O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소 - GitHub - yunho0130/tensorflow-lite: O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소

github.com

- 위의 코드를 참고했다.

 

 

들어가기에 앞서 코드의 확장자명이 .cc 인데 이는 .cpp와 같은 c++ 코드이다.

 

 

-1. 헤더 불러오기 : 아래와 같이 테스트 작성을 위한 헤더를 불러왔다.

#include "tensorflow/lite/micro/examples/hello_world/sine_model_data.h"
#include "tensorflow/lite/micro/kernels/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/testing/micro_test.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"

 

 

 

-2. 테스트 설정 : 아래 두 가지 이름으로 매크로를 생성한다. (micro_test.h에 포함)

TF_LITE_MICRO_TESTS_BEGIN

TF_LITE_MICRO_TEST(LoadModelAndPerformInference) {

 

 

 

-3,4. 테스트 논리 코드 : 아래 코드에서부터는 계속되는 테스트 논리 코드이다.

 

   ✔ 데이터 기록 : 

tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = &micro_error_reporter

(MicroErrorReporterErrorReporter 클래스의 서브 클래스이다.)

MicroErrorReporter 인스턴스를 정의한다. 이는 추론 중 디버그 정보를 기록한다. (오류를 출력)

또한 ErrorReporter 자료형의 error_reporter 포인터변수를 선언하는데, ErrorReporter의 포인터는 하위클래스의 값(MicroErrorReporter)을 가리킬 수 있다.

여기서 &micro_error_reporter는 값이 아닌 포인터를 할당하고 있음을 의미한다.

중요한 점은 error_reporter는 포인터이고 이것은 디버그 정보를 출력하기 위해 쓰인다는것

 

   ✔ 모델 매핑 : 모델을 사용가능한 데이터 구조에 매핑한다. (모델을 구조체에 로드)

 

 

 

-5. AllOpsResolver 생성 : 

tflite::ops::micro::AllOpsResolver resolver;

Tensorflow Lite 인터프리터가 Op(operation)에 접근할 수 있도록 한다.

 

 

 

-6. 텐서 아레나 정의 : 

텐서 아레나란 모델의 입력, 출력, 중간 텐서를 저장하는데 사용되는 메모리영역이다. 이를 할당해야한다.

 

 

 

-7. 인터프리터 생성 : 

// Build an interpreter to run the model with
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena,
                                       tensor_arena_size, error_reporter);

// Allocate memory from the tensor_arena for the model's tensors
TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk);

모델 실행을 위한 인터프리터를 빌드한다.

interpreter 라는 이름의 Microinterpreter 를 선언하고, AllocateTensors()메서드는 메모리를 할당한다.

 

 

 

-8. 입력텐서 검사 : 

 TfLiteTensor* input = interpreter.input(0);

모델 정보를 제공하기위해 입력데이터를 모델의 입력텐서에 쓴다.

텐서는 해당 깃헙의 c_api_internal.h에 정의된 TfLiteTensor 구조체로 표시되고 텐서와 상호작용, 학습 API를 제공한다.

이 기능들을 사용해 텐서의 형태가 올바른지 확인한다.(Assertion)

> 속성, 모양, 길이, 비트 수

 

 

 

 -9. 추론 실행 :

입력텐서에 값을 제공한 다음, 인터프리터에게 모델을 호출하도록 한다.

  input->data.f[0] = 0.;

  // Run the model on this input and check that it succeeds
  TfLiteStatus invoke_status = interpreter.Invoke();
  TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

입력값을 제공한 후 그 입력값으로 모델을 호출,실행한다.( Invoke() )

이후 성공여부를 확인한다.

 

TFliteTensor에서 [1 2 3]을 설정하려면 아래와 같이 설정하면된다.

input->data.f[0] = 1;

input->data.f[1] = 2;

input->data.f[2] = 3;

 

 

 

-10. 실행 : 

마이크로컨트롤러에 다운받아 실행하기전에 PC에서 미리 실행해보고 디버그를 하는 과정을 거친다.

실행(컴파일)하기 위해서는 터미널, git, make 가 필요하다.

 

git clone 으로 tflite-micro 레포지토리를 모두 clone 해온다

 

이후 상위 디렉토리에서 make 를 실행해준다. (윈도우 환경에선 make버전을 3.82이상 설치하기가 힘들어 리눅스환경으로 옮겼다.)

make -f tflite-micro/lite/micro/tools/make/Makefile test_hello_world_test

위와 같이 make가 완료되고 이전 코드에서 작성해줬던 test들이 통과됐음을 출력해준다.

 

 


 

 

 

여기까지 간단한 코드로 테스트를 완료했으니

다음 포스팅에서는 프로젝트 파일구조를 알아보고 실제 코드를 작성, 분석해보도록 한다.

 

반응형