Google Coral, TensorFlow Lite 이해하기
Google Coral의 Edge TPU는 낮은 전력 소모 대비 빠른 신경망 성능을 제공하기 위해 특정 신경망/아키텍처 세트를 지원한다. Edge TPU는 CNN(Convolutional neural network) 등 딥-피드 포워드 신경망을 실행할 수 있는데, 8비트 양자 처리를 위해 특별히 컴파일된 TensorFlow Lite 모델만 지원한다.
TensorFlow Lite는 모바일 및 임베디드 디바이스를 위해 설계된 TensorFlow의 경량 버전으로 모델 및 커널 모두가 작기 때문에 가벼운 추론을 가능하게 한다. 단, TensorFlow Lite를 사용하면 모델을 직접 학습할 수 없기 때문에 도구를 사용해 TensorFlow 파일(.pb 등)을 TensorFlow Lite(.tflite)로 변환해야 한다.
Tensor Flow는 Edge TPU에서 필요로 하는 양자화라는 모델 최적화 기법을 지원한다. 여기서 모델 양자화는 모든 32비트 부동-소수점을 8비트 고정-소수점으로 변환하는 것을 의미하는데 이는 모델을 좀 더 콤팩트화 해 빠른 처리를 할 수 있도록 도와준다. (명확하지는 않지만, 비트(bit) 수가 달라도 신경만 추론 정밀/정확도에는 영향을 받지 않는다고 한다)
아래의 그림은 Edge TPU 와 호횐되는 모델을 만들기 위한 기본 프로세스로, 대부분의 워크플로우는 표준 TensorFlow 도구를 사용하고 있다. TensorFlow Lite 모델을 만들면 다음에 Edge TPU 컴파일러를 사용해 Edge TPU와 호환되는 .tflite 파일을 만들게 된다.
물론 EdgeTPU를 위해 이 교과서적인 절차를 모두 따를 필요는 없다. 대신 Edge TPU와 호환되는 기존의 Tensor Flow 모델을 독자적인 데이터 세트로 재학습 할 때 레퍼런스가 되기도 한다.
모델 조건
실행시 Edge TPU를 최대한 활용하는 독지적인 TensorFlow 모델을 구축하는 경우 아래 조건을 만족 시킬 필요가 있다.
- TensorFlow 파라미터는 양자화 된다 (8비트 고정-소수점). 양자화 대응 트레이닝을 사용할 필요가 있다. (학습 이후 양자화는 불필요)
- TensorFlow 크기는 일정하며 동적으로 변하지 않는다.
- 모델 파라미터(TensorFlow 바이어스)는 컴파일 시 변하지 않는다.
- TensorFlow는 1차원, 2차원 3차원 중 하나이며, 차원수가 3보다 크면 가장 안쪽의 3개 차원만 1보다 큰 사이즈가 된다.
- 이 모델은 Edge TPU에서 지원하는 행위만 사용한다
- 모델이 이런 조건을 완전히 충족하지 못한 경우에도 컴파일은 가능하지만 모델의 일부만 Edge TPU에서 실행된다.
- Edge TPU를 지원되지 않는 동작이 발생하는 모델 그래프의 첫 번째 점에서 컴파일러는 그래프를 두 부분을 분할한다.
- 앞서 분할된 영역에서 Edge TPU를 지원하지 못하는 경우 CPU에서만 실행하게 된다.
모델의 일부가 CPU 상에서 실행되는 경우 Edge TPU에서만 실행되는 모델과 비교해 추론속도가 크게 낮아질 수 있기 때문에 다양한 아키텍처를 시도하여 Edge TPU와 100% 호환되는 모델을 작성 할 필요가 있다. 즉, 컴파일 한 모델에는 Edge TPU 커스텀 조작만 포함하는 것이 좋다.
트랜스퍼 러닝
위 조건을 충족하는 모델을 만들고 처음부터 러닝 하는 대신 트랜스퍼-러닝 기법을 사용해 Edge TPU와 호환되는 기존 모델을 다시 사용할 수 있다. 이는 처음부터 뉴럴-네트워크(Neural Network)를 바이어스 등이 없이 트레이닝하는 것은 계산하는데 상당한 시간이 소요될 수 있기 때문에 방대한 양의 트레이닝 데이터를 필요로 한다. 하지만 트랜스퍼-러닝을 사용하면 관련 작업에 대해 이미 학습된 모델로부터 시작하기 때문에 더 적은 트레이닝 데이터셋을 이용해도 모델에 새로운 분류를 학습시킬 수 있다. (모델 전체를 다시 학습시켜도 동일한 효과를 얻을 수 있지만)
이 프로세스를 사용해 충분한 트레이닝 데이터와 하이퍼-파라미터를 변경함으로써 한 번의 작업으로 매우 정확한 TensorFlow 모델을 만들 수 있다. 그리고 모델 성능에 만족한다면 그것을 TensorFlow Lite로 변환 후 Edge TPU용으로 컴파일한다. 이때 모델 아키텍처는 트랜스퍼-러닝 동안 변경되지 않기 때문에 Edge TPU용으로 완벽하게 컴파일될 것이다.
Edge TPU 런타임과 API
모델을 Edge TPU로 실행하려면 호스트에 Edge TPU 런타임과 API 라이브러리가 설치 되어 있어야한다.
- Coral Dev Board 또는 SoM을 사용하는 경우 Edge TPU 런타임 및 API 라이브러리가 이미 Mendel 운영체제에 포함되어 있다.
- Coral USB Accelerator 등의 악세서리 디바이스를 사용하는 경우 런타임 및 API 라이브러리를 호스트에 설치해야 한다.
(현재 무난하게(?) 지원하는 환경은 Debian 계열의 Linux 한정이었지만 지금은 뭐 대부분 잘 지원한다.)
사용하는 호스트에서 Edge TPU 라이브러리가 제공되고 있는 경우 다음 중 하나의 API를 사용해 추론을 실행할 수 있다.
- Edge TPU C++ API
- Edge TPU Python API
Classification Engine 등 C++에 포함되지 않은 편리한 API 를 제공하고 있다.