Các bản Port C++ của LocalAI Đánh Bại Stack Python — và Lý Do Không Như Bạn Nghĩ
Các engine C/C++ viết tay của LocalAI tạo ra một binary 66 MiB ngang bằng virtualenv 9.1 GiB của vLLM, và chiến thắng tốc độ thực sự đến từ việc cache công việc phía host, không phải phép màu kernel.

Mặc định của LocalAI là bọc engine của người khác — llama.cpp, vLLM, whisper.cpp, và phần còn lại được duy trì bởi những người hiểu các mô hình đó hơn. Nhưng mười tám backend của nó là các bản port C/C++ viết tay, và mỗi cái tồn tại vì bọc upstream sẽ có nghĩa là phát hành thứ gì đó không dùng được: một bản cài Python nhiều gigabyte, một stack chỉ dành cho CUDA, hoặc một mô hình không có bản triển khai C++ nào cả.
Con số nổi bật là vllm.cpp, một bản port C++20 của kiến trúc phục vụ V1 của vLLM. Cài vLLM tạo ra một virtualenv 9.1 GiB; vllm.cpp là một binary 66 MiB. Nó triển khai paged KV cache, continuous batching, prefix caching, scheduler, và sampler — không Python, không PyTorch, không ggml tại suy luận. Trên NVIDIA GB10 với Qwen3.6-27B, nó ngang bằng cấu hình graphed production của vLLM ở độ đồng thời 1–32, với single-stream nhanh hơn 4.5% và phần còn lại trong khoảng nhiễu. Bộ nhớ host đỉnh giảm từ 28.18 GiB xuống 24.88 GiB.
Đôi khi bản port đơn giản là nhanh hơn. depth-anything.cpp, một bản port của Depth Anything 3, chạy nhanh hơn 1.31x so với PyTorch trên CPU với 27% bộ nhớ — không phải vì kernel matmul tốt hơn, mà vì hai positional embedding đang được tính lại trong mỗi forward pass với vòng lặp vô hướng đơn luồng. Cache chúng loại bỏ ~95 ms chi phí phía host mỗi forward. Đó là hình dạng chung: GEMM là hòa, sự khác biệt nằm ở công việc phía host mà một tham chiếu Python không bao giờ tối ưu hóa.
Parity là cổng, tốc độ là bước tiếp theo. face-detect.cpp và voice-detect.cpp phát hành ngay cả khi không có chiến thắng tốc độ CPU, vì đối với pipeline sinh trắc học, một embedding khác ở chữ số thập phân thứ tư thay đổi quyết định xác minh. face-detect.cpp khớp insightface đến cosine 1.000000; voice-detect.cpp dùng ~62 MB so với ~334 MB cho đường Python.
Phương pháp nhất quán: chuyển đổi trọng số thành một GGUF trước, port graph thứ hai với cổng parity từng thành phần, tối ưu hóa thứ ba với profiler, và phơi bày một C ABI phẳng cuối cùng. Cái giá là bảo trì — mỗi engine có CI, benchmark, và converter riêng — và kernel GPU là điểm yếu, với kernel ggml chung tụt hậu so với cuDNN trên các mô hình nặng về conv.
Một bản port nhanh và hơi sai là vô giá trị, và không có cổng từng thành phần bạn sẽ phát hiện ra nó sai nhiều tháng sau.