Triton Server 는 Deep Learning Model 을 Inference 하는데 GPU 자원을 최적으로 할당하여 서비스를 구축하기 편하게 해주는 환경이다. Torch, Tensorflow 와 같은 다양한 framework 를 지원하기 때문에 여러 종류의 모델을 하나의 Docker container 기반으로 배포할 수 있다. 즉, Triton Server 는 Docker container 기반의 Open-source inference serving software 라 할 수 있다.
본 포스팅에서는 실무자의 입장을 고려하여 Triton Server 환경을 구축하는 방법을 다룬다.
실무자의 상황을 고려하며 Docker Image 관리 및 Container 를 편하게 관리하는 노하우에 대해 소개하겠다.
타겟 독자 : Triton Server 를 활용해서 Deep Learning Model 을 배포하고자 하는 실무자
목차
1. Docker Image 선택
2. Docker Image 관리 노하우
3. Docker container 생성 노하우
4. Docker container 재시작의 필요성 및 노하우
1. Docker Image 선택
Docker Image version 은 아래 링크에서 선택하면 된다. (링크에서 Table of Contents 참고)
version 을 선택할 때는 내가 사용하는 서버의 스펙을 확인해야 한다.
어떤 GPU 를 쓰는지, CUDA 버전은 어떠한지, 우분투 버전은 어떤지 등 꼭 확인한 뒤 선택하도록 하자.
Docker image 를 선택했다면 아래의 코드로 가져온다.
docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-py3
<xx.yy> 는 가져오고 싶은 triton 의 버전을 의미한다.
이미지를 선택했다면 Container 로 구성하면 된다.
하지만 이대로 끝나면 다른 블로그 글과 다를 게 없다. 노하우를 제공하겠다.
2. Docker Image 관리 노하우
필자가 Docker Image 를 관리하는 이유와 노하우에 대해 공유하겠다.
필자는 bash 파일로 Docker Image 를 관리한다.
아래와 같은 bash 파일을 저장하는 방식이다.
# Base image
FROM nvcr.io/nvidia/tritonserver:<xx.yy>-py3
RUN apt-get update
# Python packages for NLP models
RUN pip install --upgrade pip
RUN pip install torch==<x.yy.z>+cu<vvv> torchvision==<x.yy.z>+cu<vvv> torchaudio==<x.yy.z> --extra-index-url https://download.pytorch.org/whl/cu<vvv>
RUN pip install transformers==<x.yy.z> scikit-learn==<x.y.z> sentencepiece==<x.y.zz>
이렇게 Docker Image 를 관리하면 협업하는 팀원이나 다른 서버에서 모델을 배포해야 할 일이 생겼을 때 간편하게 Docker Image 를 생성할 수 있다.
가장 중요한 python package 의 버전도 명시하면 버전 충돌 없이 누구나 쉽게 확인하고 구동할 수 있다.
Docker Image 를 bulid 할 때도 기존 사용자가 어떤 파일명으로 Image 를 저장했는지 알 수 있다.
docker build -t <image-name>:<version> .
물론 Server 간 스펙이 동일해야 하지만 말이다..
3. Docker container 생성 노하우
Docker Image 를 저장했다면 다음 Step 은 Docker container 를 생성하는 단계다.
단순히 Image 를 run 해서 Container 를 구동시켜도 된다.
이런 방식으로 말이다.
docker run --gpu=n -p8000:8000 -p8001:8001 -p8002:8002 -v <model_path>:/models <docker image name> --model-repository=/models
하지만 SSH 에서 이렇게 바로 Container 를 만들면 다른 사람이 참고할 수 없다.
그래서 필자는 이 또한 bash 파일로 구성하여 협업하는 인력과 공유할 수 있도록 구성하였다.
MODEL_REPOSITORY_PATH=`pwd`/repository
MODEL_SOURCE_PATH=`pwd`/modeling
TRITON_MODEL_REPOSITORY_PATH=/models
TRITON_MODEL_SOURCE_PATH=/modeling
docker run \
--gpus '"device=n"' \
-p 8000:8000 \
-p 8001:8001 \
-p 8002:8002 \
--name <container-name> \
-v $MODEL_REPOSITORY_PATH:$TRITON_MODEL_REPOSITORY_PATH \
-v $MODEL_SOURCE_PATH:$TRITON_MODEL_SOURCE_PATH \
<image-name>:<version> tritonserver \
--model-repository=/models
이렇게 구성하면 협업하는 사람에게 공유뿐만 아니라 기술 이전하기에도 용이하다.
추가적으로 Triton Server 에서는 repository 에 있는 특정 Deep Learning 모델만 업로드할 수 있는 기능도 있다.
docker run 안에
--model-control-mode=explicit
--load-model=<model folder name 1>
--load-model=<model folder name 2>
...
--load-model=<model folder name n>
과 같은 방식으로 내가 구동하고자 하는 모델만 업로드 할 수 있다.
또한 container 를 생성할 때 shm-size, restart unless-stopped 등 여러 기능을 사용하면 모델 서빙에 용이하다.
그렇게 업로드하고 container 를 시작한다.
그리고 log 를 찍어보면 아래 사진과 같이 내가 지정한 모델이 구동되는지 확인할 수 있다.
log 관련 커멘드 : docker logs -f <container-name>
4. Docker container 재시작의 필요성 및 노하우
Docker container 를 재시작해야 할 때가 있다.
- 새로운 모델을 업로드하고자 할때
- 업로드된 모델의 version 을 업데이트하고자 할 때
- 업로드할 모델을 수정하고자 할 때
이때도 bash 파일로 restart 커멘드를 사용하면 편하다.
docker restart <container-name>
매번 SSH 에 docker restart 치기 귀찮지 않은가...
이렇게 관리하니까 정말 편하다.
내부 공유 및 기술이전도 차암 좋다. 아주 추천한다.
마무리,,
지금까지 Triton Server 를 활용해서 Deep Learning 모델을 Inference 하기 위한 방법을 알아봤다.
다른 블로그 글과의 차이점은 실무자의 입장에서 코드를 어떻게 관리해야 하는지, 왜 그렇게 관리해야 하는지를 명시했다는 점에 있다.
우리 모두는 혼자 일하는 사람이 아니다.
함께 협업해야 하기 때문에 항상 코드 공유, 기술 이전에 신경을 쓰며 일해야 한다.
다음 포스팅에서는 Triton Server 를 실무자 입장에서 효율적으로 활용할 수 있는 방법에 대해 다루어보도록 하겠다.
'Python > 환경 설정' 카테고리의 다른 글
NVIDIA Triton 에 대한 고찰 (1) | 2023.10.29 |
---|---|
[Setting] jupyter notebook 원격 접속 (0) | 2022.08.19 |
댓글