ddps-lab / edge-inference Goto Github PK
View Code? Open in Web Editor NEWEvaluation of inference model performance on edge devices
License: Apache License 2.0
Evaluation of inference model performance on edge devices
License: Apache License 2.0
@workdd 각 장비들을 유선으로 네트워크 연결하여 ip주소가 변경되어 공유드립니다. 접속방법은 그대로 입니다. 확인하시면 closed 부탁드립니다.
프로젝트로 자동 연동 가능?
각 batch size 만큼의 데이터만 메모리에 로드하여 추론 작업을 진행하기 위해 원본 imagenet dataset을 batch 단위 별로 tfrecord로 생성하여 추론 진행
참고 코드 : https://github.com/kmonachopoulos/ImageNet-to-TFrecord/blob/master/build_imagenet_data.py
object detection model, code를 git repo에 업데이트합니다.
tpu 환경에 필요한 라이브러리를 포함하여 재구성 및 docker hub에 이미지 업로드
https://github.com/ddps-lab/research-issues/issues/45
현재 batch size 1에서는 추론이 가능하지만, batch size 2부터는 아래와 같은 에러가 발생하여 확인하고 있습니다.
ValueError: Cannot set tensor: Dimension mismatch. Got 2 but expected 1 for dimension 0 of input 0.
import tensorflow as tf
from tensorflow.keras.applications import (
mobilenet,
mobilenet_v2,
inception_v3
)
mobilnet_model = tf.keras.applications.MobileNet(weights='imagenet')
mobilnetv2_model = tf.keras.applications.MobileNetV2(weights='imagenet')
Inceptionv3_model = tf.keras.applications.InceptionV3(weights='imagenet')
converter = tf.lite.TFLiteConverter.from_keras_model(mobilnet_model)
tflite_model = converter.convert()
with open('mobilenet_v1.tflite', 'wb') as f:
f.write(tflite_model)
converter = tf.lite.TFLiteConverter.from_keras_model(mobilnetv2_model)
tflite_model = converter.convert()
with open('mobilenet_v2.tflite', 'wb') as f:
f.write(tflite_model)
converter = tf.lite.TFLiteConverter.from_keras_model(Inceptionv3_model)
tflite_model = converter.convert()
with open('inception_v3.tflite', 'wb') as f:
f.write(tflite_model)
# curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# sudo apt-get update
# sudo apt-get install edgetpu-compiler
edgetpu_compiler 명령문을 사용하여 변환
# edgetpu_compiler mobilenet_v1.tflite
# edgetpu_compiler mobilenet_v2.tflite
# edgetpu_compiler inception_v3.tflite
Edge TPU Compiler version 16.0.384591198
Started a compilation timeout timer of 180 seconds.
Model compiled successfully in 554 ms.
Input model: inception_v3.tflite
Input size: 90.91MiB
Output model: inception_v3_edgetpu.tflite
Output size: 90.90MiB
On-chip memory used for caching model parameters: 0.00B
On-chip memory remaining for caching model parameters: 0.00B
Off-chip memory used for streaming uncached model parameters: 0.00B
Number of Edge TPU subgraphs: 0
Total number of operations: 125
Operation log: inception_v3_edgetpu.log
Model successfully compiled but not all operations are supported by the Edge TPU. A percentage of the model will instead run on the CPU, which is slower. If possible, consider updating your model to use only operations supported by the Edge TPU. For details, visit g.co/coral/model-reqs.
Number of operations that will run on Edge TPU: 0
Number of operations that will run on CPU: 125
See the operation log file for individual operation details.
Compilation child process completed within timeout period.
Compilation succeeded!
Edge TPU Compiler version 16.0.384591198
Started a compilation timeout timer of 180 seconds.
ERROR: Attempting to use a delegate that only supports static-sized tensors with a graph that has dynamic-sized tensors.
Compilation failed: Model failed in Tflite interpreter. Please ensure model can be loaded/run in Tflite interpreter.
Compilation child process completed within timeout period.
Compilation failed!
convert 실패시 메시지를 아래와 같이 확인 하였을 때 모델 사이즈를 정적으로 지정하지 못해서 생기는 이슈로 판단되어 확인중 (FP32 or FP16)
ERROR: Attempting to use a delegate that only supports static-sized tensors with a graph that has dynamic-sized tensors.
현재 edge 장비들이 ubuntu 18.04를 사용하고 disk의 용량의 대부분을 사용하고 있는데 파악이 안되고 있습니다.
새롭게 tf serving 이미지를 빌드할겸 실험환경 재구성할겸 ubuntu를 업그레이드하는 등 cuda, tf, python 등의 LTS 최신으로 시스템부터 docker 이미지까지 버전을 통일해서 시스템 구성을 하겠습니다.
백업이 필요할까요?
TPU 환경에서 NLP(RNN,LSTM, BERT, Distrilbert) edgetpu-tflite 모델에 대해 raw dataset 추론 가능성을 확인합니다.
우선, mobilenet v1 모델을 기준으로 코드를 작성하고 있으며 이슈가 있어 코드와 함께 에러를 공유합니다.
# Install Edge TPU Libraries
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt-get update
# Libraries required for Mini PCIe Coral Chip
apt-get install -y gasket-dkms libedgetpu1-std
# tflite runtime install(arm 64)
# https://www.tensorflow.org/lite/guide/python?hl=ko (tflite_runtime 설치)
pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp36-cp36m-linux_aarch64.whl
# package, library check
dpkg -l | grep edgetpu
dpkg -L libedgetpu1-std
#lsusb install (tpu device check)
apt install usbutils
lsusb
import tflite_runtime.interpreter as tflite
model = tflite.Interpreter(
"./model_edgetpu.tflite",
experimental_delegates=[tflite.load_delegate('libedgetpu.so.1')])
model.allocate_tensors()
ValueError: Failed to load delegate from libedgetpu.so.1
해당 에러는 라이브러리를 설치하였지만, 라이브러리를 못찾고 있는 에러로 확인되며
환경에 맞는 버전으로 잘 설치 되어 있는지 확인하고 있으며, 다른 부분에서 빠진 설정이 있는지 공식 coral-tpu 문서를 보고 전체적인 설정 확인중
(https://coral.ai/docs/notes/build-coral/#required-components)
https://github.com/ddps-lab/research-issues/issues/45
입력 형식을 해결하여 tpu 환경에서 dtype이 모두 int8인 tfrecord imagenet dataset, edgetpu 모델을 사용한 추론 결과를 아래와 같이 확인하였습니다.
***** TF-lite matric *****
user_batch_size = 1
accuracy = 0.001
model_load_time = 3.132760524749756
dataset_load_time = 3.074784755706787
inference_time = 41.50337839126587
inference_time(avg) = 0.017514058351516724
IPS = 20.959311305960835
IPS(inf) = 57.09698916889812
정확도 수치가 이상하여 디버깅을 진행하고 있습니다.
inception v3 모델에 대해 tpu(edgetpu-tflite)와 rpi-cpu(tflite)의 성능 비교 실험을 통해 더 나은 성능을 살펴보고,
tpu 장치에 대한 이해를 하기 위해 작업을 진행합니다.
EdgeTPU와 CPU를 동시에 활용할 수 있는지 알아보고 이를 이용하여 추론 성능을 개선시킵니다.
목적 : 요청을 처리할 때 tensorflow load가 발생하지 않도록 구현해야함
Flask에서 요청 route를 받을 때 새로운 process를 사용한다면 load가 될 것이고, 그렇지 않는다면 테스트에 활용가능하여 해당 경우를 테스트 코드 작성하여 확인해볼 예정입니다.
https://github.com/ddps-lab/research-issues/issues/45
TF2로 작성된 inception v3 모델을 int8 형식인 tflite로 convert후 tpu 환경에서 사용 가능하도록 edgetpu 컴파일을 진행하려고 합니다.
각기 다른 이미지 10000 장을 특정 배치사이즈로 모두 추론 할때와
배치 사이즈 만큼의 이미지를 준비 후 해당 이미지를 반복적으로 추론할 경우 추론 성능 비교 분석
일반 CPU 장비에서 모델 로드시에는 수초가 소요되는 반면 엣지 장비에서는 1분 정도 소요되는 현상이 괜찮은지 확인 필요
[추가 실험 필요 대상]
[기존 실험]
[추가 실험]
각 edge 장비 재설치 후 gpu에 접근을 하며 추론하는지 확인을 하던 중에 중요한 사실을 놓치고 있어 보고드립니다.
xavier,nano는 재설치를 진행하면 jetpack을 같이 설치해주어 cuda, cudnn이 설치되고 별다른 조치 없이 gpu에 접근이 가능하였고, 추론 하여 결과 metric을 정리하였었습니다.
그러나 다른 장비들과 달리 tx1, tx2 장비는 재설치 후 jetpack이 자동으로 설치되지 않아 gpu에 접근하지 못하고 있었던 사실을 확인하였습니다.
그래서 tx1 장비에 추가로 jetpack을 수동으로 설치 후, gpu에 접근 가능한 것을 확인하여 추론을 해보았는데 결과가 이전과 많이 달랐습니다.
[이전 실험 결과]
***** TF-FP32 matric *****
user_batch_size = 1
accuracy = 0.93
model_load_time = 58.66154599
dataset_load_time = 1.593460083
inference_time = 208.2208807
inference_time(avg) = 0.2068657527
IPS = 3.724726716
IPS(inf) = 4.83405294
[현재 재설치 및 jetpack 추가 설치 후 실험 결과]
***** TF-FP32 matric *****
user_batch_size = 1
accuracy = 0.93
model_load_time = 59.926010608673096
dataset_load_time = 1.6062180995941162
inference_time = 99.50904369354248
inference_time(avg) = 0.09781955647468567
IPS = 6.209582934647488
IPS(inf) = 10.222904662819504
성능 차이가 확실히 달라졌으며, 기존 실험 결과를 분석하는 과정에서 세 번째 라인의 의미처럼
tx1,tx2 장비보다 nano 장비의 flops가 낮지만 IPS 값이 높은 이유가 설명이 되지 않았고 이상하였는데 tx1,tx2 장비가 gpu에 제대로 접근을 하지 못해 생긴 것으로 판단됩니다.
다시 mobilenet v1 모델 추론 결과를 살펴보니 nano 장비보다 tx2의 아키텍처와 장비 스펙의 Flops이 더 좋은 만큼 성능 결과도 그에 맞게 달라진 것을 확인하여 다른 모델들도 배치 추론을 다시하여 metric 결과 값을 수정하려고 합니다.
한 가지 문제점은 tx1 장비의 경우도 jetpack을 수동으로 설치해주어 cuda,cudnn을 통해 gpu에 접근 및 추론이 가능하도록 해야하는데, tx1 장비는 이미 내장되어 있는 disk 용량이 16GB로 jetpack을 추가로 설치하기에 용량이 부족합니다.
그래서 외장 sd card (128GB)를 붙여 root에 설치되는 라이브러리를 외장 sd card에 설치하고 라이브러리 PATH를 변경시켜 사용하도록 시도해보고 있습니다.
그래서 아래와 같이 작업을 해보려고 합니다.
edge 장비에서 여러 모델 추론 가능성을 확인합니다.
coral.ai에서 제공하는 동일한 모델의 TF ver.1과 TF ver.2에서의 추론 성능을 EdgeTPU와 CPU에서 비교합니다.
이전 실험 결과 분석에 의하면
Coral TPU 가 Mobilnet V1, MobileNet V2 의 경우 Xavier 보다 높은 처리 성능을 보였지만, InceptionV3 에서의 성능은 좋지않음.
당시에 분석했던 이유중 하나가 InceptionV3 의 경우 Coral 공식 홈페이지에서 모델을 제공해주지 않았다고 했는데, 지금 확인해보면 제공을 해주고 있음.
당시에 해당 내용에 대한 분석이 부족한것 같아서 시간을 내서 조금 더 분석을 해봤으면 함.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.