프로젝트 목표: 특정 배우 및 행동을 등장한 비디오 클립을 생성해주는 서비스를 위한 AWS 구축, API 및 파이썬 프로그램 개발
기간: 2023년 1월 ~ 2023년 5월
구성원: 웹 프론트 및 백엔드 개발 (2명), 모델 리서치 및 추론 모듈 개발 (3명), AWS 구축 및 파이썬 프로그램 개발 (본인)
AWS 구축
1. 대표님이 회사를 소개할만한 SaaS가 필요하다고 하셔서 퍼블릭 클라우드를 사용함
2. 이전에 사수님이 음원분리 서비스를 AWS에 구축해놓은 사례가 있어 해당 사례를 참고하여 구축함
3. 사용한 AWS 서비스:
- API Gateway + Lambda: 서비스 웹과 통신하는 REST API 구축
- DynamoDB: 타겟 배우 및 행동, Queue에 등록된 시각, 작업 시작 및 종료 시각, 결과 파일 경로 등의 Job 정보를 기록 (이 DB 테이블은 나중에 API 서비스를 한다면 요금 계산용으로 사용될거라고 사수님이 말씀해주심) + 웹 프론트에서 배우의 ID와 이미지 경로, 행동 목록 확인에 필요한 정보를 기록
- S3: 유저가 업로드한 영상과 Job Manager를 통해 추출된 클립 및 썸네일을 저장 (1주일 후 삭제되는 수명 규칙 적용)
- SQS: Job Manager가 진행할 Job의 정보를 알 수 있게 해주는 선입선출 메시지큐 (메시지에는 Job ID가 담겨있음)
API 개발
1. 4개의 엔드포인트 구현:
- /health (GET): API 상태 체크 (사용하는 AWS 서비스의 연결 상태 체크)
- /items (GET): 배우 목록 또는 행동 목록 조회
- /uploads (POST): 업로드 URL 생성 (S3 Presigned URL)
- /jobs (GET, POST, DELETE): 작업 조회, 생성, 중지
파이썬 프로그램 (Job Manager) 개발
1. 팀원이 구현한 3개의 추론 모듈을 사용하여 Job을 수행함
2. Job Agent라는 worker를 프로그램 시작 시 할당받은 GPU 수 만큼 생성함
3. Job Agent는 각 추론 모듈을 병렬로 동작시키기 위해 멀티 프로세싱을 사용하여 하나의 Job Agent에는 5개의 자식 프로세스가 생성됨 (아래는 각 프로세스의 역할):
- 비디오 로드 및 장면 분할
- 행동 기반 추론 (R2Plus1D)
- 얼굴 기반 추론 (RetinaFace, VGGFace2)
- 목소리 기반 추론 (RawNet3)
- 추론 결과 병합, 클립 및 썸네일 생성
4. Job Manager는 5초마다 SQS로부터 메시지를 폴링하고 Job Agent의 상태를 확인함:
- 메시지를 받으면 메시지 내용인 Job ID를 통해 DyanamoDB에서 Job 정보를 idle한 Job Agent에게 할당하고, Job 정보(작업 시작 시각, Job Manager 및 Job Agent 정보)를 업데이트함
- Job Agent의 상태에는 현재 진행률도 포함되어 있어 주기적으로 DynamoDB에 Job 진행률을 업데이트함
- 유저의 작업 중지 요청이 있을 경우 (Job 정보에 포함된 terminate_flag가 트리거) Job Agent에게 작업 중지를 요청함
- Job Manager가 Job을 완료한 Job Agent를 발견하면 결과 파일들을 S3에 업로드 후 DyanamoDB에 해당 Job 정보를 업데이트함
5. 작업 도중에 Job Manager 구동이 멈추는 상황을 대비하여 Job Manager는 시작 시 본인이 소유하고 있던 Job을 DynamoDB에서 찾아 다시 SQS에 메시지를 보내도록 구현함
배포 및 모니터링
1. 도커 이미지로 빌드 (베이스 이미지: nvidia/cuda:11.6.0-runtime-ubuntu20.04)
2. 이미지 크기를 줄이기 위해 multi-stage builds 사용
3. 현재 어떤 Job Agent가 어떤 Job을 얼마나 진행하고 있는지, CPU 및 GPU는 얼마나 사용하고 있는지 모니터링하기 위해 Prometheus와 Grafana를 이용해 모니터링 시스템 개발
4. BItbucket Pipelines를 이용해 특정 tag가 달린 git push 발생 시 tag에 맞는 파이프라인이 진행되도록 구축
- ecr-release-*: Build Docker Image --> Push to AWS ECR
- lambda-release-*: Zip Code and Python Package --> Upload to AWS Lambda
보완이 필요한 점
1. DynamoDB 공부:
- DyanamoDB 테이블에 item이 많이 쌓여있는 상태에서 유저의 jobs를 조회 시 일부 job이 보이지 않는 문제가 있었는데 이는 DyanamoDB의 스캔 방식이 최대 100개의 item 또는 1MB만 읽을 수 있기 때문이었음
- 위 문제를 해결하기 위해선 스캔할 때 마지막으로 읽은 item부터 연달아서 스캔을 해야하는데 이 방식은 너무 비효율적이라 유저 별로 어떤 Job ID를 가지고 있는지 기록하는 테이블을 하나 더 생성 후 해당 테이블을 통해 Job ID들을 batch read하는 방식으로 로직을 변경함
2. SQS 공부:
- 처음엔 SQS를 FIFO 모드로 사용했는데 빠르게 같은 내용의 메시지를 보냈을 때 메시지가 큐에 쌓이지 않는 문제가 발생하여 표준 모드로 변경하였음 --> 이 문제는 더 이상 발생하지 않지만 정확한 원인을 파악하지 못함
- 표준 모드도 최대한 중복 없이 메시지가 도착한 순서대로 메시지를 정렬하고 있다고 문서에 나와있지만 서비스 사용자가 많아 질 경우엔 대책이 필요함
3. 추론 시 목소리 탐지 모델이 해당 모듈에게 할당된 GPU 외에 0번 GPU를 점유하는 상황 발생:
- 도커 컨테이너로 Job Manager를 구동시켰을 때만 발생하는 문제라 원인 파악이 힘듬 --> 해당 모듈의 코드 분석 필요
4. 테스트를 위한 스테이지 및 자동화된 테스팅 필요
- 테스트를 위한 Lambda, Job Manager, DynamoDB가 필요함
- 테스트용 docker-compose.yml은 overriding을 이용할 예정
- 본인이 생각하는 테스트 시나리오: 코드 푸시 --> 푸시된 코드로 이미지 빌드 및 컨테이너 실행 --> 데모 영상으로 Job 생성 API 호출 --> 주기적으로 Job 조회 API를 호출하며 Job이 정상적으로 완료되었는지 확인
'프로젝트' 카테고리의 다른 글
서지간 유사도 측정 API 배포 (0) | 2023.02.22 |
---|---|
음원 분리 API 클라우드 배포 (0) | 2022.07.11 |
상품 카테고리 분류 서비스 개발 (0) | 2022.05.20 |