- bitnet.cpp của Microsoft là khung suy luận chính thức cho mô hình ngôn ngữ lớn (LLM) 1 bit, hỗ trợ suy luận nhanh và không mất mát trên CPU và GPU
- Đạt tăng tốc 1.37~5.07 lần và giảm 55.4~70% điện năng tiêu thụ trên CPU ARM, cùng tăng tốc 2.37~6.17 lần và giảm 71.9~82.2% điện năng tiêu thụ trên CPU x86
- Bổ sung triển khai kernel song song và lượng tử hóa embedding, mang lại cải thiện hiệu năng thêm 1.15~2.1 lần so với trước đây
- Có thể chạy mô hình BitNet b1.58 ở tốc độ 5~7 token/giây trên một CPU đơn lẻ, mở rộng khả năng vận hành mô hình siêu lớn trong môi trường cục bộ
- Được phát triển dựa trên llama.cpp và T-MAC, góp phần mở rộng hệ sinh thái mã nguồn mở nhằm tối ưu hiệu quả suy luận LLM low-bit
Tổng quan về bitnet.cpp
- bitnet.cpp là khung suy luận chính thức dành cho LLM 1 bit (ví dụ: BitNet b1.58), cung cấp kernel tối ưu hóa cho CPU và GPU
- Hỗ trợ NPU sẽ được bổ sung trong tương lai
- Bản phát hành đầu tiên hỗ trợ suy luận trên CPU và đã chứng minh cải thiện tốc độ lẫn hiệu quả năng lượng trên cả kiến trúc ARM và x86
- CPU ARM: tăng tốc 1.37~5.07 lần, giảm 55.4~70% điện năng tiêu thụ
- CPU x86: tăng tốc 2.37~6.17 lần, giảm 71.9~82.2% điện năng tiêu thụ
- Có thể chạy mô hình BitNet b1.58 100B tham số ở tốc độ 5~7 token/giây trên một CPU đơn lẻ
Tối ưu hóa mới nhất
- Đã bổ sung triển khai kernel song song, cùng các tính năng cấu hình tiling và lượng tử hóa embedding, đạt tăng tốc bổ sung 1.15~2.1 lần so với trước đây
- Xác nhận cải thiện hiệu năng trên nhiều nền tảng phần cứng và workload khác nhau
- Nội dung kỹ thuật chi tiết được cung cấp trong tài liệu
optimization guide
Demo và mô hình chính thức
- Cung cấp demo chạy mô hình BitNet b1.58 3B trên Apple M2
- Mô hình chính thức BitNet-b1.58-2B-4T đã được công bố trên Hugging Face và được hỗ trợ trên CPU x86 và ARM
- Các mô hình được hỗ trợ gồm bitnet_b1_58-large(0.7B), bitnet_b1_58-3B(3.3B), Llama3-8B-1.58, Falcon3, và dòng Falcon-E
Cài đặt và build
- Yêu cầu: Python 3.9 trở lên, CMake 3.22 trở lên, Clang 18 trở lên
- Người dùng Windows cần cài đặt Visual Studio 2022
- Người dùng Debian/Ubuntu được cung cấp script cài đặt tự động
- Khuyến nghị sử dụng môi trường Conda, và có thể thiết lập môi trường mô hình bằng
setup_env.py
- Sau khi tải mô hình từ Hugging Face, có thể chạy bằng đường dẫn cục bộ
Cách dùng và benchmark
- Dùng
run_inference.py để chạy suy luận mô hình đã lượng tử hóa
- Các tham số chính: đường dẫn mô hình (-m), prompt (-p), số luồng (-t), kích thước ngữ cảnh (-c), nhiệt độ (-temp)
- Có thể đo hiệu năng bằng script
e2e_benchmark.py bằng cách chỉ định số token, độ dài prompt, số luồng
- Nếu không có mô hình công khai, có thể dùng
generate-dummy-bitnet-model.py để tạo mô hình giả rồi benchmark
Chuyển đổi mô hình và FAQ
- Cung cấp script để chuyển đổi checkpoint
.safetensors sang định dạng gguf
- Trong FAQ có hướng dẫn cách xử lý lỗi build llama.cpp (liên quan đến std::chrono) và thiết lập môi trường clang trên Windows
- Cần khởi tạo môi trường từ Visual Studio Developer Command Prompt hoặc PowerShell
1 bình luận
Ý kiến từ Hacker News
Microsoft thực tế đang dùng 2 bit chứ không phải 1.58 bit
Trong trường hợp này có thể biểu diễn bốn giá trị -1, 0, 1, 2
Xét việc các khớp thần kinh ức chế chiếm 20~30%, tôi nghĩ cấu trúc này khá phù hợp với cấu trúc của não sinh học
Tôi thường tự hỏi một “LLM tối thiểu đủ dùng” sẽ trông như thế nào
Tức là một mô hình chỉ có lượng thông tin tối thiểu, còn lại có thể bù bằng cách tìm trên Google mà vẫn đưa ra câu trả lời đủ hợp lý
Nếu những nơi như Encyclopedia Britannica bán dữ liệu cho LLM và cung cấp dịch vụ xác minh kết quả, có lẽ sẽ tạo ra khác biệt lớn
Wikipedia cũng tốt, nhưng đáng tiếc là có nhiều sai sót và thiên kiến của con người
Các LLM nhỏ đang phát triển theo hướng đó, và dù thiếu kiến thức phổ thông, khả năng dùng công cụ (ví dụ: tìm Google) đang ngày càng tốt hơn
Tuy nhiên, việc phân biệt rõ cái gì mình biết và không biết vẫn là một vấn đề khó
Giống như một kỹ sư không biết về một thiết bị cụ thể: có khả năng giải quyết vấn đề nhưng thiếu kiến thức chi tiết
Tôi không chắc mô hình như vậy có thể giải quyết đơn thuần bằng tìm Google hay tra wiki hay không, nhưng kiến trúc edge LLM có lẽ sẽ trở thành tiêu chuẩn trong tương lai
Thông tin càng có trong dữ liệu huấn luyện thì việc tìm lại và diễn giải càng dễ
Vì vậy, huấn luyện theo kiểu dựa vào bộ nhớ ngoài (tìm kiếm v.v.) thay vì ghi nhớ nội bộ có thể sẽ thực dụng hơn
Cá nhân tôi lại nghĩ ngược lại
Theo bài báo gốc (pdf), cần khoảng 4~5 lần số tham số so với mô hình fp16
Có thể tự build thử, nhưng vì phải huấn luyện từ đầu nên lựa chọn khá hạn chế
Dù vậy, dự kiến tốc độ suy luận sẽ nhanh hơn các mô hình lượng tử hóa 4 bit·8 bit mới nhất
Điểm cốt lõi thật sự là hiệu quả tiết kiệm năng lượng
Người ta nói rằng có thể giảm 70~82% khi suy luận trên CPU
Nếu mô hình 1 bit trở nên đủ tốt, sẽ có thể chạy LLM trên phần cứng phổ thông mà không cần GPU, và điều đó sẽ thay đổi cục diện khả năng tiếp cận
Dù bitnet.cpp được gọi là framework suy luận chính thức cho 1-bit LLM (BitNet b1.58 v.v.),
vẫn có sự nhầm lẫn giữa “1 bit hay 1 trit”
Trộn lẫn hai khái niệm này gây ra nhầm lẫn
Thật vui khi thấy dự án này vẫn tiếp tục được phát triển
Năm ngoái tôi đã đọc bài viết liên quan và thấy có tiềm năng, nhưng tiếc là không có mô hình mới nào xuất hiện
Điều thực sự thú vị là hướng huấn luyện trực tiếp mô hình nhị phân mà không cần phép toán số thực dấu chấm động
Có bài báo liên quan tại NeurIPS 2024
Việc nói “có thể chạy 100B BitNet” không có nghĩa là mô hình đó tồn tại, mà là framework suy luận cho nó là khả thi
Dù tìm “1-bit 100b model” cũng không có mô hình nào có thể tải về
Chất lượng đầu ra của mô hình gần với kiểu lẩm bẩm ở mức GPT-2, và lặp lại nguyên cả đoạn văn
Thậm chí nó còn liên tục tái sử dụng những trích dẫn giả như
(Jenkins, 2010)Tiêu đề gây hiểu nhầm
Thực tế đây không phải mô hình 100B đã được huấn luyện, mà là framework suy luận có thể xử lý nó
Tôi đang chạy mô hình lượng tử hóa 70B trên M2 Max 96GB bằng llama.cpp + LiteLLM, và băng thông bộ nhớ là nút thắt cổ chai
Cách tiếp cận 1.58 bit có cấu trúc biến nhân ma trận thành phép cộng, nên trên CPU nó có mô hình tính toán khác về bản chất
Nếu có thể chạy mô hình cỡ 100B ở tốc độ 5~7 token mỗi giây trên một lõi CPU duy nhất, đó sẽ là bước ngoặt của suy luận on-device
Framework đã sẵn sàng, giờ chỉ còn cần ai đó thực sự huấn luyện mô hình
Thành quả thực tế khá nghèo nàn so với mức độ quảng bá
Dù huấn luyện vẫn cần GPU, phần cứng dành cho suy luận có thể trở nên đơn giản hơn nhiều
Tôi từng dùng mô hình xuất ra ở mức 7 token/giây, và có cảm giác bực bội như đang đi sau một người đi chậm
Trong môi trường local, nên nhắm ít nhất từ 10 token/giây trở lên
Lệnh FMA (Fused Multiply-Add) trên CPU hiện đại có throughput gần như tương đương với phép cộng đơn giản
Tôi tò mò khi nào các PC tích hợp NPU mới thật sự bắt đầu cho ra kết quả rõ rệt
AMD đang có kết quả tốt với các kernel suy luận lai NPU/iGPU
Nếu các mô hình lớn như thế này chạy được trên NPU, hiệu quả điện năng sẽ tốt hơn CPU rất nhiều
Từ đó tôi thành fan của NPU. Tất nhiên nó không phải cỡ RTX 5090, nhưng hiệu quả hơn CPU rất nhiều
Hệ sinh thái phần mềm còn chưa ổn định, nhưng nó hoạt động với mức sử dụng CPU/GPU gần như bằng 0
Tôi vẫn nghĩ chúng được thiết kế chủ yếu cho mức điện năng thấp