gemma.cpp là một quá trình triển khai thời gian chạy suy luận C++ thuần tuý nhẹ của mô hình Gemma.
Để biết thêm thông tin về Gemma, hãy xem thẻ mô hình. Trọng số mô hình, bao gồm cả các cấu phần phần mềm cụ thể của gemma.cpp, có trên Kaggle.
Dự án này dành cho ai?
Các công cụ suy luận LLM hiện đại là những hệ thống phức tạp, thường có các chức năng tuỳ chỉnh mở rộng ngoài thời gian chạy mạng nơron truyền thống. Điều này mang đến cơ hội nghiên cứu và đổi mới thông qua việc đồng thiết kế các thuật toán cấp cao và tính toán cấp thấp. Tuy nhiên, có một khoảng cách giữa thời gian chạy suy luận C++ hướng đến việc triển khai (không được thiết kế để thử nghiệm) và các khung nghiên cứu học máy tập trung vào Python (trừu tượng hoá tính toán cấp thấp thông qua quá trình biên dịch).
gemma.cpp cung cấp cách triển khai tối giản các mô hình Gemma 2B và 7B, tập trung vào tính đơn giản và trực tiếp thay vì tính tổng quát đầy đủ. Điều này được lấy cảm hứng từ các phương thức triển khai mô hình C++ tích hợp theo chiều dọc, chẳng hạn như ggml, llama.c và llama.rs.
gemma.cpp nhắm đến các trường hợp sử dụng thử nghiệm và nghiên cứu – cụ thể là khám phá không gian thiết kế của các thuật toán suy luận và suy luận CPU bằng cách sử dụng SIMD di động thông qua thư viện Google Highway. Mục đích của thư viện này là để dễ dàng nhúng vào các dự án khác với số lượng phần phụ thuộc tối thiểu và cũng dễ dàng sửa đổi bằng cách triển khai lõi LoC nhỏ khoảng 2K (cùng với LoC khoảng 4K của các tiện ích hỗ trợ).
Đối với các hoạt động triển khai cạnh mang tính sản xuất, bạn nên sử dụng các lộ trình triển khai tiêu chuẩn bằng các khung Python đã phát triển như JAX, Keras, PyTorch và Transformers (tất cả biến thể mô hình tại đây).
Chúng tôi hoan nghênh mọi đóng góp của cộng đồng, dù lớn hay nhỏ. Dự án này tuân thủ Nguyên tắc cộng đồng về nguồn mở của Google.
Bắt đầu nhanh
Để hoàn tất hướng dẫn nhanh này, bạn phải sao chép hoặc tải xuống gemma.cpp.
Yêu cầu hệ thống
Trước khi bắt đầu, bạn phải cài đặt:
- CMake
- Trình biên dịch C++ Clang
tar
để trích xuất tệp lưu trữ từ Kaggle.
Bước 1: Lấy trọng số mô hình và trình tạo mã từ Kaggle
Truy cập vào trang mô hình gemma trên Kaggle rồi chọn "Biến thể mô hình
Trình đơn thả xuống Gemma C++
. On this tab, the
Variation` bao gồm các tuỳ chọn sau. Lưu ý các tuỳ chọn trọng số bfloat16 có độ chân thực cao hơn, trong khi trọng số dấu phẩy động chuyển đổi 8 bit cho phép suy luận nhanh hơn.
Mô hình được điều chỉnh theo hướng dẫn 2B (it
) và mô hình được huấn luyện trước (pt
):
Tên mẫu thiết bị | Mô tả |
---|---|
2b-it |
Mô hình được điều chỉnh hướng dẫn thông số 2 tỷ, bfloat16 |
2b-it-sfp |
Mô hình được điều chỉnh theo hướng dẫn 2 tỷ tham số, dấu phẩy động chuyển đổi 8 bit |
2b-pt |
Mô hình được huấn luyện trước với 2 tỷ tham số, bfloat16 |
2b-pt-sfp |
Mô hình được huấn luyện trước với 2 tỷ tham số, dấu phẩy động chuyển đổi 8 bit |
Mô hình được điều chỉnh theo hướng dẫn 7B (it
) và được huấn luyện trước (pt
):
Tên mẫu thiết bị | Mô tả |
---|---|
7b-it |
Mô hình được điều chỉnh hướng dẫn 7 tỷ tham số, bfloat16 |
7b-it-sfp |
Mô hình được điều chỉnh theo hướng dẫn 7 tỷ tham số, dấu phẩy động chuyển đổi 8 bit |
7b-pt |
Mô hình được huấn luyện trước với 7 tỷ tham số, bfloat16 |
7b-pt-sfp |
Mô hình được huấn luyện trước với 7 tỷ tham số, dấu phẩy động chuyển đổi 8 bit |
LƯU Ý: Bạn nên bắt đầu với 2b-it-sfp
để thiết lập và chạy.
Bước 2: Trích xuất tệp
Sau khi điền vào biểu mẫu đồng ý, quá trình tải xuống sẽ tiếp tục truy xuất tệp lưu trữ tar archive.tar.gz
. Trích xuất tệp từ archive.tar.gz
(quá trình này có thể mất vài phút):
tar -xf archive.tar.gz
Thao tác này sẽ tạo một tệp chứa trọng số mô hình như 2b-it-sfp.sbs
và một tệp trình phân tích cú pháp (tokenizer.spm
). Bạn nên di chuyển các tệp này sang một vị trí thư mục thuận tiện (ví dụ: thư mục build/ trong kho lưu trữ này).
Bước 3: Tạo
Hệ thống xây dựng sử dụng CMake. Để tạo thời gian chạy suy luận Gemma, hãy tạo một thư mục bản dựng và tạo các tệp bản dựng bằng cmake
từ thư mục dự án cấp cao nhất:
(cd build && cmake ..)
Sau đó, hãy chạy make
để tạo tệp thực thi ./gemma
:
cd build
make -j [number of parallel threads to use] gemma
Ví dụ: make -j 8 gemma
. Nếu thành công, bạn sẽ có một gemma
có thể thực thi trong thư mục build/
.
Bước 4: Chạy
Giờ đây, bạn có thể chạy gemma
từ bên trong thư mục build/
.
gemma
có các đối số bắt buộc sau:
Đối số | Mô tả | Giá trị mẫu |
---|---|---|
--model |
Loại mô hình. | 2b-it , 2b-pt , 7b-it , 7b-pt , ... (xem ở trên) |
--compressed_weights |
Tệp trọng số đã nén. | 2b-it-sfp.sbs , ... (xem ở trên) |
--tokenizer |
Tên tệp của trình phân tích cú pháp. | tokenizer.spm |
gemma
được gọi như sau:
./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]
Lệnh gọi mẫu cho cấu hình sau:
- Tệp trọng số nén
2b-it-sfp.sbs
(mô hình được điều chỉnh theo hướng dẫn 2B, dấu phẩy động chuyển đổi 8 bit). - Tệp trình tạo mã thông báo
tokenizer.spm
.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it
Cách sử dụng
gemma
có nhiều chế độ sử dụng, được kiểm soát bằng cờ mức độ chi tiết.
Tất cả chế độ sử dụng đều có tính tương tác, kích hoạt quá trình tạo văn bản khi nhập dòng mới.
Độ chi tiết | Chế độ sử dụng | Thông tin chi tiết |
---|---|---|
--verbosity 0 |
Tối giản | Chỉ in kết quả tạo. Phù hợp để làm công cụ CLI. |
--verbosity 1 |
Mặc định | Giao diện người dùng tiêu chuẩn của thiết bị đầu cuối. |
--verbosity 2 |
Chi tiết | Hiển thị thêm thông tin gỡ lỗi và thông tin dành cho nhà phát triển. |
Ứng dụng dòng lệnh tương tác
Theo mặc định, mức độ chi tiết được đặt thành 1, hiển thị giao diện tương tác dựa trên dòng lệnh khi gemma
được gọi bằng các đối số bắt buộc:
$ ./gemma [...]
__ _ ___ _ __ ___ _ __ ___ __ _ ___ _ __ _ __
/ _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \
| (_| | __/ | | | | | | | | | | (_| || (__| |_) | |_) |
\__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/
__/ | | | | |
|___/ |_| |_|
tokenizer : tokenizer.spm
compressed_weights : 2b-it-sfp.sbs
model : 2b-it
weights : [no path specified]
max_tokens : 3072
max_generated_tokens : 2048
*Usage*
Enter an instruction and press enter (%Q quits).
*Examples*
- Write an email to grandma thanking her for the cookies.
- What are some historical attractions to visit around Massachusetts?
- Compute the nth fibonacci number in javascript.
- Write a standup comedy bit about WebGPU programming.
> What are some outdoorsy places to visit around Boston?
[ Reading prompt ] .....................
**Boston Harbor and Islands:**
* **Boston Harbor Islands National and State Park:** Explore pristine beaches, wildlife, and maritime history.
* **Charles River Esplanade:** Enjoy scenic views of the harbor and city skyline.
* **Boston Harbor Cruise Company:** Take a relaxing harbor cruise and admire the city from a different perspective.
* **Seaport Village:** Visit a charming waterfront area with shops, restaurants, and a seaport museum.
**Forest and Nature:**
* **Forest Park:** Hike through a scenic forest with diverse wildlife.
* **Quabbin Reservoir:** Enjoy boating, fishing, and hiking in a scenic setting.
* **Mount Forest:** Explore a mountain with breathtaking views of the city and surrounding landscape.
...
Sử dụng dưới dạng Công cụ dòng lệnh
Để sử dụng tệp thực thi gemma
làm công cụ dòng lệnh, bạn nên tạo một bí danh cho gemma.cpp với các đối số được chỉ định đầy đủ:
alias gemma2b="~/gemma.cpp/build/gemma -- --tokenizer
~/gemma.cpp/build/tokenizer.spm --compressed_weights
~/gemma.cpp/build/2b-it-sfp.sbs --model 2b-it --verbosity 0"
Thay thế các đường dẫn trên bằng đường dẫn của riêng bạn đến mô hình và đường dẫn trình phân tích cú pháp từ tệp tải xuống.
Dưới đây là ví dụ về cách nhắc gemma
bằng dữ liệu đầu vào bị cắt bớt (sử dụng bí danh gemma2b
như đã xác định ở trên):
cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code
do: " | gemma2b
LƯU Ý: Việc sử dụng CLI của gemma.cpp là thử nghiệm và cần tính đến các giới hạn về chiều dài ngữ cảnh.
Kết quả của lệnh trên sẽ có dạng như sau:
$ cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b
[ Reading prompt ] ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
The code defines two C++ structs, `ConfigGemma7B` and `ConfigGemma2B`, which are used for configuring a deep learning model.
**ConfigGemma7B**:
* `seq_len`: Stores the length of the sequence to be processed. It's set to 7168.
* `vocab_size`: Stores the size of the vocabulary, which is 256128.
* `n_layers`: Number of layers in the deep learning model. It's set to 28.
* `dim_model`: Dimension of the model's internal representation. It's set to 3072.
* `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 3072 / 2.
**ConfigGemma2B**:
* `seq_len`: Stores the length of the sequence to be processed. It's also set to 7168.
* `vocab_size`: Size of the vocabulary, which is 256128.
* `n_layers`: Number of layers in the deep learning model. It's set to 18.
* `dim_model`: Dimension of the model's internal representation. It's set to 2048.
* `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 2048 / 2.
These structs are used to configure a deep learning model with specific parameters for either Gemma7B or Gemma2B architecture.