요즘 해보고 있는 것들

Namkoong Hugh·2024년 1월 3일
0

일상 가까운 글을 여기다가 쓰는게 맞나 싶긴 한데. 어쨌든 당장 생각나는 플랫폼이 여기밖에 없어서.

(Object Detection Task에서) Knowledge Distillation 구현하기

KD에 대해 이것저것 찾아보다가, 다음과 같은 레포를 발견했다.
https://github.com/wonbeomjang/yolov5-knowledge-distillation

YOLOv5에 Distilling Object Detectors with Fine-grained Feature Imitation 이라는 KD 방법론을 적용했는데, 여기에 자극받아 YOLOv8에서 KD를 적용해보는걸 구현해보기로 함.

일단 YOLOv8은 anchor free라 저걸 사용할 수는 없고, 대신 Focal and Global Knowledge Distillation for Detectors을 적용해보고자 시도함.

일단 ultralytics 레포 포크하고 별도의 브랜치에 구현하고 있긴 한데

문제점이
성능이 baseline보다 안 나온다.
baseline(yolov8n) mAP가 100에폭 기준 0.33정도 나오는데
teacher yolov8m 기준으로 mAP가 한 0.3 넘을랑말랑
원본 구현체 참고해가며 계속 수정해도 성능이 나아지지가 않음

Web에서 딥러닝 모델 추론 기능 구현

그러니까 말인즉슨, 별도의 추론서버 없이 프론트단에서 모델 추론을 하는 것.
이런 짓을 왜 하냐면 electron 기반의 데스크톱 앱에 SAM(Segment Anything) 모델 추론 기능을 넣을 일이 있었음.
웹에서 모델 추론에 사용 가능한 라이브러리는 tensorflow js 말고 몰랐기 때문에, 파이토치 구현체만 존재하는 모델을 어떻게 변환해야하나 골머리를 썩이던 중 onnxruntim-web이 존재한다는 사실을 알고 일단 onnx 포맷을 사용하기로 함.
이미지 전처리/인코딩/SAM/후처리를 end-to-end로 구현 후 onnx 포맷으로 변환하고
그렇게 react로 구현한 프론트단에 onnxruntime을 적용해보고 마주한 문제점은
1. 내가 사용하는 모델에서 webgl backend에서 지원 안되는 연산이 꽤 있음.
2. 그렇게 wasm backend를 쓰면.. 추론속도가 굉장히 느려짐. 파이썬에서 cpu단에서 onnxruntime 추론할땐 느려져봤자 2초(대충 서비스 생각하면 수용가능한 범위) 정도 나오던게 10초씩 늘어짐.

일단 1번같은 경우 webgl에서 지원 안 되는 연산이 SAM쪽에 있는 반면 추론속도 주요 bottleneck은 backbone쪽이니 (원본 구현처럼) 두 부분을 나눠서 해결하는 방법으로 갈 수 있을 것 같고

양자화같은 경우 일단 나이브하게 INT8 ONNX 변환하고 python에서 onnxruntime 돌렸을땐 cpu상에서 실행속도상의 이점은 별로 없었는데, 이것도 다시 좀 들여다볼 수 있을 것 같음.

정 안되면 C++ Addon을 넣던가, 하는 방법이 있을 것 같은데

일단 내가 원래 웹개발자가 아니라는게 좀 제일 큰 문제.
분명히 이것보다 fancy한 해결책이 있을 법 한데.

2개의 댓글

comment-user-thumbnail
2024년 1월 19일

yolov5+KD가 제가 짠건데 일부 데이터셋에만 좋아지더라고요... 예전에 프로젝트 할 때는 괜찮았는데 yolov5쪽에서 성능 최적화를 많이 하면서 distillation이 잘 안 먹히는 느낌이 들어요

1개의 답글