기존에는 FastAPI가 요리도 하고 서빙도 했다면, 이제는 FastAPI가 지배인이 되고, Triton이라는 전문 요리 기계를 주방에 들여놓는 구조입니다. 🤖🍳
1️⃣ 전체 아키텍처 다이어그램 (Architecture Overview) 🗺️
- Streamlit (Frontend) 🎨: 사용자 입력을 받고, 결과를 시각화합니다. (이미지 업로드 등)
- FastAPI (Backend / Orchestrator) 🧠:
- 전처리(Preprocessing): 사용자의 이미지/텍스트를 숫자로 된 **텐서(Tensor)**로 변환합니다.
- 통신(Communication): 변환된 텐서를 gRPC 프로토콜로 Triton에게 쏩니다.
- 후처리(Postprocessing): Triton이 뱉은 결과(숫자)를 사람이 이해할 수 있는 값(클래스명 등)으로 바꿉니다.
- Triton Inference Server (AI Engine) 🏎️:
- 오직 **추론(Inference)**만 담당합니다.
- GPU를 극한으로 활용하며, 여러 모델을 동시에 관리합니다.
- Model Repository 🗄️: 모델 파일(model.onnx, config.pbtxt 등)이 저장된 폴더입니다.
2️⃣ 왜 이 구조가 강력한가요? (핵심 포인트) 💡
🅰️ 통신 프로토콜: "HTTP보다 빠른 gRPC" ⚡️
FastAPI와 Triton 사이에는 gRPC를 사용하세요. HTTP(REST API)보다 데이터 전송 속도가 훨씬 빠르고, 이진 데이터(이미지 텐서)를 보내기에 최적화되어 있습니다.
🅱️ 동적 배칭 (Dynamic Batching) 📦✨
이게 Triton을 쓰는 진짜 이유입니다!
- FastAPI 혼자일 때: 요청이 10개 오면 1개씩 10번 GPU를 돌립니다. (비효율 🐢)
- Triton 도입 후: 요청이 10개 오면, Triton이 0.1초 동안 기다렸다가 10개를 묶어서 한 번에(Batch) 처리합니다. (초고속 🚀)
☪️ 역할 분담 (Decoupling) ✂️
FastAPI는 비즈니스 로직(로그인, DB 저장)에 집중하고, 무거운 AI 연산은 Triton이 전담하므로 서버가 훨씬 안정적입니다.
3️⃣ 코드 레벨 구현 가이드 (Implementation Snippets) 📝
1. 폴더 구조 (Model Repository) Triton은 약속된 폴더 구조가 아주 중요해요! 📂
Plaintext
model_repository/
└── my_model/
├── config.pbtxt # ⚙️ 모델 설정 (입출력 모양, 배칭 설정 등)
└── 1/ # 1️⃣ 버전 정보
└── model.onnx # 실제 모델 파일
2. Triton 설정 파일 (config.pbtxt) "나는 이 모델을 동적 배칭으로 돌릴 거야!"라고 선언합니다.
Protocol Buffers
name: "my_model"
platform: "onnxruntime_onnx"
max_batch_size: 8 # 📦 최대 8개까지 묶어서 처리!
dynamic_batching { } # ✨ 마법의 옵션 활성화
3. FastAPI에서 Triton 호출하기 (Client Code) tritonclient 라이브러리를 사용합니다.
Python
# @title FastAPI - Triton Client 예시
import tritonclient.grpc as grpcclient
import numpy as np
# Triton 서버 연결 (보통 8001번 포트가 gRPC)
triton_client = grpcclient.InferenceServerClient(url="triton-server:8001")
def request_inference(image_data):
# 1. 전처리: 이미지를 numpy 배열로 변환
input_data = preprocess_image(image_data)
# 2. Triton 입력 객체 생성
inputs = [grpcclient.InferInput("INPUT_0", input_data.shape, "FP32")]
inputs[0].set_data_from_numpy(input_data)
# 3. 추론 요청 (gRPC) 📨
results = triton_client.infer(model_name="my_model", inputs=inputs)
# 4. 결과 받기 및 후처리
output_data = results.as_numpy("OUTPUT_0")
return postprocess(output_data)
💡 쉽고 정확한 비유: "최첨단 자동화 공장" 🏭🤖
이 구조는 수제 공방이 최첨단 자동화 공장으로 바뀌는 과정과 같아요!
- Streamlit 👉 "키오스크 (접수 창구)" 🖥️ : 고객이 주문을 넣는 화면이에요.
- FastAPI 👉 "공장 관리자 (Manager)" 👨💼 : 주문서를 확인하고, 재료(이미지)를 규격에 맞게 손질(전처리)해서 기계 라인에 올려놓아요. 완성품이 나오면 예쁘게 포장(후처리)해서 고객에게 줍니다.
- Triton 👉 "초고속 컨베이어 벨트 기계" ⚙️🦾 : 관리자가 재료를 하나씩 주든, 한 번에 쏟아붓든 알아서 척척(Batching) 받아서, 눈보다 빠르게 조립(Inference)해냅니다. 관리자는 기계가 어떻게 돌아가는지 몰라도 돼요. 그냥 넣으면 나옵니다!
- gRPC 👉 "공장 내부 전용 5G망" 📶 : 관리자와 기계 사이의 통신은 외부 인터넷(HTTP)이 아니라, 전용 고속도로(gRPC)를 타서 엄청나게 빠릅니다.
'AI 엔지니어준비' 카테고리의 다른 글
| 📉 INT8 vs INT4: AI 모델, 얼마나 더 가볍게 만들까? 🤔 (0) | 2026.01.23 |
|---|---|
| (PyTorch/TF)도 triton을 사용하면성능이 올라가나? (0) | 2026.01.20 |
| 🕸️ Docker Network: 컨테이너들의 소통 창구! 🗣️ (1) | 2026.01.20 |
| 🐳 도커 스토리지 바인드 마운트, tmpfs, 그리고 --mount 🚩 (1) | 2026.01.20 |
| 🐳 도커 이미지 vs 도커 볼륨: 무엇이 다를까? 🤔 (0) | 2026.01.20 |