ddps-lab / edge-inference

Evaluation of inference model performance on edge devices
Apache License 2.0
2 stars 3 forks source link

EdgeTPU와 CPU를 동시에 사용하여 추론 성능 개선하기 #58

Closed leehanjeong closed 1 year ago

leehanjeong commented 1 year ago

EdgeTPU와 CPU를 동시에 활용할 수 있는지 알아보고 이를 이용하여 추론 성능을 개선시킵니다.

leehanjeong commented 1 year ago

image 링크: https://docs.google.com/spreadsheets/d/17CN4zTTtzIDtX-VVn10b3eP5pNY3jAks/edit?usp=sharing&ouid=113624236219002214736&rtpof=true&sd=true image

EdgeTPU와 CPU가 위와 같은 방식으로 동시에 추론을 진행할 수 있도록 해보았습니다. 모델의 크기가 커질수록 둘을 같이 사용했을 때 성능 개선이 컸으며, 작은 모델에서는 CPU나 EdgeTPU를 단독으로 사용했을 때와 비슷한 경우가 있었습니다. 위의 그림과 같이 3개의 프로세스를 만들어 하나는 EdgeTPU 추론, 두개는 CPU 추론에 이용한 경우 4개의 CPU를 모두 다 100%로 이용하진 않았습니다(EdgeTPU 프로세스가 CPU를 이용하지 않기 때문이라고 생각합니다.). 하지만 4개의 프로세스를 만들어 하나는 EdgeTPU 추론, 세개는 CPU 추론에 이용한 경우(이 경우에는 모든 CPU를 100% 사용)에도 성능은 크게 다르지 않았습니다. 하지만 마지막 모델인 Inception V4 모델을 이용하여 3개의 프로세스(1 EdgeTPU, 2 CPU)로 추론을 진행하는 경우, 도중에 TPU가 추론 작업을 멈추는 것을 확인할 수 있었습니다. 이를 다시 4개의 프로세스(1 EdgeTPU, 3 CPU)로 바꾸어주면 TPU에서 작업을 중단하는 현상이 일어나지 않았습니다. 이것이 모델 크기와 연관이 있을까요?

kmu-leeky commented 1 year ago

오케이 한정아. 현재 스프레드 쉬트에 저장된 CPU, CPU+Edge TPU 는 각각의 경우에 최대 성능을 보이는 병렬 작업 갯수일때의 성능을 나타내는거야? 지금 보면 3개 경우가 최적으로 동작하는 상황이 다다른데 이걸 일반화 해낼수 있다면 딱좋을것 같은데, 추가로 cpu 에서의 병렬 작업 갯수까지 맞출수 있다면 더 좋고. 현재는 모델 사이즈만 기록되어 있는데 파라미터 갯수도 가능하면 같이 기록해보자.

leehanjeong commented 1 year ago
# FLOPs 계산
import tensorflow as tf
from keras_flops import get_flops
import tensorflow.keras.applications as app
import tensorflow_hub as hub

model = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/tensorflow/resnet_50/classification/1")
])
model.build([None, 224, 224, 3])

flops = get_flops(model, batch_size=1)
print(f"FLOPS: {flops / 10 ** 9:.03} G")
# 파라미터 개수 계산
import tensorflow as tf
from keras_flops import get_flops
import tensorflow.keras.applications as app
import tensorflow_hub as hub

model = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/tensorflow/resnet_50/classification/1")
])
model.build([None, 224, 224, 3])

model.summary()

