TFLite 모델 컨버터

Updated:

TFLite에 대한 개발 workflow를 연습할 수 있는 GitHub repo my-tf-training에 대한 설명서이다.

이번 글은 TensorFlow로 생성한 모델 파일을 TFLite 모델 파일로 변환하는 과정을 살펴보겠다. 이 변환 과정이 필요한 이유는 TensorFlow는 Protocol Buffers를 사용해서 pb 파일로 모델을 저장하는데 반해, TFLite는 FlatBuffers를 사용해서 tflite 파일로 모델을 저장하기 때문이다. FlatBuffers가 Protocol Buffers 보다 작고 가볍기 때문에 TFLite에 적합니다. TFLite는 IOT나 embedded 환경을 위해서 설계되었기 때문에 빠른 성능을 위해서는 작고 가벼운 포맷이 필요했다.

1. 모델 변환하기(Convert a model)

생성해 둔 TensorFlow 모델을 TFLite 모델로 변환해보자. 아래 두가지 방법을 기술하였으니, 두가지 방법으로 실행해보고 편한 쪽으로 본인의 툴로 선정하면 되겠다.

1.1. Command line tool(tflite_convert)

031-convert-tflite.sh 파일에 tflite_convert 기본 명령 옵션을 적어두었다. sh 파일을 실행하면 ouput_file에 지정한 saved_model/my_model.cmdline.tflite 파일이 생성된 것을 확인할 수 있다. command lien tool은 간단히 사용하기에 좋다.

tflite_convert \
  --saved_model_dir=./saved_model/my_model \
  --output_file=./saved_model/my_model.cmdline.tflite

1.2. Python API Converter(TFLiteConverter)

Python API는 tensorflow.lite.TFLiteCnveter 클래스를 사용한다. TensorFlow 모델을 로드하고 convert()를 실행하면 tflite 포맷으로 저장이 된다. 032-convert-tflite.py 파일에 conveter 예시 코드를 볼 수 있다.

converter = tf.lite.TFLiteConverter.from_saved_model('saved_model/my_model')
tflite_model = converter.convert()
open("saved_model/my_model.tflite", "wb").write(tflite_model)

Python API는 quantization 옵션을 제공한다. quantization은 한국어로 보통 양자화라고 번역된다. 양자화는 float32로 학습된 weight값들을 단순화 시키는 작업을 일컫는다. float32로 학습된 결과를 이 보다 작은 data 타입인 float32, int8 등의 형태로 변환하는 것이다. 여기서 말하는 변환은 대부분은 세밀한 데이터값을 버리는 작업이므로 전체적으로 보면 모델의 정확도를 잃어버리는 작업이 된다. 정확도를 잃으면서 작은 모델 사이즈를 얻게 된다. 작은 모델 사이즈는 inference 시간을 줄여준다. 따라서 quantization은 모델 사이즈를 줄여서 정확도는 떨어지는 대신에 빠른 추론 시간을 얻게 되는 작업으로 볼 수 있다. (quantization은 많은 이야기가 있는 주제이므로 시간이 나면 따로 정리를 해보겠다.)

TFLiteConveter의 quantization은 아래 예시처럼 실행할 수 있다. 예시에서는 flaot16으로 quantization을 실행하였다.

converter = tf.lite.TFLiteConverter.from_saved_model('saved_model/my_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()
open("saved_model/my_model.quant.tflite", "wb").write(tflite_quant_model)

032-convert-tflite.py 파일을 실행하면 saved_model 폴더에 my_model.tflite, my_model.quant.tflite 파일이 생성된 것을 볼 수 있다.

2. TFLite 변환한 모델 살펴보기

TFLite 변환한 모델 파일을 살펴보자. TFLite Simple regression 모델 생성 글에서 소개했던 netron 시각화 툴이 tflite 파일 포맷도 지원을 하니 결과물을 살펴보자.

TensorFlow 모델 포맷에서의 Dense Layer가 TFLite 모델로 변환되면서 FullyConnected Layer로 변환되었다. TensorFlow 모델 파일에서 TFLite 모델로의 변환 과정은 이와같이 같은 동작을 하는 TFLite 함수로 변환되는 과정이다.

04-get-details-tflite.py 파일에서는 tensorflow.lite의 get_tensor_details 함수를 이용해서 모델 정보를 확인하는 예시가 있다. 한번 실행해보고 넘어가자.

interpreter = tf.lite.Interpreter(model_path="./saved_model/my_model.tflite")

for item in interpreter.get_tensor_details():
    for key in item.keys():
        print("%s : %s" % (key, item[key]))
    print("")


Leave a comment