Hướng dẫn về Gemma C++ (gemma.cpp)

gemma.cpp là một phương thức triển khai thời gian chạy dự đoá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ố của mô hình, bao gồm cả các cấu phần phần mềm cụ thể gemma.cpp có trên Kaggle.

Dự án này dành cho đối tượng nào?

Các công cụ suy luận LLM hiện đại là các hệ thống tinh vi, thường có khả năng riêng mở rộng ra ngoài môi trường thời gian chạy của mạng nơron truyền thống. Điều này mở ra cơ hội cho hoạt động 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à điện toán cấp thấp. Tuy nhiên, vẫn còn một khoảng trống giữa các môi trường thời gian chạy dự đoán C++ theo hướng triển khai (không được thiết kế cho mục đích thử nghiệm) và các khung nghiên cứu học máy tập trung vào Python, giúp loại bỏ việc 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 cho 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 khái quát đầy đủ. Việc này được lấy cảm hứng từ các hoạt động triển khai mô hình C++ tích hợp theo chiều dọc, chẳng hạn như ggml, llama.cllama.rs.

gemma.cpp nhắm mục tiêu đế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à dự đoán CPU bằng cách sử dụng SIMD di động thông qua thư viện Google xa lộ. API này phải đơn giản để nhúng vào các dự án khác có phần phụ thuộc ở mức tối thiểu và cũng có thể dễ dàng sửa đổi bằng cách triển khai lõi LoC nhỏ ~ 2.000 USD (cùng với khoảng 4K LoC của tiện ích hỗ trợ).

Đối với hoạt động triển khai cạnh theo hướng sản xuất, bạn nên sử dụng các lộ trình triển khai tiêu chuẩn sử dụng khung Python hoàn thiện như JAX, Keras, PyTorch và Transformers (tất cả cá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 nguồn mở của Google.

Bắt đầu nhanh

Để hoàn tất quá trình bắt đầu nhanh này, bạn phải sao chép hoặc tải gemma.cpp xuống.

Yêu cầu về hệ thống

Trước khi bắt đầu, bạn phải cài đặt:

Bước 1: Lấy trọng số mô hình và trình tạo mã thông báo từ Kaggle

Truy cập trang mô hình gemma trên Kaggle và chọn "Biến thể mô hình"

Trình đơn thả xuống Biến thể` . On this tab, thecủa Gemma C++ có các tuỳ chọn sau đây. Lưu ý rằng các tuỳ chọn trọng số bfloat16 có độ trung thực cao hơn, trong khi trọng số dấu phẩy động được chuyển đổi 8 bit cho phép suy luận nhanh hơn.

2B mô hình được điều chỉnh theo hướng dẫn (it) và mô hình huấn luyện trước (pt):

Tên mẫu thiết bị Nội dung mô tả
2b-it Mô hình điều chỉnh hướng dẫn 2 tỷ tham số, bfloat16
2b-it-sfp Mô hình điều chỉnh hướng dẫn 2 tỷ tham số, dấu phẩy động chuyển đổi 8 bit
2b-pt 2 tỷ tham số luyện sẵn mô hình, bfloat16
2b-pt-sfp 2 tỷ tham số được huấn luyện trước mô hình, dấu phẩy động chuyển đổi 8 bit

7B các mô hình được điều chỉnh theo hướng dẫn (it) và huấn luyện trước (pt):

Tên mẫu thiết bị Nội dung mô tả
7b-it 7 tỷ tham số được điều chỉnh mô hình, bfloat16
7b-it-sfp 7 tỷ tham số điều chỉnh mô hình, dấu phẩy động chuyển đổi 8 bit
7b-pt 7 tỷ tham số luyện sẵn mô hình, bfloat16
7b-pt-sfp 7 tỷ tham số được huấn luyện trước mô hình, 8-bit chuyển đổi dấu phẩy động

LƯU Ý: Bạn nên bắt đầu bằng 2b-it-sfp để thiết lập và chạy.

Bước 2: Giải nén tệp

Sau khi điền vào biểu mẫu lấy sự đồ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ố của mô hình như 2b-it-sfp.sbs và tệp của trình tạo mã thông báo (tokenizer.spm). Bạn nên di chuyển các tệp này đến vị trí thư mục thuận tiện (ví dụ: thư mục bản dựng/ 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 dự đoán gemma, hãy tạo thư mục bản dựng và tạo tệp bản dựng bằng cách sử dụng cmake trong thư mục dự án cấp cao nhất:

(cd build && cmake ..)

Sau đó, 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 việc này thành công thì giờ đây bạn sẽ có một tệp thực thi gemma 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ố Nội dung 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 tạo mã thông báo. tokenizer.spm

gemma được gọi dưới dạng:

./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 lệnh 2B, dấu phẩy động được chuyển đổi 8 bit).
  • Tệp 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ởi cờ độ chi tiết.

Tất cả các chế độ sử dụng đều có tính tương tác, kích hoạt việc 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 ra. Thích hợp để làm công cụ CLI.
--verbosity 1 Mặc định Giao diện người dùng của thiết bị đầu cuối tiêu chuẩn dành cho người dùng.
--verbosity 2 Chi tiết Hiển thị thông tin bổ sung về nhà phát triển và gỡ lỗi.

Ứng dụng đầu cuối tương tác

Theo mặc định, độ chi tiết được đặt thành 1, sẽ hiển thị giao diện tương tác dựa trên thiết bị đầu cuối 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 như một 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 đại diện 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 riêng của bạn đến đường dẫn của mô hình và trình tạo mã thông báo từ tệp tải xuống.

Dưới đây là ví dụ về cách nhắc gemma với thông tin đầu vào bị cắt bớt (sử dụng bí danh gemma2b như được 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 chỉ mang tính thử nghiệm và cần tính đến các giới hạn về độ 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.