ในโลกของ AI ที่ต้องการความเร็วและประสิทธิภาพในการประมวลผล การรันหลายโมเดลพร้อมกันบนเซิร์ฟเวอร์เดียวเป็นความท้าทายที่ผมเผชิญมาตลอด โดยเฉพาะตอนที่ต้อง deploy ระบบ RAG (Retrieval-Augmented Generation) ขนาดใหญ่ให้กับลูกค้าองค์กร จากประสบการณ์ตรง ผมพบว่า Triton Inference Server คือคำตอบที่ดีที่สุดสำหรับปัญหานี้ และวันนี้จะมาแชร์วิธีการตั้งแต่ติดตั้งจนถึง deploy จริงให้ฟัง

ทำไมต้อง Triton Inference Server

ในโปรเจกต์ล่าสุดที่ผมทำ คือการสร้าง ระบบ RAG สำหรับศูนย์บริการลูกค้าอีคอมเมิร์ซ ที่ต้องรัน embedding model, reranker model และ LLM พร้อมกัน ความท้าทายคือ latency ต้องต่ำกว่า 500ms และต้องรองรับ load สูงสุด 1000 concurrent users

Triton ช่วยให้เราสามารถ:

การติดตั้ง Triton Inference Server

ผมแนะนำให้ติดตั้งผ่าน Docker เพราะสะดวกและ portable มากที่สุด

# ดึง Docker image ล่าสุดของ Triton
docker pull nvcr.io/nvidia/tritonserver:24.03-py3

รัน Triton Server พร้อมกำหนด port

docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 \ -v /models:/models \ nvcr.io/nvidia/tritonserver:24.03-py3 \ tritonserver --model-repository=/models --backend-config=python,0 \ --log-verbose=1

หมายเหตุ: วางโครงสร้างโฟลเดอร์ models ดังนี้

/models
├── embedding_model/
│   ├── 1/
│   │   └── model.py
│   │   └── config.pbtxt
├── reranker_model/
│   ├── 1/
│   │   └── model.py
│   │   └── config.pbtxt
└── llm_model/
    ├── 1/
    │   └── config.pbtxt
    └── config.pbtxt

สร้าง Model Backend สำหรับ LLM Integration

สำหรับการเชื่อมต่อ LLM ผ่าน API เราต้องสร้าง Python backend เอง ซึ่งผมใช้ HolySheep AI เป็น LLM provider เพราะมีราคาถูกกว่า 85% เมื่อเทียบกับ OpenAI (อัตรา ¥1=$1) และ latency ต่ำกว่า 50ms

# models/llm_model/1/model.py
import triton_python_backend_utils as pb_utils
import requests
import json

class TritonPythonModel:
    def initialize(self, args):
        self.model_config = json.loads(args['model_config'])
        
        # ดึง API config จาก backend parameters
        backend_config = self.model_config.get('backend_capabilities', {})
        
        # ตั้งค่า HolySheep AI - ราคาถูกกว่า 85%
        self.api_key = backend_config.get('parameters', {}).get(
            'api_key', {}).get('string_value', 'YOUR_HOLYSHEEP_API_KEY')
        self.base_url = "https://api.holysheep.ai/v1"
        
    def execute(self, requests):
        responses = []
        
        for request in requests:
            # รับ prompt จาก input tensors
            prompt_tensor = pb_utils.get_input_tensor_by_name(request, 'TEXT')
            prompt = prompt_tensor.as_numpy()[0].decode('utf-8')
            
            # เรียก HolySheep AI API
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            payload = {
                "model": "gpt-4.1",
                "messages": [{"role": "user", "content": prompt}],
                "max_tokens": 1024,
                "temperature": 0.7
            }
            
            try:
                response = requests.post(
                    f"{self.base_url}/chat/completions",
                    headers=headers,
                    json=payload,
                    timeout=30
                )
                result = response.json()
                
                # สกัดข้อความคำตอบ
                assistant_message = result['choices'][0]['message']['content']
                
                # ส่งกลับเป็น output tensor
                output_tensor = pb_utils.Tensor(
                    'RESPONSE',
                    np.array([assistant_message.encode('utf-8')], dtype=object)
                )
                
                inference_response = pb_utils.InferenceResponse(
                    output_tensors=[output_tensor]
                )
                responses.append(inference_response)
                
            except Exception as e:
                print(f"Error: {e}")
                # Handle error response
        
        return responses

