딥러닝(Deep Learning)/Etc.

[TRTIS] Triton Inference Server 사용해보기 - 1 (개요 및 설치)

내 이름인데 윤기를 왜 못써 2024. 3. 30. 16:50

목차

    회사에서 모델을 Inference 하는데, Triton Inference Server를 사용해서 우여곡절 끝에 익힌 내용들을 정리하기 위해서 기록을 남긴다. 모델 배포 경험은 FastAPI로 Torch 모델을 서빙하는 간단한 작업밖에 모르는지라 처음 접하는 이 프레임워크는 쉽지 않았다. 구글에 막히는 내용에 대해서, 검색을 해도 많이 나오지 않을뿐더러 세부적인 내용은 직접 부딪히며 해결한 게 더 많은 것 같다.

    초기세팅부터 모델적재와 작업을 수행하며, 어려웠던 점들을 기록해 볼 예정이다.

    ‼️ 배포 전문가의 글이 아니니, 틀린 내용이 아주 많을 수 있다.
    배우는 과정이니 나와 같은 문제점에 접한 사람들이 도움이 됐으면 하고, 후에 조금 더 편하게 문제를 해결했으면 하는 마음이다.

    개요

    Triton Inference Server란?

    AI 추론을 간소화하는 NVIDIA의 오픈 소스 Inference Serving 소프트웨어다. 다양한 머신러닝 프레임워크(TenrsorRT, TensorFlow, PyTorch, ONNX, OpenVINO, Python, RAPIDS FIL..)를 배포할 수 있게 지원한다. 아래는 NVIDIA가 말하는 주요 기능들이다. 

    • Multiple deep learning frameworks
    • Multiple machine learning frameworks
    • Concurrent model execution
    • Dynamic batching
    • Sequence batching and implicit state management for stateful models
    • Provides Backend API that allows adding custom backends and pre/post processing operations
    • Supports writing custom backends in python
    • Model pipelines using Ensembling or Business Logic Scripting(BLS)
    • HTTP/REST and GRPC inference protocols based on the community developed KServe protocol
    • C API and Java API allow Triton to link directly into your application for edge and other in-process use cases
    • Metrics indicating GPU utilization, server throughput, server latency, and more

    뭔가 엄청 많은 주요기능이 보이지만, AI 모델 배포에 최적화되어 있다는 설명이다. 더 자세한 내용은 아래 레포를 들어가서 확인해 보자.

    https://github.com/triton-inference-server/server

     

    GitHub - triton-inference-server/server: The Triton Inference Server provides an optimized cloud and edge inferencing solution.

    The Triton Inference Server provides an optimized cloud and edge inferencing solution. - GitHub - triton-inference-server/server: The Triton Inference Server provides an optimized cloud and edge i...

    github.com

     

    설치

    설치하는 방법으론 필요한 기능에 맞춰서 Docker Image를 직접 Build 하는 방법이 있다. 빌드 진행을 위한 스크립트를 레포에서 제공하기에 필요하다면 따라서 진행하면 될 것 같다. 자세한 내용은 깃허브에 해당 내용을 참고하자.

    나는 처음 접했기에, 가장 쉬운 방향으로 진행했다.

     

    NVDIA NGC(NVIDIA GPU Cloud)에서 제공하는 Image를 이용하면, 쉽게 Docker 이미지만 받아서 TRTIS를 구동할 수 있다.

    먼저 아래 사이트에 접속한다.

    https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver

     

    Triton Inference Server | NVIDIA NGC

    Triton Inference Server is an open source software that lets teams deploy trained AI models from any framework, from local or cloud storage and on any GPU- or CPU-based infrastructure in the cloud, data center, or embedded devices.

    catalog.ngc.nvidia.com

    그러면 바로 설명에 Five Docker Images를 사용가능하다고 나와있는데, 크게 지원하는 프레임워크와 백엔드에 따라서 나뉜다. xx.yy 는 xx년 yy월 릴리즈 날짜를 의미한다. 

    • `xx.yy-py3` : Triton Inference Server, Tensorflow, PyTorch, TensorRT, ONNX, OpenVINO을 모두 지원하는 보편적인 이미지
    • `xx.yy-py3-sdk` : Python, C++ Client libraries, Client Examples and Model Analyzer(Perf Analyzer) => 클라이언트 사용 및 성능 분석을 위한 이미지
    • `xx.yy-py3-min` : Custom Triton Server Containers를 만들기 위한 Base 이미지
    • `xx.yy-pyt-python-py3` : Triton Inference Server, PyTorch, Python Backends만을 지원하는 이미지
    • `xx.yy-tf2-python-py3` : Triton Inference Server, TensorFlow2.0, Python Backends만을 지원하는 이미지

    우리는 보편적인 이미지인 py3 이미지를 사용해서 서버를 만들어볼 예정이다.

    또한 릴리즈 날짜가 중요한데, 해당 릴리즈가 지원하는 라이브러리 버전이나 CUDA 버전이 다르기에 자신의 상황에 맞춰서 받아야 한다.

    해당 내용은 아래 Frameworks Support Matrix 사이트를 확인하자.

    https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html

     

    Frameworks Support Matrix - NVIDIA Docs

     

    docs.nvidia.com

    이미지에 사용된 기반 내용이 모두 잘 적혀있으니, 자신이 필요한 상황에 맞춰서 이미지를 받아주면 좋다.

    최신이라고 좋은 것이 아니다!!
    예를 들어 24.02 릴리즈 같은 경우 ONNX 모델 구동을 위한 ONNX Runtime이 아예 빠져있다. 그 이유는 해당 이미지에 사용된 CUDA 버전과 맞는 ONNX Runtime Stable 릴리즈가 없었기에, 빠져있는 것이다.

     

    주의 깊게 봐야 할 항목은 아래 정도가 될 것이라 생각한다.

    • NVIDIA Driver : CUDA 버전을 잘 보고 자신의 GPU의 드라이버 버전과 맞는지 체크하자.
    • CUDA : 위와 동일
    • cuDNN : 동일
    • Triton Inference Server : 우리가 받을 이미지이기에, 여기서 자신과 맞는 Python 버전, 지원하는 Software 및 버전을 체크하자.

    나는 23.08 릴리즈를 사용했다. 이유는 딱히 없다. 하드웨어와 모든 게 적당한 버전이라서 해당 릴리즈를 사용한 것이다.

     

    릴리즈를 결정했다면, 맨 위에 NGC Triton Inference Server 사이트의 Tags 탭으로 이동한다.

    여기서 결정한 릴리즈를 검색하자.

     

    그럼 위와 같이 언급했던 이미지들에 대한 태그와 이미지 주소가 나온다.

    우리는 보편적인 사용을 위해 py3 이미지를 사용한다고 했으니, "nvcr.io/nvidia/tritonserver:23.08-py3" 이 주소를 복사해 준다.


    이제 이미지를 받거나, 추가 라이브러리를 설치해서 나만의 이미지를 만들어보자.

    Docker 환경은 구성이 되어 있다는 전제하에 진행하겠다.

     

    프로젝트 폴더를 하나 만들고, 해당 프로젝트에 Dockerfile을 만들고 작성해 보자.(파일 이름 자체가 Dockerfile이다.)

    추가로 설치할 라이브러리가 없다면, `docker pull nvcr.io/nvidia/tritonserver:23.08-py3` 커맨드를 입력해서, 이미지를 바로 받아주자. 추가로 필요한 라이브러리가 있다면, 아래 과정을 참고하자.

     

    현재 글의 내용에 맞게 Dockerfile 작성에 필요한 내용을 거의 생략할 것이다. 더 자세한 건 다른 블로그를 참조해서 공부해 봐도 좋을 것 같다.

     

    Dockerfile은 Base가 되는 이미지에 자신이 필요한 라이브러리나 소프트웨어를 추가해서 이미지를 새롭게 만드는 데 사용된다.

    Base가 되는 이미지는 `FROM` 에 작성해 주고, 그 이외 필요한 라이브러리 설치는 `RUN` 이하에 커맨드를 작성해서 설치한다.

    `FROM` 엔 아까 사용하기로 한 릴리즈 nvcr.io/nvidia/tritonserver:23.08-py3를 적어주고

    추가 설치에는 torchaudio 라이브러리가 필요해서 설치해 줬다.

    FROM nvcr.io/nvidia/tritonserver:23.08-py3
    
    RUN pip install --upgrade pip && \
        pip install torch torchaudio

     

    그럼 이제 이 Dockerfile을 가지고 build를 진행해야 한다.

    Dockerfile이 작성된 디렉터리로 이동해서, 아래의 커맨드를 입력하자. `-t` 옵션은 생성될 이미지의 이름(태그)을 지정할 수 있다. 원래는 format이 있지만, 생략하면 알아서 잘 만들어준다.

    또한 뒤에 현재 디렉터리에 있는 Dockerfile을 사용할 것이기에 `.` 을 인자로 준 것을 볼 수 있다.(build 커맨드만 해도 옵션이 엄청 많기에, 앞서 말했 듯 최소한의 설명만 진행한다.)

    `docker build -t [지정할 tag 이름] .`

     

    만약 태그의 이름을 "trtis"로 지정한다면, 아래와 같이 작성하면 될 것이다.

    `docker build -t trtis .`

     

    그럼 필요한 Base 이미지의 다운로드와 함께 도커 이미지의 빌드가 시작될 것이다.

    빌드가 끝나고 이미지가 잘 구워졌으면, `docker images` 커맨드를 입력해 빌드된 이미지를 확인해 볼 수 있다.

    위와 같이 [이름, 버전, 이미지 ID, 생성 시기, 용량] 순으로 잘 나오는 것을 볼 수 있다.

    버전은 이 이미지에 해당하는 버전이다. 위에서 언급한 tag이름에 [이미지 이름:버젼명]으로 주면 지정할 수 있다.

     

    그럼 이제 구워진 이미지를 가지고, 아래 커맨드를 입력해서 컨테이너를 가동해 보자.

    `docker run -it --rm --name triton_server trtis`

     

    위에 사용된 run 옵션을 간단하게 설명하자면, 아래와 같다.

    • `-i`, `-t` : 표준 입출력(STDIN)으로 해당 컨테이너 터미널에 연결(둘이 거의 같이 쓰인다.)
    • `--rm` : 컨테이너 탈출 시, 자동으로 삭제
    • `--name` : 컨테이너 이름

    `run` 커맨드에 훨씬 많은 옵션이 있지만, 일단 테스트를 위해 가장 간단한 옵션만 제공했다.

    서버를 가동하기 위해서 필요한 옵션이 더 많이 있는데, 그건 다음 장에 서버 가동을 하면서 설명을 진행할 예정이다.

     

    컨테이너 가동을 정상적으로 완료했다면, 바로 아래와 같이 자신의 터미널이 컨테이너의 쉘로 바뀌게 될 것이다.

     

    위와 같이 쉘이 바뀌는 것을 확인했으면, `exit` 를 입력해서 컨테이너를 종료하자.


    이렇게 Triton Inference Server를 구동하기 위한 준비를 마쳤다.

    다음장에는 진짜 서버를 구동해 보고, 모델 배포를 위해서 필요한 내용을 정리해 보도록 하자.

    반응형