Giới thiệu về TensorRT-LLM

Trong quá trình triển khai các mô hình ngôn ngữ lớn (LLM) cho production, tôi đã thử nghiệm nhiều giải pháp tăng tốc inference khác nhau. TensorRT-LLM của NVIDIA là công cụ mạnh mẽ nhất mà tôi từng sử dụng để đạt được độ trễ cực thấp với chi phí GPU hợp lý. Bài viết này sẽ hướng dẫn bạn từng bước cách cài đặt, cấu hình và triển khai TensorRT-LLM một cách hiệu quả.

TensorRT-LLM không chỉ đơn thuần là một engine inference — nó là một framework tối ưu hóa toàn diện bao gồm kernel fusion, quantization, và batching chiến lược. Trong thực chiến, tôi đã đạt được độ trễ dưới 50ms cho các request đơn lẻ với model 7B parameters trên GPU A100.

Yêu Cầu Hệ Thống và Môi Trường

Cài Đặt TensorRT-LLM Chi Tiết

Bước 1: Cài Đặt Docker và NVIDIA Container Toolkit

# Cài đặt Docker
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo systemctl enable docker
sudo systemctl start docker

Thêm user vào docker group

sudo usermod -aG docker $USER newgrp docker

Cài đặt NVIDIA Container Toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker

Bước 2: Build Docker Image với TensorRT-LLM

# Clone TensorRT-LLM repository
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM

Build Docker image từ Dockerfile

docker build -t tensorrt-llm:latest \ --build-arg BASE_IMAGE=nvidia/cuda:12.4.1-devel-ubuntu22.04 \ --network=host \ .

Kiểm tra image đã build thành công

docker images | grep tensorrt-llm

Bước 3: Download và Convert Model

# Chạy container với GPU support
docker run --gpus all --rm -it \
    --shm-size=32g \
    -v /path/to/models:/models \
    tensorrt-llm:latest bash

Bên trong container, download model (ví dụ: Llama-2-7B)

python3 /TensorRT-LLM/scripts/download_model.py \ --model_dir /models/llama-2-7b \ --model_type llama \ --hf_model_name meta-llama/Llama-2-7b-hf

Convert sang TensorRT-LLM format

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype float16 \ --tp_size 1 \ --output_dir /models/llama-2-7b/trt_engine

Tích Hợp API với HolySheep AI

Trong quá trình phát triển và testing, tôi thường sử dụng HolySheep AI làm backend thay thế vì tỷ giá chỉ ¥1=$1 (tiết kiệm 85%+ so với OpenAI), hỗ trợ WeChat/Alipay, và độ trễ dưới 50ms. Đặc biệt, khi đăng ký bạn sẽ nhận được tín dụng miễn phí để bắt đầu thử nghiệm ngay.

import requests
import json
import time

