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

gemma.cpp là một C++ thuần tuý có kích thước nhẹ triển khai thời gian chạy suy luận của mô hình Gemma.

Để biết thêm thông tin về Gemma, hãy xem thẻ mẫu. Trọng số mô hình, bao gồm cả cấu phần phần mềm cụ thể gemma.cpp có sẵn 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à những hệ thống tinh vi, thường được thiết kế riêng vượt ra khỏi môi trường thời gian chạy mạng nơron truyền thống. Bằng cách này mang đến cơ hội nghiên cứu và đổi mới thông qua hợp tác thiết kế ở cấp độ cao và hoạt động 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 dự đoán C++ hướng triển khai, không được thiết kế cho thử nghiệm và các khung nghiên cứu học máy tập trung vào Python, vốn là những công cụ tóm tắt tính toán cấp thấp thông qua biên dịch.

gemma.cpp cung cấp cách triển khai tối giản của các mô hình Gemma 2B và 7B, tập trung vào tính đơn giản và tính trực tiếp hơn là tính chung chung. Đây là lấy cảm hứng từ việc 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 đến các trường hợp thử nghiệm và nghiên cứu, cụ thể là khám phá không gian thiết kế của thuật toán suy luận và suy luận CPU bằng cách sử dụng SIMD di động qua Đường cao tốc của Google thư viện của bạn. Mục đích là để đơn giản hoá việc nhúng vào các dự án khác cùng với các phần phụ thuộc tối thiểu và cũng dễ dàng sửa đổi nhờ có một lõi nhỏ ~ 2K LoC triển khai (cùng với khoảng 4.000 LoC tiện ích hỗ trợ).

Đối với việc triển khai biên theo hướng sản xuất, bạn nên triển khai theo tiêu chuẩn lộ trình bằng cách sử dụng các khung Python hoàn thiện như JAX, Keras, PyTorch và Máy biến áp (tất cả biến thể của mô hình tại đây).

Chúng tôi luôn hoan nghênh đóng góp của cộng đồng, dù lớn hay nhỏ. Dự án này tuân theo Nguyên tắc cộng đồng nguồn mở của Google.

Bắt đầu nhanh

Để hoàn tất quy trình bắt đầu 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 cần cài đặt:

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

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

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

2B mô hình đ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ị Mô tả
2b-it Mô hình được tinh chỉnh theo 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ố được huấn luyện trước, 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

7B mô hình đ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ị Mô tả
7b-it Mô hình điều chỉnh hướng dẫn gồm 7 tỷ tham số, bfloat16
7b-it-sfp Mô hình điều chỉnh hướng dẫn 7 tỷ tham số, dấu phẩy động chuyển đổi 8 bit
7b-pt 7 tỷ tham số được huấn luyện trước, 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 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 đồ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 (thao tác này có thể dành vài phút):

tar -xf archive.tar.gz

Thao tác này sẽ tạo ra một tệp chứa trọng số mô hình như 2b-it-sfp.sbs và tệp tokenizer (tokenizer.spm). Bạn có thể di chuyển các tệp này sang vị trí thư mục thuận tiện (ví dụ: bản dựng/ thư mục trong kho lưu trữ này).

Bước 3: Tạo

Hệ thống xây dựng sử dụng CMake. Để lập suy luận gemma thời gian chạy, hãy tạo thư mục bản dựng và tạo 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 việc này thành công, giờ đây bạn sẽ có gemma có thể thực thi trong thư mục build/.

Bước 4: Chạy

Bây giờ, 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 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]

Ví dụ về lệnh gọi cho cấu hình sau:

  • Tệp trọng số nén 2b-it-sfp.sbs (mô hình điều chỉnh theo hướng dẫn 2B, 8 bit dấu phẩy động được chuyển đổi).
  • 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ởi cờ độ chi tiết.

Tất cả các chế độ sử dụng đều mang tính tương tác, kích hoạt việc tạo văn bản dựa trên đầu vào 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 tiêu chuẩn trong dòng lệnh dành cho người dùng.
--verbosity 2 Chi tiết Hiện thêm thông tin về nhà phát triển và gỡ lỗi.

Ứng dụng Terminal tương tác

Theo mặc định, độ chi tiết được đặt thành 1, sẽ hiển thị hoạt động 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 làm 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 của riêng bạn đến đường dẫn mô hình và trình tạo mã thông báo trong nội dung 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 ngắn (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 mang tính thử nghiệm và cần độ dài ngữ cảnh các giới hạn.

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.