การ Config Model Repository

# models/llm_model/config.pbtxt
name: "llm_model"
backend: "python"
max_batch_size: 32

input [
  {
    name: "TEXT"
    data_type: TYPE_STRING
    dims: [1]
  }
]

output [
  {
    name: "RESPONSE"
    data_type: TYPE_STRING
    dims: [1]
  }
]

instance_group [
  {
    count: 2
    kind: KIND_GPU
  }
]

dynamic_batching {
  preferred_batch_size: [4, 8, 16, 32]
  max_queue_delay_microseconds: 100000
}

parameters {
  key: "api_key"
  value: {string_value: "YOUR_HOLYSHEEP_API_KEY"}
}

การทำ Model Ensemble Pipeline

ข้อดีของ Triton คือสามารถเชื่อมโมเดลหลายตัวเป็น pipeline ได้ ผมใช้ feature นี้ในการสร้าง RAG pipeline ที่มี 3 ขั้นตอน: embedding → similarity search → rerank → LLM

# models/rag_ensemble/config.pbtxt
name: "rag_ensemble"
platform: "ensemble"
max_batch_size: 16

input [
  {
    name: "QUERY"
    data_type: TYPE_STRING
    dims: [1]
  }
]

output [
  {
    name: "ANSWER"
    data_type: TYPE_STRING
    dims: [1]
  }
]

ensemble_scheduling {
  step [
    {
      model_name: "embedding_model"
      input_map {
        key: "TEXT"
        value: "QUERY"
      }
      output_map {
        key: "EMBEDDING"
        value: "query_embedding"
      }
    },
    {
      model_name: "vector_search"
      input_map {
        key: "EMBEDDING"
        value: "query_embedding"
      }
      output_map {
        key: "CONTEXTS"
        value: "retrieved_contexts"
      }
    },
    {
      model_name: "reranker_model"
      input_map {
        key: "QUERY"
        value: "QUERY"
      }
      input_map {
        key: "CONTEXTS"
        value: "retrieved_contexts"
      }
      output_map {
        key: "RANKED"
        value: "reranked_contexts"
      }
    },
    {
      model_name: "llm_model"
      input_map {
        key: "TEXT"
        value: "final_prompt"
      }
      output_map {
        key: "RESPONSE"
        value: "ANSWER"
      }
    }
  ]
}

การ Deploy และทดสอบ

หลังจาก setup ทุกอย่างเรียบร้อย มาดูวิธีการ deploy และทดสอบระบบกัน

# Start Triton Server
docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 \
    -v /models:/models \
    --ulimit memlock=-1 \
    --ulimit stack=67108864 \
    nvcr.io/nvidia/tritonserver:24.03-py3 \
    tritonserver --model-repository=/models

ตรวจสอบสถานะ server

curl -v http://localhost:8000/v2/health/ready

ทดสอบเรียก inference

curl -X POST http://localhost:8000/v2/models/llm_model/infer \ -H "Content-Type: application/json" \ -d '{ "inputs": [ { "name": "TEXT", "shape": [1], "datatype": "BYTES", "data": ["Hello, explain Triton Inference Server in 3 sentences"] } ] }'

จากการทดสอบในโปรเจกต์จริง ผมได้ผลลัพธ์ดังนี้:

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. CUDA Out of Memory หลังจากรันโมเดลหลายตัว

สาเหตุ: โมเดลแต่ละตัวใช้ GPU memory เกินขนาดที่มี ผมเคยเจอปัญหานี้ตอน deploy embedding + LLM พร้อมกัน

# วิธีแก้: ใช้ Tensor Allocation Policy ที่ aggressive ขึ้น

เพิ่มใน config.pbtxt

