이미지 분류 모델 AutoML 파이프라인

이미지 분류 모델 개발 AutoML 활용하기

Yoo Gyoungyoon
당근 테크 블로그
10 min readDec 8, 2020

--

올해 3분기 당근마켓에서 Google Cloud AutoML을 활용하여 이미지 분류 모델을 개발하고 파이프라인 자동화한 사례를 공유 하려고 해요.

프로젝트의 시작

당근마켓 사용자가 서비스에 접속 했을때 시각적으로 가장 큰 영향을 주는 요소는 “사진”이에요. 앱에서 게시글을 확인할때 “내가 원하는” 혹은 “흥미로운” 사진이 사용자의 눈길을 사로 잡는 다면 사용자의 사용 만족도는 높을 거에요. 반면, “중고거래와 관련 없는” 혹은 “너무 선정적인” 사진이 눈길을 사로잡는 다면 사용자는 불편함을 느낄 수 있다고 생각해요. 사용자에게 불편함을 줄 수 있는 사진은 추천에서 제외해야 한다고 판단 했습니다. 추가로, 당근마켓 중고거래 게시글은 다른 SNS 플랫폼에 노출되어 광고로 사용 되는데, 이 광고 게시글 사진이 당근마켓 브랜드에 좋지 않은 영향을 준다면 광고에서 해당 게시글을 제외해야 할 필요가 있었습니다.

이미지 인식(recognition) 모델 선정

“중고거래와 관련 없는” 혹은 “선정적인” 사진인지 판단하기 위해 이미지 인식 모델을 개발하기로 결정 했어요. 2019년 말에 열린 Tensorflow World 2019에서 Jeff Dean은 “특정 분야(이미지 인식 포함)는 이미 AutoML이 머신러닝 전문가 보다 훨씬 뛰어난 모델을 만들고 있다”고 발표 했습니다. 이때, 당근마켓 ML팀도 앞으로 이미지 모델을 개발해야 된다면 AutoML을 활용하면 좋겠다고 생각하게 되었습니다. AutoML 시스템을 직접 개발하고 운용하는 것은 상당히 어렵고 비용도 많이 드는 일입니다. 다행히도 Google Cloud에서 AutoML 서비스를 제공하고 있습니다. 이중 AutoML Vision Edge는 학습한 모델을 파일로 내보내어 사용할 수 있기 때문에 트래픽에 비례하여 추가적인 비용이 들지 않는 장점도 있어서, 당근마켓 서비스에 적용하는걸 적극 검토하게 되었습니다.

왼쪽 — TF World 2019 발표 슬라이드, 오른쪽 — AutoML 관련 슬랙 메시지 캡쳐

Google Cloud AutoML

Google Cloud에서 제공하는 AutoML 서비스입니다. 데이터셋만 구성하면 자동으로 모델을 만들고, 손쉽게 배포할 수 있습니다. 자세한 설명은 여기를 참고하시면 됩니다. 이 프로젝트에서는 AutoML Vision Edge 를 사용해서 이미지 분류 모델을 학습 시켰습니다. 저희 팀이 이 서비스를 매력적이라고 생각 이유는 아래와 같습니다.

편리한 데이터셋 관리

Web UI에서 기본적인 이미지 라벨링 기능을 모두 제공하기 때문에 별도의 이미지 라벨링 도구를 직접 개발/운용하지 않아도 되는 편의성이 있습니다. 사용중에 발견한 좋은 기능은 중복 사진을 자동으로 필터링 해주는 것 입니다. 단점은 반응속도가 조금 느립니다.

훈련전 모델 속도, 패키지 크기 예상 가능

모델 훈련 시작 전에 예상 Package size와 Latency를 확인할 수 있습니다. 또한, Trade-off에 따라서 학습하고 싶은 모델을 결정 할 수 있습니다. 훈련 예산을 설정할 수 있고, 적당한 훈련 시간을 알려 줍니다. 훈련 시간은 데이터셋 크기에 비례합니다. 이 프로젝트에서는 약 43,000장 정도의 이미지를 훈련에 사용했고, 8시간 훈련 할 것을 추천 받았습니다. 훈련은 Eearly Stop이 적용되어 예산을 다 사용하지 않아도 종료 됩니다. 데이터셋에 이미지를 추가하고 Resume Training도 가능합니다.

좋은 모델 Evaluation UI