위와 같은 방식으로 FLOPs와 파라미터 개수를 계산해보았습니다. tensorflow hub에서 제공하는 모델들을 이용하였으며, InceptionV4 모델은 제공하지 않아 계산할 수 없었습니다. 또한 tf ver. 2 모델만을 제공하여 tf ver. 2 모델로 계산하였습니다. image https://docs.google.com/spreadsheets/d/17CN4zTTtzIDtX-VVn10b3eP5pNY3jAks/edit?usp=sharing&ouid=113624236219002214736&rtpof=true&sd=true 계산 후 추론 시간과의 연관관계를 살펴보았습니다. 우선 model_size와 parameters는 어느정도 비슷한 양상으로 증가하지만, FLOPs는 연관이 별로 없는 것으로 보입니다. MobileNetV2(224x224x3)에서 MobileNetV1(224x224x224)로 갈 때, EdgeTPU, CPU+EdgeTPU의 추론 시간은 줄어들지만 model_size, FLOPs, parameters는 모두 증가하는 것을 볼 수 있었습니다. total_time만을 놓고 볼 때는 model_size, FLOPs, parameters 무엇으로도 일반화가 힘든 것 같고, 사진 한 장의 추론시간인 inference_time(avg)를 놓고 보면 EdgeTPU만을 가지고 추론하는 것이 더 나은 모델에서도 그 차이가 매우 미미하여 MobileNetV1(192x192x3) 부터는 CPU+EdgeTPU의 조합으로 추론하는 것이 우수하다고 할 수 있을 것 같습니다. 또한, 현재 R-pi에서 CPU 프로세스를 두 개밖에 사용하지 못하였지만, CPU가 조금 더 넉넉하여 세 개를 이용할 수 있다면 EdgeTPU+CPU의 성능이 더 좋아질 것 같습니다.

leehanjeong commented 1 year ago

논문 작성을 위해 라즈베리파이4에 대하여 알아보던중 아래와 같은 설명을 발견하여 기존에 USB2에 연결되어있던 EdgeTPU를 USB3으로 옮겨 실험을 해보았습니다. image image

기존에 EdgeTPU만으로 실험시 52.554초가 걸리던 InceptionV1(224x224x3)모델이 USB 포트를 바꾼 후 30.952초만에 추론을 완료함을 알 수 있었습니다..! 모두 재실험시 실험 결과가 바뀔 것으로 예상됩니다.

leehanjeong commented 1 year ago

https://docs.google.com/spreadsheets/d/15ySlgETiMikmPRkphlv4Y6qCiiGusiDp/edit?usp=sharing&ouid=113624236219002214736&rtpof=true&sd=true image

실험 결과 ResNet-50을 제외한 모든 모델에서 EdgeTPU만을 사용했을 때 가장 좋은 성능을 보였습니다. 아무래도 USB포트를 바꾸면서 EdgeTPU의 성능이 CPU에 비하여 월등히 좋아져서 CPU와 task를 나눠서 처리할 때보다 TPU 혼자 다 처리할 때 더 좋은 성능을 보이는 것 같습니다.

leehanjeong commented 1 year ago

@kmu-leeky

MobileNetV1 (224x224x3)

tpu only: 이미지 하나 추론 소요시간: 0.005 tpu(1): 800개 이미지 처리, 이미지 하나당 0.0075초 소요 -> 총 추론 소요시간: 6 cpu(2): 200개 이미지 처리, 이미지 하나당 0.126초 소요 -> 총 추론 소요시간: 12.6 (200 * 0.126 / 2)

InceptionV1 (224x224x3)

tpu only: 이미지 하나 추론 소요시간: 0.007 tpu(1): 874개 이미지 처리, 이미지 하나당 0.0088초 소요 -> 총 추론 소요시간: 7.6912 cpu(2): 126개 이미지 처리, 이미지 하나당 0.267초 소요 -> 총 추론 소요시간: 16.821 (126 * 0.267 / 2)

InceptionV2 (224x224x3)

tpu only: 이미지 하나 추론 소요시간: 0.023 tpu(1): 874개 이미지 처리, 이미지 하나당 0.026초 소요 -> 총 추론 소요시간: 22.724 cpu(2): 126개 이미지 처리, 이미지 하나당 0.411초 소요 -> 총 추론 소요시간: 25.893 (126 * 0.411 / 2)

kmu-leeky commented 1 year ago

한정아. 2번째 문제는 tpu 에서 추가적인 오버헤드를 감안하지 않아서 인것 같은데. 2번에서 관찰한 프로세스가 동시에 종료한다는 것이, 실제로 이미지 한장씩의 추론을 시작하고 끝낼때 메시지를 찍어보면 실제로 마지막까지 함께 찍히고 있는거야? 지금으로는 중간에 우리가 놓치고 있는 오버헤드가 조금 있을것 같다는 생각이 드네.

leehanjeong commented 1 year ago

각각 cpu와 tpu에서 이미지를 한 장씩 가져가서 inference 함수를 실행하는데, inference 함수의 종료시점에 pid를 출력하도록하여 확인하였습니다! 이를 확인하여 함께 종료하는 것을 확인하였습니다.

kmu-leeky commented 1 year ago