parameters { key: "cuda" value: { string_value: "managed: true,cuda: true" } } instance_group [ { count: 1 # ลดจำนวน instance ลง kind: KIND_GPU gpus: [0] } ]

หรือใช้ model instance priority

dynamic_batching { preferred_batch_size: [4, 8] max_queue_delay_microseconds: 50000 }

2. Python Backend Import Error

สาเหตุ: Triton ไม่พบ triton_python_backend_utils โดยเฉพาะเมื่อใช้ custom Python backend

# วิธีแก้: ติดตั้ง Python dependencies ใน container

สร้าง requirements.txt ในโฟลเดอร์โมเดล

models/llm_model/requirements.txt

triton-python-backend==24.3.0 requests==2.31.0 numpy==1.24.0

แล้วรันด้วย volume mount

docker run --gpus=1 --rm -p8000:8000 \ -v /models:/models \ -v /requirements:/requirements \ nvcr.io/nvidia/tritonserver:24.03-py3 \ bash -c "pip install -r /requirements/requirements.txt && \ tritonserver --model-repository=/models"

3. Dynamic Batching ไม่ทำงานตามคาด

สาเหตุ: Backend return response ไม่ทันก่อน timeout หรือไม่รองรับ batching

# วิธีแก้: ตรวจสอบ model.py ให้รองรับ batch input

class TritonPythonModel:
    def initialize(self, args):
        # รองรับ dynamic batch
        self.dynamic_batching = True
        
    def execute(self, requests):
        # รวม prompt ทั้งหมดเป็น batch
        prompts = []
        for request in requests:
            prompt_tensor = pb_utils.get_input_tensor_by_name(request, 'TEXT')
            prompt = prompt_tensor.as_numpy()[0].decode('utf-8')
            prompts.append(prompt)
        
        # ประมวลผลทีละ batch
        results = self.process_batch(prompts)
        
        # return ทีละ response
        responses = []
        for result in results:
            output_tensor = pb_utils.Tensor(
                'RESPONSE',
                np.array([result.encode('utf-8')], dtype=object)
            )
            responses.append(pb_utils.InferenceResponse(
                output_tensors=[output_tensor]
            ))
        
        return responses

และเพิ่ม preferred_batch_size ที่เหมาะสม

ใน config.pbtxt

dynamic_batching { preferred_batch_size: [4, 8, 16] max_queue_delay_microseconds: 100000 preserve_ordering: true }

4. HolySheep API Timeout Error

สาเหตุ: API timeout สั้นเกินไปสำหรับ LLM ที่มี response ยาว

# วิธีแก้: เพิ่ม timeout และ implement retry logic

class TritonPythonModel:
    def execute(self, requests):
        max_retries = 3
        timeout = 120  # เพิ่ม timeout
        
        for request in requests:
            for attempt in range(max_retries):
                try:
                    response = requests.post(
                        f"{self.base_url}/chat/completions",
                        headers=headers,
                        json=payload,
                        timeout=timeout
                    )
                    
                    if response.status_code == 200:
                        break
                    elif response.status_code == 429:
                        # Rate limit - รอแล้ว retry
                        time.sleep(2 ** attempt)
                    else:
                        raise Exception(f"API Error: {response.status_code}")
                        
                except requests.Timeout:
                    if attempt == max_retries - 1:
                        raise
                    time.sleep(1)
        
        return responses

สรุปและแนวทางต่อยอด

จากประสบการณ์ที่ deploy ระบบ RAG หลายตัวให้องค์กร การใช้ Triton Inference Server ช่วยให้เราจัดการ multi-model inference ได้อย่างมีประสิทธิภาพ ลดค่าใช้จ่ายด้าน infrastructure และเพิ่ม throughput ได้อย่างน่าพอใจ

สิ่งที่ควรลองต่อไป:

สำหรับใครที่กำลังมองหา LLM provider ที่คุ้มค่า ผมแนะนำ HolySheep AI เพราะราคาถูกมาก (GPT-4.1 เพียง $8/MTok, Claude Sonnet 4.5 $15/MTok, DeepSeek V3.2 ถูกสุดที่ $0.42/MTok) แถมรองรับ WeChat/Alipay สำหรับผู้ใช้ในจีน และ latency ต่ำกว่า 50ms

👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน