에지 지원 기계 학습 애플리케이션을 신속하게 배포하는 방법

작성자: Stephen Evanczuk

DigiKey 북미 편집자 제공

기계 학습(ML)은 스마트 제품을 만들 수 있는 엄청난 잠재력을 제공하지만 신경망(NN) 모델링과 에지를 위한 ML 애플리케이션 개발에 관련한 복잡성과 당면과제로 인해 개발자가 유용한 솔루션을 빠르게 제공하는 데 한계가 있습니다. 즉시 사용 가능한 도구로 인해 ML 모델 개발이 전체적으로 쉬워졌지만, 기존의 ML 개발 실무는 사물 인터넷(IoT), 자동차, 산업 시스템, 기타 내장 애플리케이션의 요구 사항을 충족하도록 설계되어 있지 않습니다.

본 기사에서는 NN 모델링에 대해 간략히 소개합니다. 그리고 개발자가 에지 지원 ML 애플리케이션을 보다 효과적으로 제공할 수 있는 NXP Semiconductors의 포괄적인 ML 플랫폼을 사용하는 방법을 소개하고 설명합니다.

NN 모델링에 대한 간략한 소개

ML 알고리즘은 개발자에게 완전히 새로운 애플리케이션 개발 옵션을 제공합니다. 개발자는 이미지 분류와 같은 문제를 명시적으로 해결하기 위한 소프트웨어 코드를 작성하는 대신, 이미지에 포함된 엔터티의 실제 이름(또는 클래스)으로 주석이 적용된 이미지와 같은 데이터 세트를 제공하여 NN 모델을 학습시킵니다. 학습 프로세스는 다양한 방식을 사용하여 각 뉴런 및 레이어에 대한 모델의 중량 및 바이어스 값 파라미터를 계산하여 모델이 입력 이미지의 클래스를 어느 정도 정확하게 예측할 수 있습니다(그림 1).

완전히 연결된 네트워크가 입력 개체를 분류하는 NN 이미지(확대하려면 클릭)그림 1: 완전히 연결된 네트워크가 학습 시 중량 및 바이어스 파라미터를 사용하여 입력 개체를 분류하는 NN (이미지 출처: NXP Semiconductors)

ML 연구자들은 그림 1과 같은 완전히 연결된 일반적인 NN을 넘어선 다양한 NN 아키텍처를 개발했습니다. 예를 들어 이미지 분류 애플리케이션은 보통 이미지 인식을 이미지의 주요 특징을 파악하는 초기 단계와 학습 시 설정된 여러 클래스 중 하나에 속할 확률을 예측하는 분류 단계로 나누는 특수 아키텍처인 복잡한 NN(CNN)을 사용합니다(그림 2).

복잡한 신경망(CNN) 구성도(확대하려면 클릭)그림 2: ML 전문가는 이미지 인식과 같은 특정 작업을 위한 복잡한 신경망(CNN)과 같은 특수 NN 아키텍처를 사용합니다. (이미지 출처: NXP Semiconductors)

적절한 모델 아키텍처 및 학습 방식 선택은 ML 전문가로 제한되었지만, 여러 오픈 소스 및 상업용 툴을 사용할 수 있어 대규모 배포를 위한 모델의 개발이 크게 간소화되었습니다. 오늘날 개발자들은 코드 몇 줄로 모델을 정의하고(목록 1), 오픈 소스 Netron 모델 뷰어와 같은 도구를 사용하여 모델을 그래픽으로 시각화함으로써 각 레이어 정의 및 연결성을 점검합니다(그림 3).

