
LLM Inference Optimization: vLLM, TGI, llama.cpp, TensorRT-LLM so sánh chi tiết
Sau khi huấn luyện xong LLM, phần tốn kém nhất là inference — chạy mô hình để sinh văn bản. Với các mô hình cỡ 7B-70B, inference trên 1-8 GPU đòi hỏi tối ưu từ kernel scheduling, quantization, đến batching. Bộ công cụ phổ biến hiện nay: vLLM, Hugging Face TGI, llama.cpp, TensorRT-LLM. Mỗi cái có trade-off riêng về latency, throughput, hỗ trợ hardware, và đáp ứng thời gian thực.
Tổng quan 4 công cụ inference
- vLLM: PagedAttention kernel cho GPU, throughput cao, Python-first, phù hợp serving API.
- TGI (Text Generation Inference): Hugging Face, đa nền tảng (GPU/CPU), tích hợp sẵn quantization + speculative decoding.
- llama.cpp: C++ portable, CPU/GPU unified, GGUF format, inference CLI/API nhẹ, phổ biến cho edge.
- TensorRT-LLM: NVIDIA official, kernel tự động tune cho Hopper/Ada/Ampere, FP8/INT4/INT8, phục vụ production latency-critical.
Phương pháp Quantization so sánh: GPTQ, AWQ, GGUF, FP8
Quantization là kỹ thuật giảm độ chính xác trọng số từ FP16/BF16 xuống INT8/INT4 để giảm memory bandwidth và tăng throughput. Mỗi công cụ có cách tiếp cận riêng:
- GPTQ (vLLM, TGI): Post-training quantization, calibrate trên dataset nhỏ, bảo toàn accuracy tốt cho 4-bit. Yêu cầu GPU để calibrate.
- AWQ (vLLM, TGI, TensorRT-LLM): Activation-aware weight quantization, không cần calibration data, nhanh hơn GPTQ, accuracy tương đương.
- GGUF (llama.cpp): Format file gọn, hỗ trợ nhiều scheme (Q2_K, Q3_K_M, Q4_K_M, Q5_K_M, Q6_K, Q8_0), quantize trên CPU, portable mọi nền tảng.
- FP8 (TensorRT-LLM, vLLM 0.6+): Native trên Hopper H100, 2x memory reduction vs FP16, accuracy gần như lossless, throughput tăng 1.5-2x.
Kết quả thực tế trên LLaMA 2 7B: FP8 (TensorRT-LLM) đạt throughput cao nhất, GGUF Q4_K_M (llama.cpp) cân bằng tốt accuracy/size cho edge, AWQ 4-bit (vLLM) dễ deploy nhất cho API serving.

So sánh hiệu năng: throughput và latency
| Tiêu chí | vLLM | TGI | llama.cpp | TensorRT-LLM |
|---|---|---|---|---|
| Ngôn ngữ chính | Python (CUDA) | Python + Rust | C++/C (portable) | C++/Python (CUDA) |
| Hardware tối ưu | NVIDIA GPU (H100/A100/L40) | NVIDIA + AMD ROCm + CPU | CPU + NVIDIA + AMD + Apple Silicon | NVIDIA GPU (Hopper/Ada/Ampere) |
| Memory management | PagedAttention (page-level swap GPU→CPU) | Continuous batching + Prefix caching | Graph + prompt caching, mmap | In-flight batching + KV cache chồng xếp |
| Quantization | FP16, FP8, INT8, INT4 (awq/gptq) | GPTQ, AWQ, FP8, bitsandbytes | GGUF Q4_K_M, Q5_K_M, Q8_0, Q2_K | FP8 (Hopper), INT4/INT8 (smoothquant), FP16/BF16 |
| Speculative decoding | Yes (draft model) | Yes (medusa, eagel) | Yes (draft model) | Yes (draft model + inflight batching) |
| Throughput (7B Q4 req/s) | Cao nhất (GPU batching) | Cao (không bằng vLLM) | Trung bình (CPU), cao (GPU) | Cao nhất NVIDIA (kernel fuse) |
| Latency (TTFT) | Thấp (continuous batching) | Trung bình | Thấp CPU, trung bình GPU | Thấp nhất (kernel tuning) |
| Ease of use | pip install vllm, OpenAI-compatible API | docker + hf endpoints | CLI đơn giản, quantize tự động | Build phức tạp, docker có sẵn |
| Use case phù hợp | Serving API, multi-tenant | Enterprise HF, CPU inference | Edge, desktop, local-first | Production latency-critical |

Khi nào dùng công cụ nào?
vLLM là lựa chọn mặc định cho API serving trên NVIDIA GPU nhiều card. PagedAttention giảm fragmentation, throughput cao gấp 2-4x so với Hugging Face Transformers vanilla. Tuy nhiên, support AMD ROCm còn non trẻ, quantization custom khó tune hơn TGI.
Điểm mạnh ít nói đến: vLLM 0.6+ hỗ trợ multi-LoRA serving, cho phép chạy nhiều adapter trên base model chung — tiết kiệm VRAM cho multi-tenant SaaS. Cũng có prefix caching tự động cho system prompt lặp lại.
TGI phù hợp doanh nghiệp dùng Hugging Face Hub — tự động pull model, quantize, deploy qua Docker. Hỗ trợ AMD ROCm tốt hơn vLLM. Nhược điểm: throughput thấp hơn vLLM khi batch lớn, memory không tối ưu bằng PagedAttention.
llama.cpp vua của local-first, desktop, edge. GGUF format đơn giản, quantize bằng `llama-quantize` hoặc `gguf-py`, chạy cả CPU lẫn GPU (Vulkan/CUDA/Metal). Tích hợp tốt với Ollama, LM Studio, Open WebUI. Nhược điểm: throughput GPU thấp hơn vLLM/TGI vì kernel không tối ưu batching song song.
TensorRT-LLM là công cụ NVIDIA cho production latency-critical — LLM Gateway, chatbot real-time, recommendation system. Kernel tự động tune (flash attention, paged KV, in-flight batching), FP8 trên H100 giảm memory 2x. Nhược điểm: build phức tạp, chỉ chạy NVIDIA GPU, bản build mới nhất thường cần container mới nhất.
Xu hướng: Speculative decoding, FP8, disaggregated serving
Cả 4 công cụ đều đẩy speculative decoding — dùng draft model nhỏ dự đoán token, verifier model chấp nhận hàng loạt → tăng tốc 2-3x không giảm chất lượng. FP8 trên H100/L4 đang trở thành default quantization cho throughput-maximizing. Tương lai là disaggregated serving: decode giai đoạn 1 trên 1 loạt GPU, prefill giai đoạn 2 trên loạt khác — tăng throughput 3-5x.
Một thách thức chưa được giải quyết là scheduling đa tenant: mỗi người dùng có prompt khác nhau, độ dài khác nhau, dễ gây head-of-line blocking nếu không có continuous batching và prefix caching thông minh.
Tóm lại: Chọn theo use case. Serving API multi-tenant → vLLM. Enterprise HF + AMD → TGI. Local-first/desktop/edge → llama.cpp. Production NVIDIA latency-critical → TensorRT-LLM. Benchmark với workload thực tế của bạn trước khi quyết định.
Nguồn: vLLM Paper (PagedAttention) | TGI Documentation | llama.cpp GitHub | TensorRT-LLM Docs | vLLM GitHub
