[TFLite] 1. 안드로이드와 텐서플로 라이트 입문

4 minute read

안드로이드와 텐서플로 라이트 입문


안드로이드와 텐서플로 라이트를 이용한 앱 개발 워크플로


안드로이드와 텐서플로 라이트를 이용한 앱 개발 워크플로는 딥러닝 모델 개발안드로이드 앱 개발로 나뉩니다.

딥러닝 모델 개발

  1. 파이썬과 텐서플로를 이용하여 모델을 설계, 훈련
  2. 모바일에서 사용 가능하도록 텐서플로 라이트 모델로 변환하여 저장
  3. 최종 산출물: tflite 파일

안드로이드 앱 개발

  1. UI 개발 단계: UI 개발, 이벤트를 비즈니스 로직과 연결
  2. 비즈니스 로직 단계: UI로부터 전달받은 이벤트 처리, 딥러닝 모델을 불러와 데이터 입력 및 추론 결과 처리 로직 구현
  3. 최종 산출물: apk 파일

딥러닝 모델을 활용하여 안드로이드 앱을 개발할 때는 텐서플로 라이트와 안드로이드 플랫폼 등 여러 프레임워크를 이용하기 때문에 설치할 것도 많고 환경 구축도 복잡하지만, 그 과정을 극복하고 나면 쉽게 개발을 할 수 있습니다.


안드로이드 입문


기존에는 딥러닝의 추론 결과를 안드로이드 앱에서 이용하기 위해서는 다음의 과정이 필요했습니다.

  1. 데이터와 함께 추론 결과를 클라이언트에 요청
  2. 클라이언트가 서버에 추론 결과를 요청
  3. 서버가 딥러닝 모델에 데이터를 입력하여 추론 결과를 받음
  4. 서버가 클라이언트에게 추론 결과를 전달

하지만 최근 안드로이드는 기기에서 직접 딥러닝 모델을 동작시키는 온디바이스 AI를 위한 컴퓨팅 파워를 갖춰가고 있으며, 텐서플로는 모바일과 IoT에 특화된 딥러닝 프레임워크인 텐서플로 라이트를 공개하며 그 과정을 하나로 줄였습니다.

  1. 데이터를 모바일 디바이스에 있는 딥러닝 모델에 전달하여 추론 결과를 받음


안드로이드 플랫폼 아키텍쳐

안드로이드 플랫폼 아키텍쳐는 Low level부터 다음의 순서로 구성되어 있습니다.

[리눅스 커널] ➡ [하드웨어 추상화 계층] ➡ [안드로이드 런타임] & [네이티브 C/C++ 라이브러리] ➡ [자바 API 프레임워크] ➡ [시스템 앱]

  • 커널: 하드웨어와 소프트웨어 사이에서 하드웨어를 제어, 고나리하고 소프트웨어에 하드웨어 자원을 제공
  • 하드웨어 추상화 계층: 하드웨어의 여러 기능을 인터페이스 형태로 상위 계층에 제공
  • 안드로이드 런타임 & 네이티브 C/C++ 라이브러리: 하드웨어 추상화 계층이 제공하는 인터페이스를 호출하여 디바이스의 기능을 이용
    • 안드로이드 런터임: 자바의 변환 코드(바이트 코드)인 DEX 파일을 실행하는 가상 머신
    • 네이티브 C/C++ 라이브러리: C와 C++로 개발한 코드를 자바에서 호출 가능하도록 한 라이브러리
  • 자바 API 프레임 워크: 앱 개발에 필수적인 기능을 제공하는 자바 기반의 API.
  • 시스템 앱: 플랫폼에 기본적으로 포함되어 사용자가 기기를 이용하는데 필요한 필수적인 기능을 제공하는 앱 모음 (전화, 이메일, 카메라 등)


안드로이드 구성 요소

  1. 액티비티: 사용자에게 보이는 화면 UI를 담당. 액티비티의 생명 주기에 따라 onCreate, onStart, onResume, onPause, onStop, onDestroy라는 콜백 메서드들이 호출.

    image-20210802153241503

  2. 서비스: 기기의 화면에 표시되지 않고 백그라운드에서 실행되는 작업을 처리하는 구성 요소. (네트워크를 이용한 데이터 송수신, 음원 재생, 대용량 파일 입출력 등)

    • 백그라운드 서비스: UI와 상관없는 작업을 처리할 때 사용
    • 포어그라운드 서비스: UI가 필요한 작업을 처리할 때 사용
    • 바인드 서비스: 클라이언트-서버 아키텍쳐를 제공할 때 사용. 서비스가 서버의 역할을 하고 서비스를 바인딩한 구성 요소가 클라이언트 역할을 함.

