Triton Inference Server Kafka I/O 배포

Triton Inference Server Kafka I/O 배포 (Kafka I/O Deployment)

트리톤 인퍼런스 서버의 In-Process Python API를 쓰면 트리톤 기반 모델을 어떤 파이썬 프레임워크에도 통합할 수 있어요. 이 디렉토리는 Kafka 토픽에서 메시지를 소비하고 추론 결과를 원하는 Kafka 토픽에 다시 생산하도록 트리톤 서버 기반 모델을 통합하는 예시입니다. 이 예시 배포는 서버·컨슈머·프로듀서 각각에 스레드를 사용하는 Kafka I/O 방식의 트리톤 배포입니다.

설치

이 Kafka I/O 파이프라인에서는 transformers 토크나이제이션 모듈 기반의 전처리 단계를 배포하며, 필요에 따라 어떤 모델 유형으로든 확장할 수 있어요.

사전 요구사항

  • Docker

Docker 컨테이너 시작

docker 서비스가 실행 중이면 다음 명령으로 컨테이너를 시작합니다.

docker run --rm -it --gpus all -v <path>/<to>/tutorials/Triton_Inference_Server_Python_API/examples/kafka-io/:/opt/tritonserver/kafka-io -w /opt/tritonserver/kafka-io  --entrypoint bash nvcr.io/nvidia/tritonserver:26.08-py3

저장소 클론

git clone https://github.com/triton-inference-server/tutorials.git
cd tutorials/Triton_Inference_Server_Python_API/examples/kafka-io

[!참고] git 저장소를 로컬 디렉토리에서 docker 컨테이너로 마운트했다면 이 단계는 건너뛰세요.

의존성 설치

설치 시간은 하드웨어 구성과 네트워크 연결에 따라 달라질 수 있어요.

pip install -r requirements.txt

triton server가 아직 설치되지 않았다면 아래 명령으로 설치합니다.

pip install /opt/tritonserver/python/tritonserver-2.44.0-py3-none-any.whl

다음으로 제공된 start-kafka.sh 스크립트를 실행해요. 이 스크립트는:

  • Kafka와 그 의존성 다운로드
  • Zookeeper와 Kafka 브로커를 시작해 Kafka 서비스 시작
  • 입력 큐 역할의 inference-input과 추론 결과 저장용 inference-output이라는 2개의 새 토픽 생성
chmod +x start-kafka.sh
./start-kafka.sh

파이프라인 시작

추론 파이프라인 시작

start-server.sh 스크립트를 실행합니다. 이 스크립트는:

  • Kafka 프로듀서·컨슈머 config, 입력·출력 토픽 이름, 모델 이름·저장소 내보내기
  • 서버 시작
chmod +x start-server.sh
./start-server.sh

콘솔에 아래 비슷한 출력이 나오면 서버가 성공적으로 시작된 거예요.

2024-07-18 21:55:38,254 INFO api.py:609 -- Deployed app 'default' successfully.

Ctrl+C로 중단하고 다음 단계로 진행하면 됩니다.

[!참고] 위 호출에서는 Kafka 컨슈머 스레드를 기본 1개 사용합니다. 동시성을 늘리려면 환경변수 KAFKA_CONSUMER_MAX_WORKER_THREADS를 원하는 값으로 설정하고 서버를 재시작하세요. 컨슈머의 새 동시성으로 서버가 시작돼 배포 처리량이 늘어납니다.

배포에 요청 보내기

배포된 추론 파이프라인에 요청을 보내려면 다음 명령으로 입력 Kafka 토픽에 메시지를 생산합니다.

cd kafka_2.13-3.7.0
bin/kafka-console-producer.sh --topic inference-input --bootstrap-server localhost:9092

실행 후 > 프롬프트가 보이면 입력 토픽에 메시지를 넣기 시작하면 됩니다.

> this is a sample message
>

충분한 메시지를 넣었으면 Ctrl+C로 프롬프트를 나갑니다.

예시 출력

워크플로가 Kafka 토픽에서 들어온 메시지를 소비하면 트리톤 서버를 호출하고 추론 결과를 json 문자열로 출력 Kafka 토픽에 생산해요. 메시지가 들어오면 컨슈머를 시작해 출력 토픽으로 들어온 파이프라인 결과를 볼 수 있습니다.

bin/kafka-console-consumer.sh --topic inference-output --from-beginning --bootstrap-server localhost:9092

우리 예시는 트리톤에 커스텀 모델로 배포된 토크나이저가 있으므로, 아래처럼 Kafka 토픽에 삽입된 출력이 보여요.

{"model": {"name": "tokenizer", "version": 1, "state": null, "reason": null}, "request_id": "", "parameters": {}, "outputs": {"input_ids": [[101, 1142, 1110, 2774, 3802, 118, 1207, 130, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "token_type_ids": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}}

더 알아보기 (Learn more)