개발자로 후회없는 삶 살기

오픈소스 SW 실습 final project 본문

[프로젝트]/[AI]

오픈소스 SW 실습 final project

몽이장쥰 2022. 12. 18. 16:38

서론

이 프로젝트는 오픈소스 모델 ZOO인 mmdetection를 활용하여 custom 데이터로 AI 모델 학습을 하고 최종적으로는 docker image로 모델 개발 환경을 배포하는 것을 목표로 하고 있습니다. 또한 그 과정에서 오픈소스 협업 소프트웨어를 활용하여 팀원들과 이슈 및 형상관리를 실시합니다.

 

-> 데일리 회고

https://hsb422.tistory.com/category/%5B%EA%B0%9C%EB%B0%9C%EC%9E%90%5D/%5B%EA%B5%90%EA%B3%BC%EB%AA%A9%5D?page=1 

 

'[개발자]/[교과목]' 카테고리의 글 목록

 

hsb422.tistory.com

이 프로젝트의 전체 과정은 위 링크를 참고해 주시기 바랍니다.

 

-> 전체 코드

https://github.com/SangBeom-Hahn/OpenSW_Team5

 

GitHub - SangBeom-Hahn/OpenSW_Team5

Contribute to SangBeom-Hahn/OpenSW_Team5 development by creating an account on GitHub.

github.com

 

본론

- 프로젝트 주제

왼쪽 : K-fashion data/ 오른쪽 : MASK-RCNN 학습 결과

K-fashion data를 활용한 mmdetection MASK-RCNN 학습 및 실행 환경 배포

 

 

=> 세부 목표

① github 및 redmine 등 활용하여 협업

② K-fashion 데이터에 맞춰 mmdetection의 MASK-RCNN 코드 수정 및 학습 

③ 모델 실행 환경 docker image로 배포

 

- 프로토타입

 

 

- 프로젝트 시작

1. 협업 개발 환경 구축

-> github : https://github.com/SangBeom-Hahn/OpenSW_Team5.git

 

-> redmine

 

 

2. mmdetection MASK-RCNN 학습

 

① mmdetection 학습을 위한 환경 구축

1) conda 가상환경 생성

2) mmdetection 환경에 맞는 라이브러리 설치

3) python 3.7.13

4) pytorch 1.6.0

5) torchvision 0.7.0

6) cuda 10.0 - rtx 2080 super

7) mmcv(mmcv-full) 1.7.0

8) mmdet 2.26.0

 

② 데이터 형식 및 전처리

-> 설명

Data 데이터 수 Train 데이터 수 Val 데이터 수 세부사항
1 5826 4740 1186 K-fashion

학습에는 K-fashion 데이터 셋을 사용, 각 이미지는 데이터 구축 사업을 위해 제작된 데이터로 이미지 jpg파일과 그에 대응하는 annotation json 파일이 존재합니다.

 

> 기존 데이터 클래스가 coco데이터 형식에 맞지 않게 되어있었습니다. (coco 데이터는 train.json파일과 val.json파일 그리고 이미지가 train valid 두가지로 나누어져 있습니다.

 

∴ 위 사진처럼 존재하는 이미지 데이터를 coco data 형식으로 compile 해주는 과정이 필요합니다.

 

import json

file_path_1 = 'C:/Users/PiSunWoo-RTOS/Desktop/Mask_RCNN_실습데이터/onepiece(dress)_02/annotations/instances_default.json'
file_path_2 = 'C:/Users/PiSunWoo-RTOS/Desktop/Mask_RCNN_실습데이터/onepiece(dress)_03/annotations/instances_default.json'

with open(file_path_1, 'r') as f:
    json_data_1 = json.load(f)

with open(file_path_2, 'r') as f:
    json_data_2 = json.load(f)

print(len(json_data_1['images']))
print(len(json_data_2['images']))
print(len(json_data_1['annotations']))
print(len(json_data_2['annotations']))

json_1_id_len = len(json_data_1['images'])
json_2_id_len = len(json_data_2['images'])
for image_id in range(json_2_id_len):
    json_data_2['images'][image_id]['id'] += json_1_id_len
    
json_1_id_len = len(json_data_1['annotations'])
json_2_id_len = len(json_data_2['annotations'])
for image_id in range(json_2_id_len):
    json_data_2['annotations'][image_id]['id'] += json_1_id_len
    json_data_2['annotations'][image_id]['image_id'] += json_1_id_len
    
with open(file_path_2, 'w', encoding='utf-8') as file:
    json.dump(json_data_2, file, indent="\t")

 

 

결과적으로 Train. Validation 8대2 비율로 coco format 데이터 생성 완료!

 

③ mmdetection 코드 수정

기존 코드는 coco data 형식으로 되어있기에 K-fashion data 셋에 맞게 코드를 수정해 줘야합니다. 

 

사용할 모델은 mask_rcnn_r50_fpn_1x_coco와 mask_rcnn_r101_fpn_2x_coco입니다.

 

=> 코드 수정 목록

1) 클래스 개수 수정

 

coco 데이터 셋은 80개의 클래스인 것에 반해 K-fashion 데이터 셋은 12개의 클래스가 존재합니다.

 

2) 데이터 라벨 값 수정

-> 기존 coco 데이터 라벨 값(총 80개)

-> K-fashion 데이터 라벨 값(총 12개)

 

 

④ 텔레그램 봇

