동시 모델 실행
동시 모델 실행 (Concurrent Model Execution)
Triton 아키텍처는 여러 모델 및/또는 같은 모델의 여러 인스턴스를 같은 시스템에서 병렬로 실행할 수 있게 해줘요. 시스템에는 GPU가 0개, 1개 또는 여러 개 있을 수 있어요. 아래 그림은 model0과 model1 두 모델이 있는 예시예요. Triton이 어떤 요청도 처리하지 않고 있을 때, 각 모델에 대해 요청 하나씩 두 요청이 동시에 도착하면 Triton은 둘 다 즉시 GPU에 스케줄링하고 GPU의 하드웨어 스케줄러가 두 계산을 병렬로 처리하기 시작해요. 시스템 CPU에서 실행하는 모델도 Triton이 비슷하게 처리하는데, 다만 각 모델을 실행하는 CPU 스레드의 스케줄링은 시스템 OS가 담당해요.

기본적으로 같은 모델에 대한 여러 요청이 동시에 도착하면, Triton은 아래 그림처럼 GPU에 한 번에 하나만 스케줄링해서 실행을 직렬화해요.

Triton은 instance-group이라는 모델 구성 옵션을 제공해서, 각 모델이 자신의 병렬 실행이 몇 개까지 허용되는지 지정할 수 있게 해줘요. 이렇게 켜진 각 병렬 실행을 *인스턴스(instance)*라고 불러요. 기본적으로 Triton은 시스템의 각 가용 GPU에 대해 각 모델에 인스턴스 하나를 줘요. 모델 구성의 instance_group 필드를 쓰면 모델의 실행 인스턴스 수를 바꿀 수 있어요. 아래 그림은 model1이 인스턴스 3개를 허용하도록 구성된 경우의 모델 실행을 보여줘요. 그림에 보이듯 처음 세 개의 model1 추론 요청은 즉시 병렬로 실행돼요. 네 번째 model1 추론 요청은 처음 세 실행 중 하나가 끝날 때까지 기다렸다가 시작해야 해요.