한정아 지금 코드를 같이 보면서 이야기를 해볼까? 한정이 자리에서 확인 가능?

leehanjeong commented 1 year ago

네, 가능합니다!

leehanjeong commented 1 year ago

@kmu-leeky 로그파일 남깁니다! log.txt

kmu-leeky commented 1 year ago

땡큐

leehanjeong commented 1 year ago

inference.zip 코드에 수정해야 할 부분이 있을까봐 아직 깃에 커밋은 안했기에 이슈로 코드도 공유드립니다!

kmu-leeky commented 1 year ago

지금까지 결과로 봐서는 usb 를 활용한 전송 속도가 확 빨라지면서 tpu 를 거의 full 로 사용할수 있게되면서 cpu 와 tpu 의 성능 차이가 크게 나는걸로 보이네. 로그 파일을 분석해보니, cpu 는 작업을 하는 것보다 tpu 로 빠르게 이미지,모델을 넣어주는게 낳은것 같다는 생각이 드네.

https://coral.ai/docs/edgetpu/compiler/#system-requirements

읽어본 문서인데 코랄 자체의 메모리가 8메가 밖에 안되서, 큰 모델이라면 계속 cpu-usb-coral 간 모델 파라미터의 전송이 발생하겠네. 그렇다보니 큰 모델에서 usb2, usb3 에서의 성능차이가 훨씬 커진것 같아.

지금 상황이라면 usb-2, usb-3 의 성능 비교에 포커스를 맞추는게 나을듯 한데, usb-2 가 워낙에 옛날 기술이라 그것과 비교하는게 적절할런지, 어떤 시나리오가 좋을런지는 조금 더 고민을 해보기는 해야겠다. 같이 조금 더 살펴보자.

leehanjeong commented 1 year ago

네, 그리고 TPU와 CPU의 추론 시간 차이의 경우 TPU가 모델 로드 타임이 더 길어 늦게 시작을 하는 부분과 더 많은 이미지를 처리해서 다음 이미지를 불러오는데 걸리는 시간이 더 많이 포함된다는 점을 생각하면 어느정도 맞아 떨어지는 것 같습니다.

코랄의 8메가 메모리가 지난번에 InceptionV4 모델(가장 큰 모델)을 process를 3개만 만들어 추론하려고 할 때 문제가 되었던 것 같기도 합니다. 사실 이미지는 하나씩 가져가는 것인데 이 이유가 아닌 것 같기는 하지만, 몇번을 다시 실험해보아도 process를 4개 만든 경우에는 TPU도 끝까지 추론이 가능했지만, 3개만 가지고 추론을 하던 경우에는 중간에 TPU 추론은 멈춰버렸습니다. 물론 USB 포트를 바꾼 후에는 3개만 가지고도 추론을 끝까지 진행할 수 있었습니다.

네, 저도 다른 시나리오가 있을지 계속 생각해보겠습니다!

kmu-leeky commented 1 year ago

응 한정아 그런듯 해. 짧은 시간이나마 생각을 해보니 의도한것은 아니었지만 usb 버전에 따라서 코랄의 성능이 큰 영향을 받는걸 발견했네. 현재 r-pi 에도 그렇고 여러 피씨에도 usb-2 와 usb-c 가 공존하는 상황임을 고려했을때, 우리가 발견한 주요한 내용을 그대로 정리하는건 어떨까 싶어. 제목은 범용 직렬 버스 특성을 고려한 엣지 가속기 기반 딥러닝 모델 추론 최적화 방안 연구 (너무 긴가?) 정도로 하고, 실제로 추론 해야할 작업이 있다면 이걸 우선 tpu 로 보내서 지속적으로 처리하게 하면서, 추가적으로 cpu 로 작업을 보내보면서 tpu 에서 처리 성능이 떨어지는걸 관찰하면서 reactive 하게 tpu only, tpu+cpu 를 결정한다고 이야기하면 어떨까 싶어. 결국 usb 버전이 높아서 tpu only 에서 cpu 추가시 처리 성능이 낮아지면 tpu-only 로, usb 버전이 낮다면 cpu 로 작업을 도와주는게 충분히 도움이 된다 정도로 이야기 하면 어떨까 싶은 생각이야.

