[TFLite] 1. 안드로이드와 텐서플로 라이트 입문
안드로이드와 텐서플로 라이트 입문
안드로이드와 텐서플로 라이트를 이용한 앱 개발 워크플로
안드로이드와 텐서플로 라이트를 이용한 앱 개발 워크플로는 딥러닝 모델 개발과 안드로이드 앱 개발로 나뉩니다.
딥러닝 모델 개발
- 파이썬과 텐서플로를 이용하여 모델을 설계, 훈련
- 모바일에서 사용 가능하도록 텐서플로 라이트 모델로 변환하여 저장
- 최종 산출물: tflite 파일
안드로이드 앱 개발
- UI 개발 단계: UI 개발, 이벤트를 비즈니스 로직과 연결
- 비즈니스 로직 단계: UI로부터 전달받은 이벤트 처리, 딥러닝 모델을 불러와 데이터 입력 및 추론 결과 처리 로직 구현
- 최종 산출물: apk 파일
딥러닝 모델을 활용하여 안드로이드 앱을 개발할 때는 텐서플로 라이트와 안드로이드 플랫폼 등 여러 프레임워크를 이용하기 때문에 설치할 것도 많고 환경 구축도 복잡하지만, 그 과정을 극복하고 나면 쉽게 개발을 할 수 있습니다.
안드로이드 입문
기존에는 딥러닝의 추론 결과를 안드로이드 앱에서 이용하기 위해서는 다음의 과정이 필요했습니다.
- 데이터와 함께 추론 결과를 클라이언트에 요청
- 클라이언트가 서버에 추론 결과를 요청
- 서버가 딥러닝 모델에 데이터를 입력하여 추론 결과를 받음
- 서버가 클라이언트에게 추론 결과를 전달
하지만 최근 안드로이드는 기기에서 직접 딥러닝 모델을 동작시키는 온디바이스 AI를 위한 컴퓨팅 파워를 갖춰가고 있으며, 텐서플로는 모바일과 IoT에 특화된 딥러닝 프레임워크인 텐서플로 라이트를 공개하며 그 과정을 하나로 줄였습니다.
- 데이터를 모바일 디바이스에 있는 딥러닝 모델에 전달하여 추론 결과를 받음
안드로이드 플랫폼 아키텍쳐
안드로이드 플랫폼 아키텍쳐는 Low level부터 다음의 순서로 구성되어 있습니다.
[리눅스 커널] ➡ [하드웨어 추상화 계층] ➡ [안드로이드 런타임] & [네이티브 C/C++ 라이브러리] ➡ [자바 API 프레임워크] ➡ [시스템 앱]
- 커널: 하드웨어와 소프트웨어 사이에서 하드웨어를 제어, 고나리하고 소프트웨어에 하드웨어 자원을 제공
- 하드웨어 추상화 계층: 하드웨어의 여러 기능을 인터페이스 형태로 상위 계층에 제공
- 안드로이드 런타임 & 네이티브 C/C++ 라이브러리: 하드웨어 추상화 계층이 제공하는 인터페이스를 호출하여 디바이스의 기능을 이용
- 안드로이드 런터임: 자바의 변환 코드(바이트 코드)인 DEX 파일을 실행하는 가상 머신
- 네이티브 C/C++ 라이브러리: C와 C++로 개발한 코드를 자바에서 호출 가능하도록 한 라이브러리
- 자바 API 프레임 워크: 앱 개발에 필수적인 기능을 제공하는 자바 기반의 API.
- 시스템 앱: 플랫폼에 기본적으로 포함되어 사용자가 기기를 이용하는데 필요한 필수적인 기능을 제공하는 앱 모음 (전화, 이메일, 카메라 등)
안드로이드 구성 요소
-
액티비티: 사용자에게 보이는 화면 UI를 담당. 액티비티의 생명 주기에 따라 onCreate, onStart, onResume, onPause, onStop, onDestroy라는 콜백 메서드들이 호출.
-
서비스: 기기의 화면에 표시되지 않고 백그라운드에서 실행되는 작업을 처리하는 구성 요소. (네트워크를 이용한 데이터 송수신, 음원 재생, 대용량 파일 입출력 등)
- 백그라운드 서비스: UI와 상관없는 작업을 처리할 때 사용
- 포어그라운드 서비스: UI가 필요한 작업을 처리할 때 사용
- 바인드 서비스: 클라이언트-서버 아키텍쳐를 제공할 때 사용. 서비스가 서버의 역할을 하고 서비스를 바인딩한 구성 요소가 클라이언트 역할을 함.
-
콘텐트 프로바이더: 앱 내에서 생성하거나 관리하는 데이터를 외부에 제공하는 역할. 다른 앱의 콘텐트 프로바이더를 호출하여 해당 앱의 데이터에 접근하거나 읽고 쓸 수도 있다. 데이터 접근 권한과 쿼리에 대한 이해가 필요함.
-
브로드캐스트 리시버: 브로드캐스팅된 메시지를 받는 역할. 브로드캐스트 리시버는 구독자 역할, 인텐트는 메시지가 되며, 이벤트 관리자는 안드로이드 운영체제가 담당하는 발생 - 구독 패턴을 보인다. 브로드캐스팅을 이용하면 발행자는 알리고 싶은 이벤트가 발생했을 때 원하는 정보를 인텐트에 담아 불특정 다수 또는 특정 패키지를 지정하여 보내면 구독자는 원하는 메시지 필터를 미리 동록하여 브로드배스팅된 메시지 가운데 원하는 것을 골라서 수신한다.
브로드캐스팅의 종류
- 명시적 브로드캐스팅: 발행자가 브로드캐스트를 요청할 때부터 어떤 패키지에 브로드캐스팅할 지 지정.
- 암시적 브로드캐스팅: 모든 패키지를 대상으로 브로드캐스팅.
브로드캐스팅을 수신하는 방법
- 안드로이드 매니패스트 이용(정적인 방법): 명시적 브로드캐스팅 수신만 가능. (예외 동작)
- 코드상에서 컨텍스트에 수신하고자 하는 인텐트를 등록
-
인텐트: 구성 요소 간의 정보 전달을 위한 메시지 역할.
-
인텐트의 구성 요소
구성 요소 역할 컴포넌트 이름 인텐트를 전달할 대상 지정 (컨텍스트 + 대상 클래스) 액션 인텐트를 통해 어떤 작업을 수행할 지 전달(String) 데이터 인텐트가 가지고 있는 데이터(Uri) 카테고리 인텐트의 종류 구분(String) 엑스트라 인텐트 처리에 필요한 데이터(key-value) 플래그 인텐트의 메타 데이터(int)
-
텐서플로 라이트 입문
텐서플로 라이트는 모바일과 IoT 기기에 딥러닝 모델을 배포하고 추론하기 위해 구글에서 만든 라이브러리로, 텐서플로 모델을 안드로이드, iOS 또는 임베디드 기기에서 사용할 수 있는 모델로 변환합니다. 모바일이나 임베디드 기기는 가용한 컴퓨팅 자원이 제한적인 만큼 텐서플로 라이트는 모델 경량화에 중점을 둡니다.
텐서플로 라이트의 구성과 특징
텐서플로 라이트는 컨버터와 인터프리터로 이루어집니다.
- 컨버터: 텐서플로 모델을 모바일 환경에서 동작 가능하도록 변환. 파이썬 개발 환경에서 활용.
- 인터프리터: 변환된 모델을 모바일 및 임베디드 환경에서 실제로 동작시킴. 모바일 및 임베디드 개발 환경에서 활용.
텐서플로 라이트의 특징
-
컴퓨팅 파워가 부족한 환경에서도 사용할 수 있도록 모델의 크기를 줄임.
-
구글이 게임 등의 고성능을 요구하는 앱을 위해 만든 FlatBuffers 라이브러리를 이용하기 때문에 이식성과 효율성이 좋음
-
안드로이드의 경우 GPU 가속 외에도 NNAPI(Neural Network API) 위임을 지원하기 때문에 기기 환경에 따라 추가적으로 성능을 향상할 수 있음.
-
Float16 양자화, 정수 양자화, 동적 범위 양자화 등의 양자화 기술로 더욱 최적화된 모델 설계 가능
-
다양한 플랫폼과 다양한 언어를 지원하여 생산성이 좋음.
-
MobileNet, Deeplab v3, Mobile BERT 등 이미 학습이 완료된 다양한 최신 모델을 제공하여 안드로이드 앱에 최신 딥러닝 모델을 즉각 적용할 수 있는 환경을 갖추고 있음.
텐서플로와 텐서플로 라이트의 비교
구분 | 텐서플로 | 텐서플로 라이트 |
---|---|---|
개발 언어 | 파이썬 | 파이썬 + 자바/코틀린 |
역할 | 딥러닝 모델 개발 | 딥러닝 모델 변환, 안드로이드에서 딥러닝 모델 실행 |
연산자 | 텐서플로의 모든 연산자 | 텐서플로의 일부 연산자 (연산자 추가 가능) |
텐서플로 라이트의 기술적 제약
- 연산자 제약
- 텐서플로 라이트는 텐서플로의 모든 연산자를 지원하지는 않기 때문에, 직접 개발한 텐서플로 모델이 텐서플로 라이트에서 지원하지 않는 연산자를 사용한다면 모델 변환이 불가능합니다.
- 텐서플로 라이트가 지원하는 연산자 중에도 일부는 성능 문제로 인해 특정 패턴만을 사용하도록 제한합니다.
- 텐서플로 연산자를 텐서플로 라이트 빌드에 추가하는 ‘연산자 선택’ 기능을 사용해야 합니다.
- 텐서플로 팀은 앞으로 모든 확장자를 지원할 계획이라고 밝혔습니다.
- 학습 제약
- 학습은 추론보다 훨씬 더 많은 컴퓨팅 자원과 시간을 필요로 하기 때문에 기기 내에서는 추론만 가능합니다.
- 정적 학습은 학습이 완료된 모델로 추론만 가능한 데 반해, ‘온라인 학습(동적 학습)’ 은 기기에서 새로운 데이터를 받으며 학습을 진행할 수 있습니다.
- 텐서플로 라이트 로드맵에 기기 내 학습이 포함되어 있는 것으로 미루어보아 조만간 기기 내 학습을 지원할 것으로 예상됩니다.
Leave a comment