image-20210802153833523

  1. 콘텐트 프로바이더: 앱 내에서 생성하거나 관리하는 데이터를 외부에 제공하는 역할. 다른 앱의 콘텐트 프로바이더를 호출하여 해당 앱의 데이터에 접근하거나 읽고 쓸 수도 있다. 데이터 접근 권한과 쿼리에 대한 이해가 필요함.

    image-20210802154350684


  2. 브로드캐스트 리시버: 브로드캐스팅된 메시지를 받는 역할. 브로드캐스트 리시버는 구독자 역할, 인텐트는 메시지가 되며, 이벤트 관리자는 안드로이드 운영체제가 담당하는 발생 - 구독 패턴을 보인다. 브로드캐스팅을 이용하면 발행자는 알리고 싶은 이벤트가 발생했을 때 원하는 정보를 인텐트에 담아 불특정 다수 또는 특정 패키지를 지정하여 보내면 구독자는 원하는 메시지 필터를 미리 동록하여 브로드배스팅된 메시지 가운데 원하는 것을 골라서 수신한다.

    image-20210802155544086


    브로드캐스팅의 종류

    • 명시적 브로드캐스팅: 발행자가 브로드캐스트를 요청할 때부터 어떤 패키지에 브로드캐스팅할 지 지정.
    • 암시적 브로드캐스팅: 모든 패키지를 대상으로 브로드캐스팅.


    브로드캐스팅을 수신하는 방법

    • 안드로이드 매니패스트 이용(정적인 방법): 명시적 브로드캐스팅 수신만 가능. (예외 동작)
    • 코드상에서 컨텍스트에 수신하고자 하는 인텐트를 등록


  3. 인텐트: 구성 요소 간의 정보 전달을 위한 메시지 역할.

    • 인텐트의 구성 요소

      구성 요소 역할
      컴포넌트 이름 인텐트를 전달할 대상 지정 (컨텍스트 + 대상 클래스)
      액션 인텐트를 통해 어떤 작업을 수행할 지 전달(String)
      데이터 인텐트가 가지고 있는 데이터(Uri)
      카테고리 인텐트의 종류 구분(String)
      엑스트라 인텐트 처리에 필요한 데이터(key-value)
      플래그 인텐트의 메타 데이터(int)



텐서플로 라이트 입문


텐서플로 라이트는 모바일과 IoT 기기에 딥러닝 모델을 배포하고 추론하기 위해 구글에서 만든 라이브러리로, 텐서플로 모델을 안드로이드, iOS 또는 임베디드 기기에서 사용할 수 있는 모델로 변환합니다. 모바일이나 임베디드 기기는 가용한 컴퓨팅 자원이 제한적인 만큼 텐서플로 라이트는 모델 경량화에 중점을 둡니다.


텐서플로 라이트의 구성과 특징

텐서플로 라이트는 컨버터인터프리터로 이루어집니다.

  • 컨버터: 텐서플로 모델을 모바일 환경에서 동작 가능하도록 변환. 파이썬 개발 환경에서 활용.
  • 인터프리터: 변환된 모델을 모바일 및 임베디드 환경에서 실제로 동작시킴. 모바일 및 임베디드 개발 환경에서 활용.


텐서플로 라이트의 특징

  • 컴퓨팅 파워가 부족한 환경에서도 사용할 수 있도록 모델의 크기를 줄임.

  • 구글이 게임 등의 고성능을 요구하는 앱을 위해 만든 FlatBuffers 라이브러리를 이용하기 때문에 이식성과 효율성이 좋음

  • 안드로이드의 경우 GPU 가속 외에도 NNAPI(Neural Network API) 위임을 지원하기 때문에 기기 환경에 따라 추가적으로 성능을 향상할 수 있음.

  • Float16 양자화, 정수 양자화, 동적 범위 양자화 등의 양자화 기술로 더욱 최적화된 모델 설계 가능

  • 다양한 플랫폼과 다양한 언어를 지원하여 생산성이 좋음.

  • MobileNet, Deeplab v3, Mobile BERT 등 이미 학습이 완료된 다양한 최신 모델을 제공하여 안드로이드 앱에 최신 딥러닝 모델을 즉각 적용할 수 있는 환경을 갖추고 있음.


텐서플로와 텐서플로 라이트의 비교

구분 텐서플로 텐서플로 라이트
개발 언어 파이썬 파이썬 + 자바/코틀린
역할 딥러닝 모델 개발 딥러닝 모델 변환, 안드로이드에서 딥러닝 모델 실행
연산자 텐서플로의 모든 연산자 텐서플로의 일부 연산자 (연산자 추가 가능)


텐서플로 라이트의 기술적 제약

  1. 연산자 제약
    • 텐서플로 라이트는 텐서플로의 모든 연산자를 지원하지는 않기 때문에, 직접 개발한 텐서플로 모델이 텐서플로 라이트에서 지원하지 않는 연산자를 사용한다면 모델 변환이 불가능합니다.
    • 텐서플로 라이트가 지원하는 연산자 중에도 일부는 성능 문제로 인해 특정 패턴만을 사용하도록 제한합니다.
    • 텐서플로 연산자를 텐서플로 라이트 빌드에 추가하는 ‘연산자 선택’ 기능을 사용해야 합니다.
    • 텐서플로 팀은 앞으로 모든 확장자를 지원할 계획이라고 밝혔습니다.
  2. 학습 제약
    • 학습은 추론보다 훨씬 더 많은 컴퓨팅 자원과 시간을 필요로 하기 때문에 기기 내에서는 추론만 가능합니다.
    • 정적 학습은 학습이 완료된 모델로 추론만 가능한 데 반해, ‘온라인 학습(동적 학습)’ 은 기기에서 새로운 데이터를 받으며 학습을 진행할 수 있습니다.
    • 텐서플로 라이트 로드맵에 기기 내 학습이 포함되어 있는 것으로 미루어보아 조만간 기기 내 학습을 지원할 것으로 예상됩니다.



Categories:

Updated:

Leave a comment