사실 이것보다, tpu 코랄 동작시 추론 성능을 모니터링 하는 소프트웨어 혹은 모듈을 개발하는것도 큰 도움이 될것 같은데, 이건 꽤나 어렵고 긴 작업이 될듯하니, 우선 이번 논문의 경우는 usb 버전 차이에 따른 성능 차이를 이용해보면 어떨까 싶은 생각이야. 한정이도 한번 생각을 다듬어보고 진행해보자.

leehanjeong commented 1 year ago

tpu only로 처리를 하다가 cpu로 작업을 보내면서 성능을 측정해보는 것은 멀티 프로세스를 이용한 방법이 아닌걸까요? 만약에 구현을 해야한다면 어떤 방식으로 구현해야 할 지 감이 잡히지 않아서 여쭙니다..!

따라서 논문의 내용은

  1. USB2.0과 USB3.0에서 EdgeTPU 사용시 데이터 전송 속도로 인해 추론 성능이 차이가 있음
  2. USB3.0에서는 EdgeTPU를 사용하는 것이 좋음 (CPU로 작업을 보내보면서 성능이 떨어지지 않으면 TPU+CPU 동시 사용)
  3. USB2.0에서는 이전 실험 결과에 따라 모델 크기 또는 파라미터 개수로 스케쥴링 가능

정도가 될까요?

이번 논문 작성의 경우, 2번의 실험을 어느정도 빠르게 진행하고 정리할 수 있으면 금요일까지 작성하여 제출할 수 있을 것 같지만, 시간이 얼마 남지 않은듯 하여 조금 걱정이 되고 있습니다. 교수님께서는 그래도 지금까지 실험한 결과가 있으니, 바뀐 주제로 얼른 실험을 해서 제출을 하는 것이 좋을 것 같다고 생각하시나요?

kmu-leeky commented 1 year ago

한정아. tpu only 로 처리하다가 cpu 로 보내보는건 먼 이야기이니 당장은 신경을 안써도 될것 같아. 한정이가 정리한 3개 내용 적합해보여. 욕심 같아서는 2번과 관련한 실험도 되었으면 하는데.. 시간이 부족할 여지가 있다면 우선 지금까지 실험 결과로 작성을 하고, 시간을 봐서 2번 시나리오에서 아직 못한 모델에 대한 실험을 진행해서 추가하는건 괜찮을듯 해. 논문기한의 경우 이번주 금요일이 더 이상 연장없는 최종 마감인듯 하네.

leehanjeong commented 1 year ago

교수님 혹시 2번 시나리오에서 아직 못한 모델에 대한 실험이라는 것이 https://github.com/ddps-lab/edge-inference/issues/58#issuecomment-1288510159 이 실험을 말씀하시는 것일까요? USB 3.0에서 EdgeTPU 및 CPU+EdgeTPU 관련 실험은 https://github.com/ddps-lab/edge-inference/issues/58#issuecomment-1288153900 이 이슈에 정리해놓았어서 여쭙니다!

kmu-leeky commented 1 year ago

한정아. 나는 "2번의 실험을 어느정도 빠르게 진행하고 정리할 수 있으면 금요일까지 작성하여 제출할 수 있을 것 같지만" 이 언급을 보고 아직 실험이 다 마무리 되지 않았다고 생각했어. 한정이 말대로 라면 모든 실험은 다 진행이 된거야? 엑셀 쉬트를 봤을때는 그렇게 보이는데, 실험 진행보다는 분석에 시간이 필요하다는 의미였어?

leehanjeong commented 1 year ago

USB3.0 포트를 이용했을 때의 EdgeTPU, CPU+EdgeTPU 실험은 완료하였습니다! 저는 2번의 내용을 https://github.com/ddps-lab/edge-inference/issues/58#issuecomment-1288862331 여기서 교수님께서 말씀해주신 tpu only로 추론하다가 cpu 추가시 성능이 떨어지는걸 관찰하면서 reactive하게 tpu only, tpu+cpu를 결정하도록 하는 실험을 진행해야하는 것인가 하였습니다!

kmu-leeky commented 1 year ago

아 오케이. 어떤 부분이 미완료인지 알겠다. 그걸 지금 하는건 무리. 그러면 지금까지 나온 결과로 작성하자.

leehanjeong commented 1 year ago

https://github.com/ddps-lab/research-issues/issues/132#issuecomment-1290528912 교수님, 시간 괜찮으실 때 이 이슈도 한 번만 확인 부탁드립니다!