모델과 스케줄러 (Models And Schedulers)
Triton은 각 모델에 대해 독립적으로 선택할 수 있는 여러 스케줄링·배치 알고리즘을 지원해요. 이 섹션은 stateless와 stateful 모델을 설명하고 Triton이 그 모델 유형을 지원하는 스케줄러를 어떻게 제공하는지 다뤄요. 주어진 모델의 스케줄러 선택과 구성은 모델 구성 파일로 해요.
Stateless 모델
Triton의 스케줄러 관점에서 stateless 모델은 추론 요청 사이에 상태를 유지하지 않아요. stateless 모델에서 수행되는 각 추론은 그 모델을 쓰는 다른 모든 추론과 독립적이에요.
stateless 모델의 예로는 이미지 분류·객체 검출 같은 CNN이 있어요. 이런 stateless 모델에는 기본 스케줄러나 동적 배처를 스케줄러로 쓸 수 있어요.
내부 메모리가 있는 RNN과 비슷한 모델도, 유지하는 상태가 추론 요청을 넘어가지 않으면 stateless일 수 있어요. 예를 들어 배치 안의 모든 요소를 순회하는 RNN은, 내부 상태가 추론 요청 배치 사이로 전달되지 않으면 Triton이 stateless로 간주해요. 이런 stateless 모델에는 기본 스케줄러를 쓸 수 있어요. 배치가 여러 추론 요청을 나타낼 거라 모델이 보통 기대하지 않으므로 동적 배처는 사용할 수 없어요.
Stateful 모델
Triton의 스케줄러 관점에서 stateful 모델은 추론 요청 사이에 상태를 유지해요. 모델은 함께 하나의 추론 시퀀스를 이루는 여러 추론 요청을 기대하며, 그 요청들은 같은 모델 인스턴스로 라우팅되어 모델이 유지하는 상태가 올바르게 갱신되도록 해야 해요. 게다가 모델은 예를 들어 시퀀스의 시작과 끝을 나타내는 제어(control) 신호를 Triton이 제공하기를 요구할 수 있어요.
이런 stateful 모델에는 시퀀스 배처을 사용해야 해요. 아래에서 설명하듯 시퀀스 배처는 시퀀스 안의 모든 추론 요청이 같은 모델 인스턴스로 라우팅되도록 보장해서 모델이 상태를 올바르게 유지할 수 있게 해줘요. 시퀀스 배처는 모델과 소통해 시퀀스가 언제 시작되는지, 언제 끝나는지, 언제 추론 요청이 실행 준비됐는지, 그리고 시퀀스의 *상관 ID(correlation ID)*를 알려줘요.
stateful 모델에 추론 요청을 보낼 때 클라이언트 앱은 시퀀스 안의 모든 요청에 같은 상관 ID를 제공해야 하고, 시퀀스의 시작과 끝도 표시해야 해요. 상관 ID 덕분에 Triton이 요청들이 같은 시퀀스에 속한다는 걸 식별할 수 있어요.
제어 입력 (Control Inputs)
stateful 모델이 시퀀스 배처와 올바르게 동작하려면 모델이 보통 Triton이 모델과 소통하는 데 쓰는 제어(control) 입력 텐서를 하나 이상 받아들여야 해요. 모델 구성의 ModelSequenceBatching::Control 섹션은 모델이 시퀀스 배처가 제어에 사용해야 할 텐서를 어떻게 노출하는지 나타내요. 모든 제어는 선택적이에요. 아래는 사용 가능한 모든 제어 신호에 대한 예제 구성을 보여주는 모델 구성 일부예요.
sequence_batching {
control_input [
{
name: "START"
control [
{
kind: CONTROL_SEQUENCE_START
fp32_false_true: [ 0, 1 ]
}
]
},
{
name: "END"
control [
{
kind: CONTROL_SEQUENCE_END
fp32_false_true: [ 0, 1 ]
}
]
},
{
name: "READY"
control [
{
kind: CONTROL_SEQUENCE_READY
fp32_false_true: [ 0, 1 ]
}
]
},
{
name: "CORRID"
control [
{
kind: CONTROL_SEQUENCE_CORRID
data_type: TYPE_UINT64
}
]
}
]
}
-
시작(Start): 시작 입력 텐서는 구성에서 CONTROL_SEQUENCE_START로 지정해요. 예제 구성은 모델이 32비트 부동소수점 데이터 타입의 START라는 입력 텐서를 가진다는 걸 나타내요. 시퀀스 배처는 모델에서 추론을 실행할 때 이 텐서를 정의해요. START 텐서는 배치 크기와 같은 크기의 1차원이어야 해요. 텐서의 각 원소는 해당 배치 슬롯의 시퀀스가 시작되는지 여부를 나타내요. 예제 구성에서 fp32_false_true는 텐서 원소가 1이면 시퀀스 시작, 0이면 시작이 아님을 나타내요.
-
끝(End): 끝 입력 텐서는 구성에서 CONTROL_SEQUENCE_END로 지정해요. 예제 구성은 모델이 32비트 부동소수점 데이터 타입의 END라는 입력 텐서를 가진다는 걸 나타내요. 시퀀스 배처는 모델에서 추론을 실행할 때 이 텐서를 정의해요. END 텐서는 배치 크기와 같은 크기의 1차원이어야 해요. 텐서의 각 원소는 해당 배치 슬롯의 시퀀스가 끝나는지 여부를 나타내요. 예제 구성에서 fp32_false_true는 텐서 원소가 1이면 시퀀스 끝, 0이면 끝이 아님을 나타내요.
-
준비(Ready): 준비 입력 텐서는 구성에서 CONTROL_SEQUENCE_READY로 지정해요. 예제 구성은 모델이 32비트 부동소수점 데이터 타입의 READY라는 입력 텐서를 가진다는 걸 나타내요. 시퀀스 배처는 모델에서 추론을 실행할 때 이 텐서를 정의해요. READY 텐서는 배치 크기와 같은 크기의 1차원이어야 해요. 텐서의 각 원소는 해당 배치 슬롯의 시퀀스가 추론할 준비가 된 요청을 갖고 있는지 여부를 나타내요. 예제 구성에서 fp32_false_true는 텐서 원소가 1이면 시퀀스 준비, 0이면 준비 안 됨을 나타내요.
-
상관 ID(Correlation ID): 상관 ID 입력 텐서는 구성에서 CONTROL_SEQUENCE_CORRID로 지정해요. 예제 구성은 모델이 unsigned 64비트 정수 데이터 타입의 CORRID라는 입력 텐서를 가진다는 걸 나타내요. 시퀀스 배처는 모델에서 추론을 실행할 때 이 텐서를 정의해요. CORRID 텐서는 배치 크기와 같은 크기의 1차원이어야 해요. 텐서의 각 원소는 해당 배치 슬롯의 시퀀스 상관 ID를 나타내요.
Stateful 모델의 상태 관리 (State Management for Stateful Models)
Stateful 모델의 상태 관리는 Implicit State Management에서 다룹니다.
더 알아보기 (Learn more)
- 스케줄러 (Schedulers) — 기본·앙상블 스케줄러
- 동적 배치 (Batchers) — 동적·시퀀스 배처
- 모델 구성 (Model Configuration) — 인스턴스 그룹 설정