- Một số mô hình AI như DeepSeek-V3 rẻ và nhanh khi được cung cấp ở quy mô lớn, nhưng lại chậm và tốn kém khi chạy cục bộ
- Lý do nằm ở sự đánh đổi căn bản giữa throughput (thông lượng) và latency (độ trễ), vốn liên quan đến hiệu quả khai thác GPU
- Khi tăng kích thước batch, GPU hoạt động hiệu quả hơn, nhưng người dùng phải chờ đến khi đủ token được gom lại nên xảy ra hiện tượng độ trễ tăng
- Các mô hình có kiến trúc Mixture-of-Experts và pipeline sâu cần batch lớn và độ trễ cao
- Trong môi trường một người dùng cục bộ, rất khó tạo được batch đủ lớn, dẫn tới hiệu năng giảm và chi phí tăng
- OpenAI, Anthropic... đạt được phản hồi nhanh nhờ tối ưu hóa chính kiến trúc, chiến lược batching tinh vi hoặc đơn giản là cấp phát quá nhiều GPU
Suy luận theo batch và hiệu quả GPU
- GPU là phần cứng được tối ưu cho nhân ma trận quy mô lớn (GEMM)
- Khi gom token của nhiều người dùng để chạy theo batch thành một ma trận lớn, overhead khứ hồi thấp và hiệu quả bộ nhớ tốt giúp thông lượng tăng mạnh
- Máy chủ suy luận sẽ xếp token từ nhiều yêu cầu vào hàng đợi, chọn batch có kích thước phù hợp và thực hiện các phép GEMM lớn
- Trong quá trình này, máy chủ phải chọn sự đánh đổi giữa kích thước batch (thông lượng tăng) và thời gian chờ (độ trễ tăng)
Vì sao một số mô hình được tối ưu cho batch lớn
Mixture of Experts (MoE) và batch
- Kiến trúc MoE (ước đoán ở DeepSeek-V3, GPT-4) là nguyên nhân chính khiến hiệu quả GPU thấp
- Hàng trăm khối “expert” mỗi khối đều yêu cầu phép nhân ma trận riêng, nên ở batch nhỏ, mỗi expert có quá ít việc để làm và hiệu quả giảm mạnh
- Chỉ khi có nhiều yêu cầu đồng thời mới có thể tận dụng đầy đủ mọi expert, vì vậy ở cấp độ dịch vụ, batch lớn là bắt buộc
- Với thời gian chờ ngắn (cửa sổ 5ms), các expert thường xuyên nhàn rỗi; với thời gian chờ dài (cửa sổ 200ms), có thể tối đa hóa hiệu suất cao
Vấn đề batch ở mô hình pipeline sâu
- Các transformer lớn với hàng trăm tầng được chia theo layer trên nhiều GPU để chạy theo kiểu pipeline
- Nếu số token trong một batch ít hơn số bước của pipeline, sẽ xuất hiện hiện tượng pipeline bubble, làm giảm thông lượng
- Để tránh điều này, batch lớn (tức chờ lâu hơn) là điều bắt buộc, và vì vậy thời gian phản hồi của mô hình tăng lên
Vì sao không thể lúc nào cũng lấp đầy hàng đợi
- Về lý thuyết, nếu lúc nào cũng có lượng truy cập đồng thời lớn để lấp đầy hàng đợi thì có vẻ có thể tránh bubble
- Nhưng trên thực tế, ở bước Attention của transformer, kích thước ma trận (độ dài) phải giống nhau mới có thể batch hóa, nên rất khó để một hàng đợi đơn hoạt động hoàn hảo
- Ngoài ra, nếu tách riêng các bước FFN và attention thì overhead bộ nhớ tăng mạnh và nảy sinh vấn đề di chuyển dữ liệu kém hiệu quả
Tóm tắt và kết luận
- Xử lý batch lớn là điều thiết yếu để giảm chi phí GPU và tăng thông lượng, nhưng người dùng sẽ phải chờ lâu hơn
- Các mô hình có Mixture-of-Experts và kiến trúc pipeline lớn về bản chất được tối ưu cho môi trường batch hiệu quả cao dựa trên chờ đợi
- Trong môi trường ít lưu lượng như chạy cục bộ, không thể cấu hình batch lớn tối ưu nên hiệu quả GPU giảm mạnh và chi phí vận hành tăng
- OpenAI, Anthropic... có thể cho thấy độ phản hồi nhanh, và lý do có thể là:
- (1) Có thể họ dùng kiến trúc hiệu quả hơn thay vì MoE
- (2) Áp dụng tối ưu hóa batch/pipeline và các kỹ thuật suy luận tinh vi
- (3) Có thể họ cấp phát nhiều GPU hơn mức cần thiết để “mua” tốc độ
Bổ sung: khác biệt giữa batch prefill và batch phần thân
- Transformer có thể chạy theo batch cho prefill của một prompt người dùng (đầu vào dài), nhờ đó suy luận ban đầu diễn ra nhanh hơn
- Tuy nhiên, batch được thảo luận trong bài là sự đánh đổi thông lượng-độ trễ xảy ra ở giai đoạn sinh token chính thức của nhiều yêu cầu người dùng
- Batch prefill không liên quan trực tiếp đến kiểu batch đồng thời quy mô lớn được nhắc trong bài
Ghi chú tham khảo
- Các hệ thống suy luận thực tế cũng sử dụng continuous batching để chạy ngay khi batch đã đủ
- Tuy nhiên, cấu trúc đánh đổi căn bản giữa throughput-latency vẫn được áp dụng như nhau
1 bình luận
Ý kiến trên Hacker News