왼쪽 — 전체 라벨에 대한 분석 UI, 오른쪽 — 특정 라벨에 대한 UI

학습이 완료되면 Web 에서 편리하게 모델 Evaluation 결과를 확인 할 수 있습니다. Confidence score를 변경하면서 Precision, Recall을 확인할 수 있고, Confusion Matrix도 제공 됩니다. 라벨별 상세 보기에서 예측 결과를 이미지와 함께 확인 가능합니다. 앞으로 직접 모델 Evaluation 시각화를 개발해야 한다면, 이 UI를 참고하고 싶을 정도로 상당히 마음에 들었습니다.

다양한 내보내기 옵션

내보내기 기능 화면 캡쳐

AutoML Vision Edge는 다양한 내보내기 옵션을 제공합니다. 저희는 TFLite 와 Container(TF Saved Model)을 사용 했습니다.

데이터셋 만들기 전략

전체 개발 프로세스를 단축하기 위해서 데이터셋을 효율적으로 빠르게 구축할 수 있는 시스템도 아주 중요합니다. 저희 팀이 계획한 효율적으로 빠르게 데이터셋을 만드는 방법은 아래와 같습니다.

이미지 찾기

운영 부서와 협업

서비스 운영 부서와 협업을 통해 운영 업무중 발견되는 사진을 데이터셋에 지속적으로 추가하고 있습니다. 지속적으로 데이터셋을 업데이트 하기 위해서 가장 중요한 요소 입니다.

키워드 검색

게시글 검색 기능을 활용하여 만들었습니다. 예를 들어, 선정적인 사진을 찾을때는 “비키니”를 검색해서 노출이 많은 사진을 다수 선택하고, 데이터셋에 한번에 추가하는 방법 입니다.

유사 이미지 사용

당근마켓 내부에는 유사한 사진을 검색할 수 있는 이미지 인덱스가 존재 합니다. 데이터셋에 포함시킬 적합한 사진을 찾으면 이와 유사한 사진도 검색해서 데이터셋에 함께 추가하는 방식 입니다.

유사 게시글 활용

사용자들이 연속으로 본 게시글을 기반으로 추천하는 기능인 “함께봤어요”를 활용하여 추가적인 이미지를 찾는 방식입니다.

AutoML에 연동

AutoML에 데이터를 연동하기 위해서는 GCS에 사진 파일을 업로드하고, 해당 파일의 URI와 라벨을 CSV에 기록하여 AutoML 임포트 명령어를 실행하면 됩니다. 파일 업로드와 데이터 연동은 Google Cloud에서 제공하는 Storage, AutoML Python Client를 사용했습니다. 사진 업로드 및 데이터 임포트는 대기 시간이 필요합니다. 대기하는 동안에도 지속적으로 라벨링 작업이 가능하도록 Task Queue 사용하여 두 작업 모두 비동기로 처리 했습니다.

위에서 언급한 기능을 ML팀 어드민에 이미지 라벨링 페이지에 구축했습니다.

왼쪽 — 키워드 검색: 닌텐도, 오른쪽 — 닌텐도 함께봤어요
유사 이미지 검색

ML 어드민 활용시 라벨링 속도

서비스 운영 부서에서 업무 처리 과정에서 모아주신 1,500장의 사진이 데이터셋에 포함되었습니다. 클래스 별로 이미지를 찾는 속도의 차이는 있었지만 42,000장의 이미지 데이터셋을 구축하고 확인하는데 혼자서 이틀 정도 소요 했습니다. 개인적으로 만족스러운 결과이고, 앞으로 새로운 이미지 클래스를 추가하거나, 신규 데이터셋을 구성하는 작업도 빠르게 해결할 것을 기대합니다.

모델 배포

이미지 분류 모델은 서버와 클라이언트 2곳에 배포 했습니다.

TF Lite 모델 클라이언트 배포에 Firebase 활용

Google Cloud AutoML은 Firebase와 잘 연동 되어 있습니다. 학습이 완료된 AutoML 모델은 Firebase Console > ML > AutoML Vision Edge 에서 확인 가능하고, 해당 모델을 단순 클릭만으로도 클라이언트에 배포할 수 있습니다. Firebase는 모델을 클라이언트가 자동으로 다운로드하고 버전 변경도 가능한 API를 제공하는 등 편리한 기능이 많습니다. 참고 블로그, 문서

