이번 포스팅에서는 개체 간 관계 추출 프로젝트에서 사용했던 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를 생성해준다.
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 pull
# docker pull new-repo:tagname
>> docker pull sangwon0532/mlops_practice
Inference Time 최적화
컨테이너가 실행된 후 첫 inference 수행 시, model과 tokenizer를 huggingface를 통해 다운로드받도록 구현되어 있었기 때문에, 시간이 크게 지연되었다.
따라서 이 문제를 해결하기 위해 모델 파일을 디렉토리 내에 위치시켜 함께 컨테이너 이미지로 빌드했다.
다음에 진행할 것
- GitHub의 소스코드가 수정되면 자동으로 컨테이너 이미지가 빌드되도록 구현
- 모델 파일을 디렉토리 내에 위치시키지 않고 외부 저장소에서 다운로드받아 이미지 빌드할 수 있는 방법 조사
- 모델을 학습시키고, huggingface 저장소에 푸시하는 컨테이너 생성
'Backend > 기타' 카테고리의 다른 글
Autossh로 SSH 연결 유지하기 (0) | 2023.07.17 |
---|---|
SSH 포트 포워딩으로 컨테이너에서 실행되는 서버를 외부와 연결하기 (1) | 2023.07.16 |
SSH 포트 포워딩 (0) | 2023.07.11 |
[GitHub Actions] Self-Hosted Runner를 활용한 CI 파이프라인 구축 (0) | 2023.07.05 |
GitHub Actions를 활용한 CI 구축 (1) | 2023.06.17 |