프로젝트 목표: 상품명을 입력 받아 적절한 카테고리를 반환하는 API 개발
기간: 2021년 5월 ~ 2021년 11월
데이터 확보
1. 수요기업에게 mysql 덤프 파일을 전달 받아 로컬에 임포트
2. pymysql을 사용해 db 접근 후 상품명과 카테고리 ID를 csv 파일로 저장 (중복 제거 포함)
3. 데이터 정보
- 크기(상품 개수): 약 630만개
- 카테고리 수: 약 2900개 (카테고리는 4단계의 depth로 구성 되어 있으며 우선은 depth 4를 예측하는 것을 목표로 함)
데이터 처리
1. Nori Analyzer를 사용하여 상품명을 형태소 단위로 분리
2. 형태소 단위로 분리된 시퀀스들로 SentencePiece 학습 (type=BPE)
3. 후에 학습 및 추론 때 사용될 tokenizer와 vocab은 SentencePiece 학습 과정에서 생성된 model과 vocab을 이용
- 입력 시퀀스: 갤럭시S20 스탠딩 풀커버 슬림 가죽 케이스 P012
- 토큰화 결과: ['▁갤럭시', '▁s', '▁20', '▁스탠딩', '▁풀', '▁커버', '▁슬림', '▁가죽', '▁케이스', '▁p', '▁012']
학습
1. 모델 구조는 CNN-LSTM 사용
2. DDP(Distributed Data Parallel) 적용 (GPU: V100 * 4)
3. 데이터의 레이블 오류가 많고 카테고리 불균형이 심각하여 수요기업과 협의 후 depth 3를 예측하는 쪽으로 방향 전환 (카테고리 수: 440개)
4. 실험 과정에서 변경 대상이 된 파라미터
- [convolusion] input size (embedding size)
- [lstm] hidden size
- [lstm] dropout
- [lstm] number of layers
- [sentence piece] vocab size
- [sentence piece] character coverage
흐름
결과
1. 가장 성능이 좋았던 파라미터
- [convolusion] input size (embedding size): 1024
- [lstm] hidden size: 512
- [lstm] dropout: 0.3
- [lstm] number of layers: 4
- [sentence piece] vocab size: 30,000
- [sentence piece] character coverage: 0.995
2. precision은 모델이 예측한 카테고리 중 정답이 포함되는 경우의 비율을 의미함
precision | |||
top-1 | top-3 | top-5 | top-10 |
80.711 | 92.98 | 95.523 | 97.504 |
배포
1. 수요기업의 서버에 직접 접속하여 세팅해주기로 결정
2. docker를 이용해 세팅하려 했으나 centos8부터 기본적으로 설치되는 컨테이너 관리 도구인 podman을 이용해 세팅함 (docker 설치 시 podman과 충돌이 일어나 podman을 사용하기로 하였으며 호환에는 문제가 없음)
3. FastAPI 사용하여 API 구현 및 GUI로 API 결과를 확인할 수 있도록 Streamlit을 사용해 웹 데모 구현
5. 컨테이너 관리는 docker compose를 이용 (localhost:8501 = 웹 데모, localhost:8502 = API)
결과
1. 데이터바우처 우수 사례에 선정되어 수요 기업이 과학기술정보통신부 장관상을 수여 받음
'프로젝트' 카테고리의 다른 글
배우 및 행동 기반 클립 추출 서비스 (0) | 2023.03.10 |
---|---|
서지간 유사도 측정 API 배포 (0) | 2023.02.22 |
음원 분리 API 클라우드 배포 (0) | 2022.07.11 |