추가적으로 학습 완료 시 텔레그램으로 알림을 받기 위해 텔레그램 봇을 생성하고 학습 완료 후 1시간 마다 반복적으로 알람이 오도록 하였습니다. 이는 한 번에 여러 가지 모델을 학습시킬 때 지속적인 학습 진행 상황 관찰의 유용한 알람 서비스가 될 것이라고 생각합니다.

 

⑤ 학습 log 파일 확인

 

resnet50 모델과 resnet101 모델 가중치 파일과 log 파일 생성 확인 완료

 

⑥ 학습 결과 및 테스트

 

 

왼쪽 : resnet 50/ 오른쪽 : resnet 101

 

평가 : 두 모델 다 비슷하게 잘 예측했습니다.

 

 

왼쪽 : resnet 50/ 오른쪽 : resnet 101

평가 : 원래 skirt 이미지이지만 여기서는 onepiece cardigan으로 예측하는 모습을 볼 수 있었습니다.

 

 

왼쪽 : resnet 50/ 오른쪽 : resnet 101

 

평가 : 여기서도 resnet101 모델이 pants를 좀 더 정교하게 예측하였습니다.

 

-> 전체 평가 : 확실히 train data가 많지 않고 class간에 불균형이 심하며 학습 진행도 12epoch13epoch밖에 학습하지 못하여 높은 성능에 도달하지는 않았다고 생각하였습니다.

 

 

3. 모델 개발 환경 docker image 저장 및 배포

1) 베이스 도커 이미지 선택

ARG PYTORCH="1.6.0"
ARG CUDA="10.1"
ARG CUDNN="7"

FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel

ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX"
ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../"

# To fix GPG key error when running apt-get update
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub

RUN apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install MMCV
RUN pip install --no-cache-dir --upgrade pip wheel setuptools
RUN pip install --no-cache-dir mmcv-full==1.3.17 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.6.0/index.html

# Install MMDetection
RUN conda clean --all
RUN git clone https://github.com/open-mmlab/mmdetection.git /mmdetection
WORKDIR /mmdetection
ENV FORCE_CUDA="1"
RUN pip install --no-cache-dir -r requirements/build.txt
RUN pip install --no-cache-dir -e .

 

Mmdetection 공식 깃허브의 mmdetection dockerfile 선택

 

 

2) 베이스 이미지 build

제공되는 dockerfile을 이미지로 변환합니다.

 

 

 

3) 컨테이너 가동

V 옵션으로 우분투 로컬 볼륨과 컨테이너 볼륨 연결

 

 

4) 컨테이너 내부

Githubcommit 한 결과와 동일

 

 

5) 학습한 모델 test

① python 파일 실행

실행 시 에러 발생 img, config, checkpoint 명령행 인자 필요

 

 

연결한 볼륨에 가중치 파일 삽입

 

 

컨테이너 볼륨 확인

결과 가중치 파일 생성 확인

 

 

 

실행

하지만 cli 환경이라서 core dumped 발생

 

 

 

쥬피터 노트북으로 test

demo.py 실행 성공

 

 

커스텀 모델 업로드

Epoch_12는 resnet50 모델 mask_rcnn_r50_fpn_1x_coco.py 형식 모델

 

 

모델 테스트

Kernel died 발생

 

-> 발생 원인

1. 컨테이너 환경은 최소한의 자원을 가지고 있음 따라서 메모리 초과 발생

2. 기본 제공 mask_rcnn_r50_fpn_1x_coco.py 모델보다 커스텀 모델의 용량이 큰 것

3. 쥬피터 노트북의 메모리 초과

 

 

6) docker image commit

 

 

7) 실행

K_fashion 이미지 실행

 

 

-> 내용 확인

Text: “No CUDA runtime is found” Checkpoint_file 경로 유지가 확인됩니다.

 

 

8) v 옵션으로 실행

V 옵션을 지정하면 컨테이너 내부에 학습시킨 모델이 존재하는 것이 확인됩니다. 우리가 학습한 모델과 환경을 이용자에게 제공하기 위해 github readme에 model과 docker 명령어를 명시해야겠습니다.

 

 

9) 이미지 도커 허브 배포

 

결론

- 느낀점

1. 쥬피터 노트북의 메모리 초과가 발생한 것이므로 컨테이너 내부에 파이참 등 로컬 ide를 mount한 후 실행하면 성공할 것이라고 예상됩니다.

2. 오픈소스로 제공되는 AI 모델을 custom 데이터로 학습을 시키는 과정에서 수반되는 환경 구축, 라이브러리 설치, 데이터 형식 변경, 내부 코드 수정 등을 경험할 수 있었습니다.

3. 도커가 AI 개발에서 어떻게 쓰이는지 알 수 있었고 나만의 AI 학습 환경을 구축하는 계기가 되었습니다.

4. 레드마인, 텔레그램 봇 등으로 다음의 Mlops 필수 step을 체험했습니다.

 

① Model Training

② Model Evaluation

③ Model Serving

④ Model Monitoring

 

하지만 Mlops의 의의는 AI 모델 구축 뿐만 아니라 데이터 추출, 데이터 분석, 데이터 준비 등을 지속적으로 자동화하는 것에 있었습니다. 따라서 우리가 진행한 프로젝트는 Mlops의 필수 step을 모두 만족하지 않았다는 것을 인지해야 합니다.

Comments