TF Lite
- TF Lite는 mobile, embeded, IoT devce와 같은 디바이스에서 on-device ML을 할 수 있도록 도와주는 툴이다.
- 일단 TF Lite에 대해서, 그리고 이를 가속하는 방법인 delegate에 대해 알아보려 한다.
Key feature
- TF Lite는 on-device learning에 최적화 되어 latency, privacy, connectivity (no internet connection), size (model size), power consumption. 이 5가지를 최적화 해준다.
- Android, iOS, embeded linux, microcontroller 와 같은 multi-platform 지원한다.
- Java, Swift, Objective-C, C++, and Python 와 같은 여러 언어 지원한다.
- Hardware acceleration, model optimization을 통한 high performance.
- 공식 문서에 여러 예제들이 있음ㅎ
Development workflow
- TF Lite는 크게 다음의 2가지 과정으로 나뉜다.
- TF Lite model을 만드는 (혹은 converting 하는) 과정과 이를 이용하여 inference 하는 과정.
1. Generate a TensorFlow Lite model (TF model을 TF Lite model로 convert 하는 과정)
- TFLite model은매우 효율적이고 유연한 (휴대성이 있는) cross platform serialization library인 FlatBuffer (.tflite)로 이루어져 있다.
- FlatBuffer는 TF의 protocol buffer보다 크기도 작고, latency도 줄여 빠른 inference를 할 수 있게 해준다.
- 작은 크기는 Flatbuffer가 protocol buffer에 비해 small code footprint를 가지기 때문
- 빠른 inference는 별도의 parsing, unpacking 과정 없이 데이터에 직접적으로 접근하기 때문
- TFLite는 모델 설명을 위한 human-readable metadata와 on-devide inference시 전, 후처리를 위한 machine-readable metadata를 가진다. (link)
- 다음의 여러가지 방법으로 TF Lite model로 converting 할 수 있다.
2. Run Inference
- Inference를 한다는것은 TF Lite model이 device에서 별도의 입력을 받아 추론을 하는것을 말한다.
- 두가지 방법으로 inference 할 수 있다.
- Model without metadata TF metadata 없이 TF Lite interpreter를 이용하여 inference 한다.
- Model with metadata TF Lite task library 를 이용해서 기본 내장 API를 이용하거나, TF Lite Support Library 를 이용해서 custom lnference pipeline을 만든다. Android의 경우 android studio ML model binding 이나 TF Lite code generator 를 이용해서 자동으로 code wrapper를 만들 수 있다. 나머지 언어는 아직이다. 역시 구글이라 그런지 안드로이드 먼저다.
- Android, iOS와 같은 mobile device는 delegate를 이용하여 hardware acceleration을 할 수 있다.
TF Lite delegate
- Delegate. 대리자라는 뜻으로 TF Lite delegate는 tensor graph 연산의 일부분 혹은 전체를 다른 executor (GPU, DSP)에 위임하여 대리연산을 시킨다.
- TF Lite를 이용하지 않고 저 다른 executor (GPU, DSP)를 이용하기 위해서는 low-level SDK에 접근이 필요한데 이는 굉장히 어렵다. 따라서 TF Lite delegate를 사용하여 여러 executor에 접근하고, 연산을 가속화 한다.
- TF delegate는 TF Lite가 모바일과 같은 적은 리소스를 가진 디바이스에서 빠르게 연산을 할 수 있게 만들어준다.
- Delegates enable hardware acceleration of TensorFlow Lite models by leveraging on-device accelerators such as the GPU and Digital Signal Processor (DSP).
- 가령, 우리는 GPU를 사용하게 되면 행렬 연산을 가속화 할 수 있는것을 알 수 있다. GPU delegate를 통하여 GPU에 접근하고, 연산을 가속화 시킨다.
- By default, TensorFlow Lite utilizes CPU kernels that are optimized for the ARM Neon instruction set.
- ARM Neon은 한번에 여러 연산을 하기 위한 SIMD (Single Insturction Multiple Data) 을 사용하기 위함이다. ARM Neon delegate라고 볼 수 있겠다.
- 기본적으로 TF Lite는 ARM Neon 명령어에 최적화된 CPU kernel을 이용한다. (ARM Neon 아니면 ML에 적합하지는 않다...)
- 대부분의 mobile phone은 arm architecuture의 cpu chip을 이용하고 있고, 때문에 ARM Neon을 사용 할 수 있다.
- GPUs can provide upto a 5x speedup in latency, while the Qualcomm® Hexagon DSP has shown to reduce power consumption upto 75% in our experiments.
- mobile폰은 ML을 가속화 하기 위한 것들을 가지고 있는 경우가 많은데 대표적으로 GPU와 DSP moduel 이다.
- 이러한 GPU, DSP를 이용하기 위해서 low level SDK인 OpenCL과 OpenGL이 사용된다.
- TensorflowLite Delegate API는 TFLite runtime과 이러한 low level SDK(openCL, openGL) 사이의 bridge 역할을 하여 acceration을 지원하게 된다.
- 밑의 그림은 ARM Neon 이용을 위한 CPU kernel과 다른 HW를 이용하기 위한 Delegation을 보여준다.
Choosing a Delegate
- TF Lite는 기본적으로 여러가지 delegate를 지원한다.
- 타겟으로 하는 플랫폼 (보통 android 아니면 iOS) 과 모델 타입 (float type or quantization) 에 따라 여러delegate가 적용되게 된다.
Delegates by Platform
Cross-platform (Android & iOS)
- GPU delegate Android, iOS 두 플랫폼 모두 GPU delegate 지원한다. GPU delegate는 GPU가 지원 가능한 32-bit 혹은 16-bit의 float based model로 최적화를 해준다. 또한 float based model과 동일한 성능을 가지는 8-bit quantize model도 지원한다. 자세한건 link 참조
Android
- NNAPI delegate for newer Android devices (NPU)
- Hexagon delegate for older Android devices (퀄컴 헥사곤 DSP)
iOS
- Core ML delegate for newer iPhones and iPads (if Neural Engine is available) Core ML delegate to accelerate inference for 32-bit or 16-bit floating-point models.
Delegates by model type
- 각 delegate마다 지원하는 data type이 다르다.