Triton Inference Server 의 github 내 documentation 을 읽고 정리한 글입니다.
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
architecture
Triton 은 서버 실행 시부터 다음 순서로 요소들을 거쳐, 클라이언트의 추론 요청을 처리한다.
아키텍처 내 주요 구성 요소는 다음과 같다.
model repository/code
추론 가능한 모델의 파일 기반 저장소
model repository 에 모델 파일 저장 후 서버 실행 시 모델 업로드
inference request
HTTP/REST 혹은 gRPC, C API 기반 추론 요청
클라이언트에서 추론 요청 시 서버에 전달 및 모델 별 스케줄러로 라우팅
per-model sheduler queues
각 모델의 스케줄러는 선택적으로 배치 단위 처리 후 모델의 타입에 따라 프레임워크 백엔드로 요청 전달
framework backend/code
프레임워크 백엔드에서 입력에 대해 추론 실행inference response
추론 결과를 클라이언트에 응답으로 반환
concurrent model execution
Triton 는 시스템 내 여러 모델 혹은 한 모델의 여러 인스턴스에서 병렬적으로 추론 실행이 가능하다. 아래와 같이 2개의 요청이 동시에 들어올 때, Triton 은 요청들을 GPU에 즉시 스케줄링하고, GPU의 하드웨어 스케줄러는 추론을 위해 두 요청에 대한 연산을 시작한다. CPU로 추론을 실행하는 경우에는, Triton 이 아닌 운영체제에 의해 CPU의 스레드에 대한 스케줄링이 이루어지는 것을 제외하면 Triton 과 유사하게 실행된다.
만약 아래와 같이 같은 모델에 대해 여러 요청이 들어올 경우, Triton 은 하나의 GPU 에 요청 실행을 순차적으로 스케줄링한다.
Triton 은 instance group 이라고 부르는 model configuration 옵션을 제공하는데, 이를 통해 각 모델에서 얼마나 많은 병렬 실행을 할 수 있는지 정할 수 있다. 여기서 병렬 실행은 instance 라고 불리며, 기본적으로 Triton 은 모델 당 하나의 instance 를 부여한다. 따라서 위의 그림과 같이 각 모델에서는 동시에 하나의 실행만 가능하며, instance-group 설정을 통해 모델에서 동시에 실행가능한 인스턴스의 수를 늘릴 수 있다.
예를 들면 model1 에 대해 3개의 instance 를 설정한 경우, 아래와 같이 model1 에 대한 3개의 추론 요청은 동시에 실행된다. 그리고 4번째 추론 요청은, 3개의 추론 요청 중 첫번째 요청이 완료될 때 실행이 되도록 대기한다.
아래와 같이 model repository 아래에 config.pbtxt 파일로 instance group 지정 시, 모델 별로 instance 몇 개까지 허용할지 지정할 수 있다.
instance_group [
{
count: 1
kind: KIND_GPU
gpus: [ 0 ]
},
{
count: 2
kind: KIND_GPU
gpus: [ 1, 2 ]
}
]
model and scheduler
Triton 은 각 모델에 대해 독립적으로 선택되는 여러 scheduling/batching algorithm 을 제공한다. stateless/stateful/ensemble 모델 타입 별로 다른 scheduler 를 제공하며, model configuration 파일으 작성할 때 스케줄러를 선택할 수 있다.
(현재 stateless model 만 사용중이므로, 여기선 stateless model 만을 다룬다.)
stateless model
stateless model 은 추론 요청 간 state 를 공유하지 않는 모델로, 모델에서 실행되는 각 추론은 해당 모델에서 실행되는 다른 추론과는 독립적으로 실행된다. stateless model 의 예로는 image classification 과 object detection 등에 사용되는 CNN 이 있으며, 이러한 stateless model 은 default scheduler
나 dynamic batcher
등을 사용한다.
RNN 의 경우, 내부에서 공유되는 메모리 (e.g. RNN 내에서 cell 을 통해 전파되는 입력값) 가 추론 요청 간 공유되지 않는 경우엔 stateless model 로 간주한다. 이 경우에는default scheduler
가 사용되지만, 보통 여러 추론 요청의 배치 단위 구성을 기대하지 않으므로, dynamic batcher
를 사용하지 않는다.
(RNN 은 배치 단위로 구성하더라도, 배치 단위를 병렬적으로 처리하지 못하고 샘플 단위로 순차적으로 처리해야하므로 배치로 구성하지 않는 것으로 생각한다.)
default scheduler
default scheduler 는 model configuration 에 따라 모든 모델의 instance 로 추론 요청을 분산한다.
dynamic batcher
dynamic batcher 는 서버 내에서 추론 요청을 동적으로 배치 단위로 조합하는 dynamic batching 을 구현하며, 생성된 배치들은 모든 모델의 instance 에 분산된다. dynamic batcher 는 stateless model 에서만 사용가능하다.
dynamic batching 은 model configuration 내에서 ModelDynamicBatching 속성으로 독립적으로 설정할 수 있다. preferred batch size, maximum queue delay time 과 queue size, priorites, time-outs 등을 지정할 수 있다.
아래와 같이 model configuration 에서 dynamic batching 을 설정한다.
dynamic_batching {
preferred_batch_size: [ 4, 8 ]
max_queue_delay_microseconds: 100
}
출처
'Production' 카테고리의 다른 글
도커를 이용한 스프링부트 어플리케이션 배포 (0) | 2021.11.30 |
---|