TF Serving AWS EKS 배포후 서비스 즉시 적용

훈련이 완료된 모델을 서비스에 바로 사용하기 위해서 AutoML 모델을 TF Saved model로 내보내어 사용 했습니다. 모델의 사이즈는 TFLite 모델의 4배인 12Mb로 Export 되었습니다. TF Serving을 사용하면 0.5 CPU, 메모리 500Mb의 적은 리소스에서 약 80ms의 예측 속도를 기록했습니다.

데이터셋 구축, 모델 훈련, 모델 배포 단계를 설명 드렸습니다. 이제 파이프라인 자동화 과정을 설명 하겠습니다.

파이프라인 자동화

최초에 이미지 데이터셋을 대량으로 구축했습니다. 그 후에는 서비스 운영 중 발견되는 사진을 데이터셋에 지속적으로 추가하고 있습니다. 데이터가 지속적으로 업데이트 되기 때문에 지속적인 모델 훈련과 배포가 필요 합니다.

Kubeflow 파이프라인 구성

(참고: 파이프라인에 포함되지 않은 데이터셋 업데이트는 ML어드민 WebServer에서 Periodic Task를 사용했습니다)

파이프라인 단계 상세 설명

모델 훈련

AutoML에 훈련 시작 명령을 전송 합니다. Resume Training은 최초 베이스 모델 훈련후 단 2주간만 가능하기 때문에, 신규 학습하도록 했습니다.

모델 평가

모델 평가 단계는 매우 중요합니다. 많은 과정이 파이프라인에서 자동으로 진행되기 때문에 문제가 발생하면 배포를 막아줄 안전 장치가 필요합니다. 이 역할이 모델 평가 입니다. 모델 평가는 “신규 모델” 과 “기준 모델”의 Precision, Recall을 비교하여 성능이 Threshold 이상 하락하면 배포 중단하도록 했습니다.

  • 성능 1%p 하락 → 알림을 발송
  • 성능 3%p 하락 → 배포를 중단, 파이프라인도 에러 처리

클라이언트 배포

Firebase에 배포되어 있는 모델을, 최신 모델로 변경합니다. 배포 모델 타입은 TFLite이고, 변경 여부는 모델의 해시값으로 확인 가능합니다. 모델 변경은 Firebase Admin SDK를 사용했습니다.

서버 배포

AutoML에서 모델을 TF Saved Model로 Export 한뒤, S3에 업로드 합니다. 업로드가 완료되면 AWS EKS에 배포된 TF Serving을 Restart합니다. Restart는 롤링으로 진행되기 때문에 서빙은 중단 되지 않습니다.

Garbage Collection

훈련한 AutoML 모델과 Export된 파일은 일정기간이 지나면 삭제하도록 했습니다.

완성된 파이프라인 스크린 캡쳐

마치며

이 프로젝트를 진행하면서 머신러닝을 서비스에 적용하는 새로운 길을 발견한 느낌이었습니다. 이번엔 이미지 분류 모델만 AutoML을 적용 했지만, 서비스에 필요한 다른 종류의 모델이 AutoML로 제공 된다면 기꺼이 사용하고 싶습니다. 모델 개발이 자동화된 점도 좋았지만 “데이터 전처리”, “모델 평가”, “모델 배포” 단계에서 어떤 코딩도 필요 없다는게 정말 편하다고 생각했습니다. 파이프라인 코드 외에 작성한 코드가 거의 없기 때문에, 유지보수 업무도 최소화 되었습니다. 앞으로 Google Cloud AutoML이 더 발전한다면, 파이프라인에서 생성되는 모델도 지속적으로 개선될 것 입니다. 손쉽게 많은 단계가 자동화 되고, 지속적으로 모델이 자동 개선되는 AutoML을 사용해보시길 추천드립니다.

ML팀에서 멋진 동료를 찾고 있어요!

당근마켓 머신러닝 팀은 클라우드 서비스와 오픈소스를 적극 활용하여 머신러닝 서비스를 개발하고 있어요.

  • 딥러닝 모델을 서비스에 적용하고 싶으신 분
  • 클라우드 머신러닝 파이프라인 구축에 관심 많으신 분

저희와 함께 머신러닝 기술을 활용하여 당근마켓을 더 좋은 서비스로 만들고 싶으신 분 연락주세요.

당근마켓 채용 공고

긴 글 읽어주셔서 감사합니다.

--

--