class HolySheepAPIClient:
    """Client cho HolySheep AI API - Tích hợp TensorRT-LLM backend"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url.rstrip('/')
        self.session = requests.Session()
        self.session.headers.update({
            'Authorization': f'Bearer {api_key}',
            'Content-Type': 'application/json'
        })
    
    def chat_completion(
        self,
        messages: list,
        model: str = "gpt-4.1",
        temperature: float = 0.7,
        max_tokens: int = 2048
    ) -> dict:
        """
        Gọi API chat completion với streaming support
        
        Args:
            messages: Danh sách message [{"role": "user", "content": "..."}]
            model: Model name (gpt-4.1, claude-sonnet-4.5, deepseek-v3.2)
            temperature: Sampling temperature (0.0 - 2.0)
            max_tokens: Maximum tokens to generate
        
        Returns:
            Response dict với generated text và usage stats
        """
        endpoint = f"{self.base_url}/chat/completions"
        
        payload = {
            "model": model,
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens,
            "stream": False
        }
        
        start_time = time.time()
        
        try:
            response = self.session.post(endpoint, json=payload, timeout=30)
            response.raise_for_status()
            
            result = response.json()
            latency_ms = (time.time() - start_time) * 1000
            
            return {
                'success': True,
                'content': result['choices'][0]['message']['content'],
                'model': result['model'],
                'usage': result.get('usage', {}),
                'latency_ms': round(latency_ms, 2),
                'finish_reason': result['choices'][0].get('finish_reason')
            }
            
        except requests.exceptions.Timeout:
            return {'success': False, 'error': 'Request timeout'}
        except requests.exceptions.RequestException as e:
            return {'success': False, 'error': str(e)}
    
    def streaming_chat(self, messages: list, model: str = "gpt-4.1") -> iter:
        """
        Streaming chat completion cho real-time response
        
        Yields:
            Chunks của generated text
        """
        endpoint = f"{self.base_url}/chat/completions"
        
        payload = {
            "model": model,
            "messages": messages,
            "temperature": 0.7,
            "max_tokens": 2048,
            "stream": True
        }
        
        response = self.session.post(
            endpoint, 
            json=payload, 
            stream=True, 
            timeout=60
        )
        response.raise_for_status()
        
        for line in response.iter_lines():
            if line:
                line_text = line.decode('utf-8')
                if line_text.startswith('data: '):
                    data = line_text[6:]
                    if data.strip() == '[DONE]':
                        break
                    chunk = json.loads(data)
                    if 'choices' in chunk and len(chunk['choices']) > 0:
                        delta = chunk['choices'][0].get('delta', {})
                        if 'content' in delta:
                            yield delta['content']


=== SỬ DỤNG THỰC TẾ ===

Khởi tạo client

client = HolySheepAPIClient( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

Benchmark performance

test_messages = [ {"role": "system", "content": "Bạn là trợ lý AI chuyên về TensorRT-LLM"}, {"role": "user", "content": "Giải thích ngắn gọn về inference optimization với TensorRT-LLM"} ] results = [] for i in range(10): result = client.chat_completion( messages=test_messages, model="deepseek-v3.2", # Chỉ $0.42/MTok - cực kỳ tiết kiệm temperature=0.7 ) if result['success']: results.append(result['latency_ms']) print(f"Request {i+1}: {result['latency_ms']}ms - Success") avg_latency = sum(results) / len(results) print(f"\n=== Performance Summary ===") print(f"Average Latency: {avg_latency:.2f}ms") print(f"Min Latency: {min(results):.2f}ms") print(f"Max Latency: {max(results):.2f}ms") print(f"Success Rate: {len(results)/10*100}%")

Tối Ưu Hóa TensorRT-LLM cho Production

1. Quantitative Optimization (INT8/FP8)

# Build engine với INT8 quantization
python3 /TensorRT-LLM/llama/build.py \
    --model_dir /models/llama-2-7b \
    --dtype fp16 \
    --tp_size 1 \
    --quant_mode int8_weight_only \
    --output_dir /models/llama-2-7b/trt_engine_int8

Hoặc với FP8 quantization (H100 only)

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype fp8 \ --tp_size 1 \ --quant_mode fp8 \ --output_dir /models/llama-2-7b/trt_engine_fp8

Benchmark script để so sánh performance

import subprocess import time def benchmark_engine(engine_path: str, num_runs: int = 100): """Benchmark TensorRT-LLM engine performance""" cmd = [ "python3", "/TensorRT-LLM/examples/run.py", "--engine_dir", engine_path, "--max_output_length", "512", "--num_runs", str(num_runs) ] start = time.time() result = subprocess.run(cmd, capture_output=True, text=True) elapsed = time.time() - start # Parse output để lấy metrics print(result.stdout) return { 'total_time': elapsed, 'avg_time_per_run': elapsed / num_runs, 'throughput': num_runs / elapsed }

So sánh các engine

print("=== FP16 Engine ===") fp16_stats = benchmark_engine("/models/llama-2-7b/trt_engine") print("\n=== INT8 Engine ===") int8_stats = benchmark_engine("/models/llama-2-7b/trt_engine_int8") print("\n=== FP8 Engine ===") fp8_stats = benchmark_engine("/models/llama-2-7b/trt_engine_fp8")

Tính toán speedup

print("\n=== Speedup Summary ===") print(f"INT8 vs FP16: {fp16_stats['avg_time_per_run']/int8_stats['avg_time_per_run']:.2f}x faster") print(f"FP8 vs FP16: {fp16_stats['avg_time_per_run']/fp8_stats['avg_time_per_run']:.2f}x faster")

2. Batching Strategy

# Inference với dynamic batching
import tensorrt_llm
from tensorrt_llm import TensorRT-LLMEngine, BatchManager

def create_optimized_engine():
    """Tạo engine với tối ưu batching"""
    
    # Cấu hình batching
    batch_config = {
        'max_batch_size': 64,
        'max_beam_width': 1,
        'max_sequence_length': 4096,
        'enable_dynamic_batch': True,
        'dynamic_batch_matrices': [1, 2, 4, 8],  # Batch sizes to try
        'schedule_config': {
            'enable_chunked_prefill': True,
            'prefill_chunk_size': 512,
            'enable_streaming': True
        }
    }
    
    # Build engine
    from tensorrt_llm.builder import build_engine
    
    engine = build_engine(
        model_dir='/models/llama-2-7b',
        dtype='fp16',
        tp_size=1,
        batch_config=batch_config,
        quant_mode='int8_weight_only'
    )
    
    return engine

Streaming inference với batching

def batch_inference(requests: list): """ Xử lý nhiều requests cùng lúc với batching Args: requests: List of (input_text, max_tokens) tuples Returns: List of generated responses """ engine = create_optimized_engine() with BatchManager(engine, max_batch_size=64) as batch_mgr: # Submit requests futures = [] for text, max_tok in requests: future = batch_mgr.add_request( input_text=text, max_new_tokens=max_tok, temperature=0.7 ) futures.append(future) # Collect results results = [f.result() for f in futures] return results

Test batch processing

test_batch = [ ("Viết code Python để sort một array", 256), ("Giải thích về machine learning", 512), ("Viết SQL query để join 2 bảng", 256), ("Cách deploy Docker container", 512), ] results = batch_inference(test_batch) for i, (req, res) in enumerate(zip(test_batch, results)): print(f"Request {i+1}: {req[0][:30]}...") print(f"Response: {res['text'][:100]}...") print(f"Latency: {res['latency_ms']}ms\n")

Bảng So Sánh Chi Phí và Hiệu Suất

ProviderGiá/MTokLatencyĐặc điểm
GPT-4.1$8.00~800msHigh quality, expensive
Claude Sonnet 4.5$15.00~1200msBest for long context
Gemini 2.5 Flash$2.50~300msFast, good value
DeepSeek V3.2$0.42~150msBest cost-efficiency
TensorRT-LLM (A100)~$0.05*~50msSelf-hosted, setup required

* Chi phí ước tính cho GPU A100 rental (~$2.5/hr), với throughput ~50 req/s cho model 7B

Lỗi Thường Gặp và Cách Khắc Phục

1. Lỗi "CUDA out of memory" khi Build Engine

# Vấn đề: GPU memory không đủ khi build engine với FP16

Nguyên nhân: Model quá lớn hoặc TP (tensor parallelism) cao

Giải pháp 1: Giảm batch size khi build

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype fp16 \ --tp_size 1 \ --max_batch_size 1 \ --output_dir /models/llama-2-7b/trt_engine

Giải pháp 2: Enable model LoRA để giảm memory

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype fp16 \ --quant_mode int8_weight_only \ --use_lora False \ --output_dir /models/llama-2-7b/trt_engine_int8

Giải pháp 3: Sử dụng quantization trước khi build

Chạy quantization script

python3 /TensorRT-LLM/tools/quantize.py \ --model_dir /models/llama-2-7b \ --quant_mode int8 \ --output_dir /models/llama-2-7b-quantized

Giải pháp 4: Tăng shared memory

docker run --gpus all --rm -it \ --shm-size=64g \ # Tăng từ 32g lên 64g -v /path/to/models:/models \ tensorrt-llm:latest bash

2. Lỗi "TensorRT engine build failed" với FP8

# Vấn đề: FP8 chỉ hỗ trợ trên H100/H200, không phải A100

Giải phụ: Kiểm tra GPU type

nvidia-smi --query-gpu=name,compute_cap --format=csv

Giải pháp 1: Fallback xuống INT8 cho A100

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype fp16 \ --quant_mode int8_weight_only \ --output_dir /models/llama-2-7b/trt_engine_int8

Giải pháp 2: Sử dụng FP16 với INT8 KV cache

python3 /TensorRT-LLM/llama/build.py \ --model_dir /models/llama-2-7b \ --dtype fp16 \ --quant_mode int8_weight_only \ --kv_cache_dtype int8 \ --output_dir /models/llama-2-7b/trt_engine_int8_kv

Giải pháp 3: Kiểm tra CUDA version compatibility

nvcc --version

Đảm bảo CUDA >= 12.1 cho FP8 support

Verify FP8 availability

python3 -c "import tensorrt; print(tensorrt.__version__)"

TensorRT >= 9.0 required for FP8

3. Lỗi Streaming Response Bị Gián Đoạn

# Vấn đề: Streaming trả về chunks không đầy đủ hoặc bị cắt

Nguyên nhân thường