복사
def model_create(shape_in, shape_out):
    from keras.regularizers import l2
    
    tf.random.set_seed(RANDOM_SEED)
 
    model = tf.keras.Sequential()
    model.add(tf.keras.Input(shape=shape_in, name='acceleration'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    model.add(tf.keras.layers.Conv2D(8, (4, 1), activation='relu'))
    
    model.add(tf.keras.layers.Dropout(0.5))
    
    model.add(tf.keras.layers.MaxPool2D((8, 1), padding='valid'))
    model.add(tf.keras.layers.Flatten())
    
    model.add(tf.keras.layers.Dense(64, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(32, kernel_regularizer=l2(1e-4), bias_regularizer=l2(1e-4), activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(shape_out, activation='softmax'))
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    
    return model

목록 1: 개발자는 NN 몇 줄의 코드만을 사용하여 NN 모델을 정의할 수 있습니다. (코드 출처: NXP Semiconductors)

목록 1에 정의된 모델의 그래픽 이미지(확대하려면 클릭)그림 3: 목록 1에서 정의된 모델을 Netron 뷰어를 통해 그래픽으로 나타냄으로써, 개발자가 각 레이어의 기능과 연결성을 문서화할 수 있습니다. (이미지 출처: Stephen Evanczuk, 목록 1의 NXP 모델 소스에서 Netron 운영)

최종 배포를 위해, 다른 도구들은 학습 시에만 필요한 모델 구조를 제거하고 다른 최적화를 수행하여 효율적인 추론 모델을 생성합니다.

스마트 제품을 위한 ML 기반 애플리케이션 개발이 어려운 이유

IoT 또는 기타 스마트 제품을 위한 모델을 정의하고 학습시키는 데에는 엔터프라이즈급 기계 학습 애플리케이션을 위한 모델을 생성하는 것과 유사한 워크플로우가 따릅니다. 하지만 이러한 유사성뿐 아니라, 에지를 위한 ML 애플리케이션에는 다양한 당면과제가 따릅니다. 모델 개발과 함께, 설계자는 마이크로 컨트롤러(MCU) 기반 제품을 운영하는 데 필요한 메인 애플리케이션을 개발하는 데 따르는 익숙한 당면과제에 직면합니다. 따라서 ML을 에지로 확장하려면 상호 연결된 두 개의 워크플로우를 관리해야 합니다(그림 4).

그림 4: 에지를 위한 ML 기반 애플리케이션을 개발하면 ML 모델 학습, 검증, 배포에 필요한 ML 워크플로우를 통해 일반적인 내장형 MCU 개발 워크플로우가 확장됩니다. (이미지 출처: NXP Semiconductors)

MCU 프로젝트 워크플로우는 내장형 워크플로우 개발자에게 익숙하지만, ML 프로젝트에서는 개발자가 최적화된 ML 추론 모델을 생성함에 따라 MCU 기반 애플리케이션에 추가적인 요구 사항이 적용될 수 있습니다. 실제로 ML 프로젝트는 내장형 장치의 요구 사항에 큰 영향을 줍니다. 모델 실행에 일반적으로 따르는 무거운 컴퓨팅 부하 및 메모리 요구 사항은 IoT 및 스마트 제품에 사용되는 마이크로 컨트롤러 리소스를 초과할 수 있습니다. 리소스 요구 사항을 줄이기 위해, ML 전문가들은 모델 네트워크 프루닝, 압축, 양자화와 같은 기법을 적용하여 정밀성 또는 단일 비트 파라미터와 중간 값, 기타 방식을 낮춥니다.

하지만 이러한 최적화 방식을 사용해도 기존 마이크로 컨트롤러에는 ML 알고리즘에 필요한 수많은 수학 연산을 처리하는 데 필요한 성능이 부족합니다. 반면 고성능 애플리케이션 프로세서를 사용하면 ML 컴퓨팅 부하를 처리할 수 있지만 이러한 접근 방식으로 인해 대기 시간과 비결정적 응답이 증가하여 내장형 설계의 실시간 특성이 저하됩니다.

하드웨어 선택의 어려움 외에도, 에지에 최적화된 ML 모델을 제공하려면 내장형 개발 특유의 어려움이 따릅니다. 엔터프라이즈급 ML 애플리케이션을 위해 개발된 다양한 도구와 방식은 내장형 개발자 애플리케이션 및 운영 환경으로 효과적으로 확장되지 않을 수 있습니다. ML 기반 장치의 신속한 배포를 기대하는 숙련된 내장형 개발자도 다양한 NN 모델 아키텍처, 도구, 프레임워크, 워크플로우 중에서 효과적인 솔루션을 찾는 데 어려움을 겪을 수 있습니다.

NXP는 에지 ML 개발의 하드웨어 성능 측면과 모델 구현 측면 모두를 해결합니다. 하드웨어 수준에서, NXP의 고성능 i.MX RT1170 크로스오버 마이크로 컨트롤러는 에지 ML의 광범위한 성능 요구 사항을 충족합니다. 이 하드웨어 베이스를 최대한 활용하기 위해, NXP의 eIQ(에지 인텔리전스) ML 소프트웨어 개발 환경 및 애플리케이션 소프트웨어 팩은 숙련된 개발자와 ML 전문 개발자 모두에게 에지 지원 ML 애플리케이션 개발을 위한 효과적인 솔루션을 제공합니다.

에지 지원 ML 애플리케이션 개발에 효과적인 플랫폼

NXP i.MX RT 크로스오버 프로세서는 기존 내장형 마이크로 컨트롤러의 대기시간이 낮은 실시간 응답과 고성능 애플리케이션 프로세서의 실행 기능을 결합합니다. NXP의 i.MX RT1170 크로스오버 프로세서 계열은 전력 효율성이 높은 Arm® Cortex®-M4와 고성능 Arm Cortex-M7 프로세서와 내장형 장치의 ML 기반 솔루션을 포함한 까다로운 애플리케이션을 실행하는 데 필요한 광범위한 기능 블록과 주변 장치를 결합합니다(그림 5).

그림 5: NXP의 i.MX RT1170 크로스오버 프로세서는 기존 마이크로 컨트롤러의 전력 효율성과 애플리케이션 프로세서의 고성능 처리 기능을 결합합니다. (이미지 출처: NXP Semiconductors)

NXP의 MCUXpresso SDK와 Yocto 개발 환경에 완전히 통합된 NXP eIQ 환경은 NXP 마이크로 프로세서 및 마이크로 컨트롤러와 함께 구축된 내장형 시스템에서 추론 모델 구현을 지원하도록 특별히 설계되었습니다. eIQ 환경에 포함된 eIQ Toolkit은 eIQ Portal, eIQ Model Tool, 명령줄 도구를 비롯한 다양한 도구를 통해 BYOD(Bring Your Own Data) 및 BYOM(Bring Your Own Model) 워크플로우를 지원합니다(그림 6).

그림 6: NXP eIQ Toolkit은 모델을 만들어야 하는 BYOD 개발자와 대상 시스템에 기존 모델을 배포해야 하는 BYOM 개발자를 지원합니다. (이미지 출처: NXP Semiconductors)

이러한 전문가와 ML 모델 개발에 익숙하지 않은 개발자를 위한 BYOD 워크플로우를 지원하도록 설계된 eIQ Portal은 개발자가 모델 개발 워크플로우의 각 단계를 보다 손쉽게 수행할 수 있는 그래픽 사용자 인터페이스(GUI)를 제공합니다.

개발의 첫 단계인 eIQ Portal의 데이터 세트 큐레이터 도구를 통해 데이터를 가져오고, 연결된 카메라에서 데이터를 캡처하거나 원격 장치에서 데이터를 캡처할 수 있습니다(그림 7).

그림 7: eIQ Portal의 데이터 세트 큐레이터 도구는 학습 데이터 준비의 주요 작업을 지원합니다. (이미지 출처: NXP Semiconductors)

데이터 세트 큐레이터 도구를 사용하여 이미지 전체 또는 지정된 경계 상자에 포함된 특정 리전에만 레이블을 적용하여 데이터 세트 내 각 항목에 주석 또는 레이블을 적용할 수 있습니다. 증강 기능을 통해 이미지를 블러 처리하고, 랜덤 잡음을 추가하고, 밝기 또는 대비와 같은 특성을 변경하는 등의 방식을 통해 데이터 세트에 필요한 다양성을 적용할 수 있습니다.

다음 단계에서는 eIQ Portal을 통해 애플리케이션에 가장 적합한 모델 유형을 선택할 수 있습니다. 개발자가 모델 유형을 확신할 수 없는 경우, 모델 선택 마법사가 애플리케이션 유형과 하드웨어 베이스에 따른 선택 프로세스를 안내합니다. 어떤 유형의 모델이 필요한지 이미 알고 있는 개발자는 eIQ 설치 또는 기타 커스텀 구현을 통해 제공되는 커스텀 모델을 선택할 수 있습니다.

eIQ Portal은 개발자를 다음 주요 학습 단계로 안내하여 직관적인 GUI를 통해 학습 파라미터를 수정하고 각 학습 단계의 모델 예측 정확도의 변화를 확인할 수 있습니다(그림 8).

그림 8: 개발자는 eIQ Portal의 학습 도구를 사용하여 각 단계별로 학습 정확성이 향상하는 것을 확인하고 필요한 경우 수정할 수 있습니다. (이미지 출처: NXP Semiconductors)

다음 단계에서 eIQ Portal GUI를 통해 모델을 검증할 수 있습니다. 이 단계에서는 모델이 대상 아키텍처에서 실행되어 실제 성능을 파악할 수 있습니다. 검증이 완료되면, 입력 개체의 실제 클래스를 모델에서 예측한 클래스와 비교할 수 있는 기본적인 ML 검증 도구인 오차 행렬이 검증 화면에 표시됩니다(그림 9).

그림 9: eIQ Portal의 검증 도구는 대상 아키텍처에서 모델을 실행한 결과 오차 행렬을 제공합니다. (이미지 출처: NXP Semiconductors)

최종 배포 시, 이 환경에서는 프로세스에 따른 다음의 대상 추론 엔진 옵션을 제공합니다.

  • Arm CMSIS-NN(Common Microcontroller Software Interface Standard, Neural Network)—Arm Cortex-M 프로세서 코어에서 신경망의 성능을 최대화하고 메모리 용량을 최소화하기 위해 개발된 신경망 커널
  • Arm NN SDK(신경망, 소프트웨어 개발 키트)—기존 신경망 프레임워크와 Arm Cortex-A 프로세서를 연결하도록 설계된 도구와 추론 엔진 세트
  • DeepViewRT—i.MX RT 크로스오버 MCU를 위한 NXP 독점 추론 엔진
  • Glow NN—Meta’s Glow(그래프 하단) 컴파일러에 기반하며, 가능한 경우 CMSIS-NN 커널 또는 Arm NN 라이브러리에 대한 기능 호출을 사용하거나 네이티브 라이브러리에서 코드를 컴파일링하여 NXP에서 Arm Cortex-M 코어에 적합하도록 최적화됨
  • ONXX Runtime—Arm Cortex-A 프로세서에 적합하도록 성능을 최적화하도록 설계된 Microsoft Research의 도구
  • TensorFlow Lite for Microcontrollers—i.MX RT 크로스오버 MCU에서 기계 학습 모델 실행에 최적화된 TensorFlow Lite의 작은 버전
  • TensorFlow Lite—작은 시스템을 지원하는 TensorFlow 버전

BYOM 워크플로우의 경우, eIQ Model Tool을 사용하여 모델 분석 및 레이어별 시간 프로파일링으로 바로 이동할 수 있습니다. BYOD 워크플로우와 BYOM 워크플로우 모두, 도구 기능뿐 아니라 GUI에서 바로 사용할 수 없는 eIQ 기능에 대한 액세스를 제공하는 eIQ 명령줄 도구를 사용할 수 있습니다.

본 기사에 언급된 기술 이외에도, eIQ Toolkit은 모델 변환 및 본 기사의 범위를 훨씬 넘어서는 최적화를 비롯하여 다양한 기능을 지원합니다. 하지만 에지 지원 ML 애플리케이션의 신속한 프로토타입 제작을 위해, 개발자들은 일반적으로 eIQ 환경의 수많은 첨단 기능을 거의 사용하지 않고도 개발 및 배포를 빠르게 진행할 수 있습니다. 실제로 NXP의 특수 App SW(Application Software) 팩은 개발자들이 즉각적인 평가에, 또는 커스텀 애플리케이션의 기반으로 사용할 수 있는 완전한 애플리케이션을 제공합니다.

App SW 팩을 사용하여 모델 개발을 신속하게 평가하는 방법

NXP App SW 팩은 제품 지원 소스 코드, 드라이버, 미들웨어, 도구를 결합한 완전한 ML 기반 애플리케이션을 제공합니다. 예를 들어 NXP ML State Monitor App SW Pack은 센서 입력에 따라 복잡한 시스템의 상태가 달라지는 일반적인 문제에 대한 즉각적인 ML 기반 솔루션을 제공합니다(그림 10).

그림 10: 개발자는 즉각적인 평가를 위해, 또는 커스텀 코드 개발의 기반으로 ML State Monitor App SW Pack과 같은 NXP App SW Pack을 사용할 수 있습니다. (이미지 출처: NXP Semiconductors)

ML State Monitor App SW Pack은 팬이 다음의 4가지 상태 중 하나로 작동하면 감지하기 위한 애플리케이션을 위한 완전한 솔루션을 구현합니다.

  • 켜짐
  • 꺼짐
  • 막힘, 팬이 켜져 있지만 공기 흐름이 막힌 상태
  • 마찰, 팬이 켜져 있지만 작동 시 1개 이상의 팬 블레이드에 과도한 마찰이 발생하는 경우

모델 개발자에게 그만큼 중요한 ML State Monitor App SW Pack에는 ML 모델뿐 아니라 4가지 중 1가지 상태로 작동하는 팬의 가속도계 측정치를 나타내는 완전한 데이터 세트가 포함됩니다.

개발자는 ML State Monitor App SW Pack에서 제공되는 코드, 모델, 데이터를 검토하여 모델을 학습시키고, 추론 모델을 만들고, 추론을 검증 센서 데이터 세트에 비교 검증하는 방법을 파악할 수 있습니다. 실제로 App SW Pack에 포함된 NXP의 ML_State_Monitor.ipynb Jupyter Notebook은 하드웨어 구축 훨씬 전에 모델 개발 워크플로우를 연구하기 위한 즉각적이고 즉시 사용 가능한 도구를 제공합니다.

Jupyter Notebook은 Python 코드 실행의 결과를 즉시 확인할 수 있는 대화형 브라우저 기반 Python 실행 플랫폼입니다. Jupyter Notebook을 실행하면 Python 코드 블록이 생성되고, 즉시 코드 블록 실행 결과가 나타납니다. 결과는 단순한 통계로 표시되지 않지만 코드 실행에 따른 실제 결과입니다. 예를 들어 개발자가 NXP’s ML_State_Monitor.ipynb Jupyter Notebook을 실행하면 입력 데이터 세트 요약을 즉시 확인할 수 있습니다(그림 11).

그림 11: NXP의 ML_State_Monitor.ipynb Jupyter Notebook을 사용하면 신경망 모델 개발 워크플로우를 통해 대화형으로 작업하여 ML State Monitor App SW Pack에서 제공되는 학습 데이터를 확인할 수 있습니다. [참고: 편의를 위해 잘라낸 코드입니다.] (이미지 출처: Stephen Evanczuk, NXP의 ML_State_Monitor.ipynb Jupyter Notebook 실행)

Notebook 코드의 다음 섹션에서는 입력 데이터의 시간 순서와 빈도별 플롯이 그래픽으로 표시됩니다(그림 12).

그림 12: Jupyter Notebook은 샘플 팬 상태 데이터 세트를 시간 순서 및 빈도로 표시합니다(꺼짐: 녹색, 켜짐: 빨간색, 막힘: 파란색, 마찰: 노란색). [참고: 편의를 위해 잘라낸 코드입니다.] (이미지 출처: Stephen Evanczuk, NXP의 ML_State_Monitor.ipynb Jupyter Notebook 실행)

추가적인 코드 섹션은 앞서 목록 1과 같이 코드 실행이 동일한 모델 생성 기능 정의인 model_create()에 도달할 때까지 추가적인 데이터 분석, 생성, 기타 준비 작업을 제공합니다. 바로 다음 코드 섹션에서는 model_create() 함수를 실행하고 신속한 검증을 위한 요약을 인쇄합니다(그림 13).

그림 13: NXP의 ML_State_Monitor.ipynb Jupyter Notebook은 모델을 생성하고(목록 1 참조) 모델 요약 정보를 표시합니다. (이미지 출처: Stephen Evanczuk, NXP의 ML_State_Monitor.ipynb Jupyter Notebook 실행)

모델 학습 및 평가를 위한 코드 섹션에 이어, ML_State_Monitor.ipynb Jupyter Notebook은 전체 데이터 세트, 학습 데이터 세트, 검증 데이터 세트를 위한 각 오차 행렬을 보여줍니다(학습 데이터 세트에서 제외된 데이터 세트 하위 세트). 이러한 경우, 완전한 데이터 세트의 오차 행렬은 높은 정확성과 함께, 원본 데이터 세트에 적용된 주석과 같이 팬이 실제로는 막힌 상태인데 모델이 데이터 세트의 낮은 비율을 켜짐 상태로 혼동함에 따른 약간의 오차를 보여줍니다(그림14).

그림 14: 개발자는 전체 데이터 세트에 대해 이와 같은 오차 행렬을 확인할 수 있습니다. (이미지 출처: Stephen Evanczuk, NXP의 ML_State_Monitor.ipynb Jupyter Notebook 실행)

다음 코드 섹션에서는 모델이 eIQ 개발 환경에서 지원하는 다양한 추론 엔진에서 사용하는 다양한 모델 유형과 형식으로 내보내집니다(그림 15).

그림 15: NXP의 ML_State_Monitor.ipynb Jupyter Notebook은 개발자가 학습된 모델을 다양한 모델 유형과 형식으로 저장하는 방법을 보여줍니다. (이미지 출처: Stephen Evanczuk, NXP의 ML_State_Monitor.ipynb Jupyter Notebook 실행)

추론 엔진의 선택은 특정 성능 요구 사항을 충족하는 데 매우 중요합니다. 이 애플리케이션의 경우, NXP는 모델이 996MHz에서 실행되는 추론 엔진 하나, 156MHz에서 실행되는 추론 엔진 하나가 포함된 여러 추론 엔진을 대상으로 할 때 모델 크기, 코드 크기, 추론 시간(단일 입력 개체에서 추론을 완료하는 데 소요되는 시간)을 측정했습니다(그림 16 및 17).

그림 16: 규모가 더 큰 모델에는 여기에 나타난 커다란 차이가 적용되지 않지만, 모델 유형의 선택은 모델 크기에 큰 영향을 줄 수 있습니다. (이미지 출처: NXP Semiconductors)

그림 17: RAM 또는 플래시 메모리에서 로딩되거나 프로세서를 156MHz에 비해 높은 996MHz 주파수에서 작동할 때 입력 개체 평가의 추론 시간이 크게 달라집니다. (이미지 출처: NXP Semiconductors)

NXP에 언급되는 내용과 마찬가지로, 본 샘플 애플리케이션은 매우 작은 모델을 사용하기 때문에 수치에 나타난 큰 차이가 복잡한 분류에 사용되는 큰 모델에서는 훨씬 작게 나타날 수 있습니다.

상태 모니터링을 위한 시스템 솔루션 구축

모델 개발 워크플로우의 대화형 탐색을 위한 Jupyter Notebook 외에도, NXP ML State Monitoring App SW Pack은 NXP의 MIMXRT1170-EVK 평가 기판의 설계를 구현하기 위한 완전한 소스 코드를 제공합니다. NXP MIMXRT1176DVMAA 크로스오버 MCU를 기반으로 구축된 평가 기판은 추가 메모리와 여러 인터페이스로 완성된 포괄적인 하드웨어 플랫폼을 제공합니다(그림 18).

그림 18: NXP의 MIMXRT1170-EVK 평가 기판은 NXP i.MX RT1170 계열 크로스오버 MCU에 기반한 애플리케이션 개발을 위한 포괄적인 하드웨어 플랫폼을 제공합니다. (이미지 출처: NXP Semiconductors)

개발자는 NXP 팬 상태 애플리케이션을 사용하여 선택 사항인 NXP FRDM-STBC-AGM01 센서 보드, Arduino 실드, Adafruit4468과 같은 적합한 5V 브러시리스 DC 팬을 통해 MIMXRT1170-EVK 평가 기판을 쌓아 팬 상태를 예측할 수 있습니다(그림 19).

그림 19: 개발자는 MIMXRT1170-EVK 평가 기판에 구축한 단순한 스택을 통해 NXP 팬 상태 샘플 애플리케이션을 테스트할 수 있습니다. (이미지 출처: NXP Semiconductors)

MCUXpresso 통합 개발 환경(IDE)을 사용하여, 개발자들은 애플리케이션을 구성하여 단순히 팬 상태 데이터를 확보하고 저장하거나 즉시 TensorFlow 추론 엔진, DeepViewRT 추론 엔진 또는 Glow 추론 엔진을 사용하여 확보한 데이터에 대한 추론을 실행할 수 있습니다(목록 2).

복사
/* Action to be performed */
#define SENSOR_COLLECT_LOG_EXT                  1   // Collect and log data externally
#define SENSOR_COLLECT_RUN_INFERENCE            2   // Collect data and run inference
 
/* Inference engine to be used */
#define SENSOR_COLLECT_INFENG_TENSORFLOW        1   // TensorFlow
#define SENSOR_COLLECT_INFENG_DEEPVIEWRT        2   // DeepViewRT
#define SENSOR_COLLECT_INFENG_GLOW              3   // Glow
 
/* Data format to be used to feed the model */
#define SENSOR_COLLECT_DATA_FORMAT_BLOCKS       1   // Blocks of samples
#define SENSOR_COLLECT_DATA_FORMAT_INTERLEAVED  2   // Interleaved samples
 
 
/* Parameters to be configured by the user: */
/* Configure the action to be performed */
#define SENSOR_COLLECT_ACTION                   SENSOR_COLLECT_RUN_INFERENCE
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
/* If the SD card log is not enabled the sensor data will be streamed to the terminal */
#define SENSOR_COLLECT_LOG_EXT_SDCARD           1   // Redirect the log to SD card, otherwise print to console

목록 2: 개발자들은 sensor_collect.h 헤더 파일에 포함된 정의를 수정하여 손쉽게 NXP ML State Monitor 샘플 애플리케이션을 구성할 수 있습니다. (코드 출처: NXP Semiconductors)

애플리케이션은 간단한 프로세스 플로우로 작동합니다. main.c의 메인 루틴이 sensor_collect.c에 위치한 루틴인 MainTask라는 작업을 생성합니다.

복사
void MainTask(void *pvParameters)
{
    status_t status = kStatus_Success;
 
    printf("MainTask started\r\n");
 
#if !SENSOR_FEED_VALIDATION_DATA
    status = SENSOR_Init();
    if (status != kStatus_Success)
    {
        goto main_task_exit;
    }
#endif
 
    g_sensorCollectQueue = xQueueCreate(SENSOR_COLLECT_QUEUE_ITEMS, sizeof(sensor_data_t));
    if (NULL == g_sensorCollectQueue)
    {
        printf("collect queue create failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
 
#if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
    uint8_t captClassLabelIdx;
    CAPT_Init(&captClassLabelIdx, &g_SensorCollectDuration_us, &g_SensorCollectDuration_samples);
    g_SensorCollectLabel = labels[captClassLabelIdx];
 
    if (xTaskCreate(SENSOR_Collect_LogExt_Task, "SENSOR_Collect_LogExt_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_LogExt_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
    if (xTaskCreate(SENSOR_Collect_RunInf_Task, "SENSOR_Collect_RunInf_Task", 4096, NULL, configMAX_PRIORITIES - 1, NULL) != pdPASS)
    {
        printf("SENSOR_Collect_RunInf_Task creation failed!\r\n");
        status = kStatus_Fail;
        goto main_task_exit;
    }
#endif

목록 3: NXP ML State Monitor 샘플 애플리케이션에서 MainTask는 데이터를 확보하거나 추론을 실행하는 하위 작업을 호출합니다. (코드 출처: NXP Semiconductors)

MainTask는 sensor_collect.h에서 사용자가 다음과 같이 설정한 정의에 따라 둘 중 하나의 하위 작업을 시작하기 전에 다양한 착수 작업을 수행합니다.

  • SENSOR_COLLECT_ACTION이 SENSOR_COLLECT_LOG_EXT로 설정된 경우, MainTask는 SENSOR_Collect_LogExt_Task() 하위 작업을 시작하여 데이터를 수집하고 구성된 경우 SD 카드에 저장합니다.
  • SENSOR_COLLECT_ACTION이 SENSOR_COLLECT_RUN_INFERENCE로 설정된 경우, MainTask는 SENSOR_Collect_RunInf_Task() 하위 작업을 시작하여 수집된 데이터에 대해 sensor_collect.h에 정의된 추론 엔진(Glow, DeepViewRT 또는 TensorFlow)을 실행하고, SENSOR_EVALUATE_MODEL이 정의된 경우, 결과적인 성능 및 분류 예측을 표시합니다.
복사
if SENSOR_COLLECT_ACTION == SENSOR_COLLECT_LOG_EXT
void SENSOR_Collect_LogExt_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
            bufSizeLog = snprintf(buf, bufSize, "%s,%ld,%d,%d,%d,%d,%d,%d,%d\r\n", g_SensorCollectLabel, (uint32_t)(sensorData.ts_us/1000),
                    sensorData.rawDataSensor.accel[0], sensorData.rawDataSensor.accel[1], sensorData.rawDataSensor.accel[2],
                    sensorData.rawDataSensor.mag[0], sensorData.rawDataSensor.mag[1], sensorData.rawDataSensor.mag[2],
                    sensorData.temperature);
 
#if SENSOR_COLLECT_LOG_EXT_SDCARD
                SDCARD_CaptureData(sensorData.ts_us, sensorData.sampleNum, g_SensorCollectDuration_samples, buf, bufSizeLog);
#else
                printf("%.*s", bufSizeLog, buf);
[code deleted for simplicity]
    }
 
    vTaskDelete(NULL);
}
#elif SENSOR_COLLECT_ACTION == SENSOR_COLLECT_RUN_INFERENCE
[code deleted for simplicity]
 
void SENSOR_Collect_RunInf_Task(void *pvParameters)
{
[code deleted for simplicity]
    while (1)
    {
[code deleted for simplicity]
                /* Run Inference */
                tinf_us = 0;
                SNS_MODEL_RunInference((void*)g_clsfInputData, sizeof(g_clsfInputData), (int8_t*)&predClass, &tinf_us, SENSOR_COLLECT_INFENG_VERBOSE_EN);
 
[code deleted for simplicity]
#if SENSOR_EVALUATE_MODEL
                /* Evaluate performance */
                validation.predCount++;
                if (validation.classTarget == predClass)
                {
                    validation.predCountOk++;
                }
                PRINTF("\rInference %d?%d | t %ld us | count: %d/%d/%d | %s      ",
                       validation.classTarget, predClass, tinf_us, validation.predCountOk,
                       validation.predCount, validation.predSize, labels[predClass]);
 
                tinfTotal_us += tinf_us;
                if (validation.predCount >= validation.predSize)
                {
                    printf("\r\nPrediction Accuracy for class %s %.2f%%\r\n", labels[validation.classTarget],
                            (float)(validation.predCountOk * 100)/validation.predCount);
                    printf("Average Inference Time %.1f (us)\r\n", (float)tinfTotal_us/validation.predCount);
                    tinfTotal_us = 0;
                }
#endif
 
    }
 
exit_task:
    vTaskDelete(NULL);
}
#endif  /* SENSOR_COLLECT_ACTION */

목록 4: NXP ML State Monitor 샘플 애플리케이션은 센서 데이터를 확보하고 확보된 데이터에 대해 선택한 추론 엔진을 실행하기 위한 기본적인 설계 패턴을 보여줍니다. (코드 출처: NXP Semiconductors)

NXP ML State Monitor App SW Pack은 필요한 드라이버와 미들웨어의 완전한 세트와 함께 전체적인 소스 코드를 제공하므로, 개발자는 애플리케이션을 손쉽게 확장하여 기능을 추가하거나 커스텀 개발을 위한 시작점으로 사용할 수 있습니다.

결론

IoT 및 기타 응용 분야 스마트 제품의 에지에서 ML을 구현하면 강력한 기능을 사용할 수 있지만 엔터프라이즈급 애플리케이션을 위해 개발된 ML 도구 및 방식을 적용하기 어려울 수 있습니다. 크로스오버 프로세서와 특수 모델 개발 소프트웨어를 구성하는 NXP 개발 플랫폼을 통해, ML 전문가와 ML 경험이 거의 또는 전혀 없는 개발자 모두 효율적인 에지 성능을 위한 요구 사항을 충족하기 위해 특별히 설계된 ML 애플리케이션을 효과적으로 만들 수 있습니다.

DigiKey logo

면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.

작성자 정보

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk는 전자 산업에 관해 하드웨어, 소프트웨어, 시스템, 응용 제품(예: IoT)을 비롯한 광범위한 주제에 대해 20년 이상 집필한 경력을 갖고 있습니다. 그는 신경 과학의 뉴런 네트워크 박사 학위를 받았으며항공 우주 산업 분야의 광범위하게 분포된 보안 시스템 및 알고리즘 가속 메서드 관련 업무를 수행했습니다. 현재, 기술 및 엔지니어링에 대해 기사를 쓰지 않을 때에는 인식 및 추천 시스템에 대한 심층적 학습 응용 프로그램을 연구하고 있습니다.

게시자 정보

DigiKey 북미 편집자