Giới thiệu
Khi các mô hình ngôn ngữ lớn (LLM) ngày càng khổng lồ với hàng trăm tỷ tham số, việc chạy inference trên một GPU đơn lẻ gần như bất khả thi. Bài viết này sẽ đi sâu vào hai chiến lược phân tán phổ biến nhất: Tensor Parallel và Pipeline Parallel, giúp bạn chọn đúng giải pháp cho hạ tầng của mình.Tôi đã thử nghiệm cả hai phương pháp trên cụm GPU A100 8x80GB trong 6 tháng qua, và kết quả thực tế có phần khác biệt so với lý thuyết thường được trình bày trên paper.
Tensor Parallel (TP) là gì?
Tensor Parallel chia tensor (ma trận trọng số) thành nhiều phần theo chiều ngang hoặc dọc, phân phối lên các GPU khác nhau. Mỗi GPU tính toán một phần của phép nhân ma trận, sau đó đồng bộ qua NCCL AllReduce.
Ưu điểm
- Giảm đáng kể memory footprint trên mỗi GPU
- Thông lượng cao khi batch size lớn
- Phù hợp với mô hình có transformer stack sâu
Nhược điểm
- Overhead communication cao do cần AllReduce sau mỗi layer
- Yêu cầu NVLink/NVSwitch để đạt hiệu suất
- Không scale tốt khi số GPU > 8 do bandwidth saturation
Pipeline Parallel (PP) là gì?
Pipeline Parallel chia mô hình theo chiều dọc (layer), mỗi GPU chịu trách nhiệm một phần của stack. Các micro-batch được xử lý tuần tự qua pipeline, tạo ra hiệu ứng lắp đầy pipeline.
Ưu điểm
- Communication overhead thấp hơn (chỉ forward pass qua giai đoạn)
- Scale tốt với số lượng GPU lớn (16-64 GPU)
- Tương thích với hạ tầng network thông thường
Nhược điểm
- Latency per token cao do bubble trong pipeline
- Cần warm-up period để lấp đầy pipeline
- Không hiệu quả với batch size nhỏ
So Sánh Chi Tiết: Tensor Parallel vs Pipeline Parallel
| Tiêu chí | Tensor Parallel | Pipeline Parallel |
|---|---|---|
| Độ trễ (latency) | ~15-25ms/token (8xA100) | ~35-60ms/token (16xA100) |
| Thông lượng (throughput) | Tuyệt vời khi BS ≥ 32 | Tuyệt vời khi BS ≥ 64 |
| Memory efficiency | Tối ưu (model sharding) | Tốt (layer partitioning) |
| Communication overhead | Cao (AllReduce mỗi layer) | Thấp (chỉ inter-stage) |
| Yêu cầu hạ tầng | NVLink bắt buộc | Ethernet 100Gbps+ |
| GPU count scaling | Tối ưu: 2-8 GPU | Tối ưu: 8-64 GPU |
| Startup/warmup | Nhanh | Chậm (pipeline bubble) |
Bảng So Sánh Chi Phí Và Hiệu Suất
| Phương pháp | GPU cần thiết | Chi phí/giờ (A100) | Tokens/giây | Cost/1M tokens |
|---|---|---|---|---|
| TP-8 (8xA100) | 8 GPU | ~$32/giờ | ~180 tokens/s | ~$0.18 |
| PP-16 (16xA100) | 16 GPU | ~$64/giờ | ~320 tokens/s | ~$0.20 |
| TP4-PP4 (Hybrid) | 16 GPU | ~$64/giờ | ~450 tokens/s | ~$0.14 |
| HolySheep Cloud (DeepSeek V3.2) | 0 (managed) | ~$0.00042/1M tokens | ~500+ tokens/s | $0.00042 |
Triển Khai Thực Tế: Code Examples
Tensor Parallel với vLLM
# Tensor Parallel Inference với vLLM
Yêu cầu: CUDA, vLLM, NCCL
from vllm import LLM, SamplingParams
Khởi tạo vLLM với Tensor Parallel = 8 GPU
llm = LLM(
model="meta-llama/Llama-3-70b-instruct",
tensor_parallel_size=8, # 8 GPU cho model 70B
gpu_memory_utilization=0.90,
max_model_len=8192,
trust_remote_code=True
)
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.95,
max_tokens=2048
)
Inference
prompts = [
"Giải thích cơ chế attention trong Transformer:",
"So sánh Tensor Parallel và Pipeline Parallel:",
]
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Generated: {output.outputs[0].text}")