Backend/기타

딥러닝 모델 패키징

sangwonYoon 2023. 6. 6. 05:18

이번 포스팅에서는 개체 간 관계 추출 프로젝트에서 사용했던 SangwonYoon/klue-roberta-large-tapt 모델을 Docker 컨테이너로 패키징하고, Docker Hub에 이미지를 push하기까지 진행한 작업들을 공유하고자 한다.


가상환경 생성

>> pip install --user virtualenv
pip install: 설치된 파이썬 패키지가 /usr/local/lib/pythonX.X 경로에 설치되어 전역적으로 패키지를 설치한다.
pip install --user: 사용자 디렉토리에 로컬하게 패키지를 설치한다.
>> virtualenv mlops_practice # 가상환경 생성

>> source mlops_pracitce/bin/activate # 가상환경 활성화

>> vim .gitignore # 가상환경 폴더 ignore

>> pip install --upgrade pip

 

추론 코드 구현

# 디렉토리 구조

.
├── requirements.txt
└── webapp
    ├── dataset # 모델의 입력으로 주어질 dataset을 만드는 디렉토리
    │   ├── datasets.py
    │   ├── preprocess.py
    │   └── tokenize.py
    ├── inference.py # 모델 inference 파일
    ├── main.py # FastAPI 라우팅 함수가 구현된 파일
    ├── pickle
    │   └── dict_num_to_label.pkl
    └── utils
        └── util.py

 

Dockerfile 생성

FROM python:3.10

RUN python3 -m pip install --upgrade pip

COPY ./requirements.txt /ws/requirements.txt

WORKDIR /ws

RUN pip install -r requirements.txt

COPY ./webapp/ /ws

CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
COPY 명령어는 호스트 운영체제의 파일을 이미지 상의 경로로 복사할 때 사용된다.

 

Docker 이미지 빌드

>> docker build . -t relation-extraction:1.0
>> docker images relation-extraction
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
relation-extraction   1.0       bb19bcf9bb30   27 seconds ago   1.81GB

 

로컬 환경에서 컨테이너 실행

>> docker run --rm -p 8000:8000 -d --name RE relation-extraction:1.0
>> docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS         PORTS                    NAMES
30066939e600   relation-extraction:1.0   "uvicorn main:app --…"   7 minutes ago   Up 7 minutes   0.0.0.0:8000->8000/tcp   RE

 

아직 프론트를 구현하지 않았기 때문에 Swagger UI를 활용해 API를 테스트해본다. FastAPI는 추가적인 구현 없이 자동적으로 swagger ui를 생성해준다.

inference API 테스트

 

Docker Hub에 이미지 푸시

# docker tag local-image:tagname new-repo:tagname
>> docker tag relation-extraction:1.0 sangwon0532/mlops_practice
# docker push new-repo:tagname
>> docker push sangwon0532/mlops_practice

Docker Hub에 성공적으로 이미지가 올라간 것을 확인할 수 있다.

 

Docker pull

# docker pull new-repo:tagname
>> docker pull sangwon0532/mlops_practice

windows 운영체제에서 이미지를 pull하고, 컨테이너가 정상적으로 동작하는 것을 확인했다.

 

Inference Time 최적화

컨테이너가 실행된 후 첫 inference 수행 시, model과 tokenizer를 huggingface를 통해 다운로드받도록 구현되어 있었기 때문에, 시간이 크게 지연되었다.

따라서 이 문제를 해결하기 위해 모델 파일을 디렉토리 내에 위치시켜 함께 컨테이너 이미지로 빌드했다.

 

다음에 진행할 것

  • GitHub의 소스코드가 수정되면 자동으로 컨테이너 이미지가 빌드되도록 구현
  • 모델 파일을 디렉토리 내에 위치시키지 않고 외부 저장소에서 다운로드받아 이미지 빌드할 수 있는 방법 조사
  • 모델을 학습시키고, huggingface 저장소에 푸시하는 컨테이너 생성