บทแนะนำของ Gemma C++ (gemma.cpp)

gemma.cpp เป็น C++ ที่บริสุทธิ์ขนาดเล็ก การใช้งานรันไทม์แบบอนุมานของโมเดล Gemma

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับ Gemma ที่การ์ดโมเดล น้ำหนักโมเดล รวมถึงอาร์ติแฟกต์ที่เฉพาะเจาะจง gemma.cpp พร้อมใช้งานบน Kaggle

โครงการนี้สำหรับใคร

เครื่องมืออนุมาน LLM สมัยใหม่เป็นระบบที่ซับซ้อน และมักมีการออกแบบเฉพาะด้าน มีความสามารถที่ครอบคลุมมากกว่ารันไทม์ของโครงข่ายระบบประสาทเทียมแบบดั้งเดิม ด้วยสิ่งนี้ พบโอกาสสำหรับการวิจัยและนวัตกรรมผ่านการออกแบบร่วมกันของผู้บริหารระดับสูง และการคำนวณระดับต่ำ อย่างไรก็ตาม มีช่องว่างระหว่าง รันไทม์อนุมาน C++ ที่เน้นการติดตั้งใช้งาน ซึ่งไม่ได้ออกแบบมาเพื่อ และเฟรมเวิร์กการวิจัย ML ที่เน้น Python การประมวลผลระดับต่ำผ่านการคอมไพล์

gemma.cpp ให้การติดตั้งใช้งานโมเดล Gemma 2B และ 7B ที่เรียบง่าย โดยมุ่งเน้นความเรียบง่ายและตรงไปตรงมา แทนที่จะเน้นภาพลักษณ์ทั่วไปโดยรวม นี่คือ ได้รับแรงบันดาลใจจากการติดตั้งใช้งานโมเดล C++ ที่ผสานรวมแนวตั้ง เช่น ggml, llama.c และ llama.rs

gemma.cpp กำหนดเป้าหมายของ Use Case ในการทดลองและการวิจัย โดยเฉพาะอย่างยิ่ง การสำรวจพื้นที่ในการออกแบบการอนุมาน CPU และอัลกอริทึมการอนุมานโดยใช้ SIMD แบบพกพาผ่าน Google Highway ไลบรารี เพราะมีไว้เพื่อการฝังในโปรเจ็กต์อื่นๆ ด้วย มีทรัพยากร Dependency น้อยที่สุดและแก้ไขได้ง่ายๆ ด้วย LoC ที่มีขนาดเล็กประมาณ 2,000 แกน (พร้อมด้วย LoC ประมาณ 4,000 รายการสำหรับสาธารณูปโภคสนับสนุน)

สำหรับการติดตั้งใช้งาน Edge ที่เน้นการใช้งานจริง ขอแนะนำให้ติดตั้งใช้งานแบบมาตรฐาน เส้นทางที่ใช้เฟรมเวิร์ก Python ที่สมบูรณ์ เช่น JAX, Keras, PyTorch และ Transformers (รูปแบบโมเดลทั้งหมด) ที่นี่)

เราอนุญาตให้มีการสนับสนุนคำบรรยายของชุมชนไม่ว่าจะขนาดเล็กหรือใหญ่ โปรเจ็กต์นี้เป็นไปตาม หลักเกณฑ์ของชุมชนโอเพนซอร์สของ Google

คู่มือเริ่มใช้งานฉบับย่อ

เพื่อให้การเริ่มต้นอย่างรวดเร็วนี้เสร็จสมบูรณ์ คุณต้องโคลนหรือดาวน์โหลด gemma.cpp.

ข้อกำหนดของระบบ

คุณควรติดตั้งสิ่งต่อไปนี้ก่อนเริ่มใช้งาน

ขั้นตอนที่ 1: รับน้ำหนักโมเดลและเครื่องมือแปลงข้อมูลเป็นโทเค็นจาก Kaggle

ไปที่หน้าโมเดล gemma ใน Kaggle และเลือก "รูปแบบโมเดล

เมนูแบบเลื่อนลงของ Gemma C++. On this tab, theVariation" ประกอบด้วย ตัวเลือกด้านล่าง โปรดทราบว่าตัวเลือกน้ำหนัก bFloat16 จะมีความแม่นยำสูงกว่า ขณะที่แบบ 8 บิต เปลี่ยนน้ำหนักของจุดลอยตัวจะทำให้การอนุมานเร็วขึ้น

โมเดล 2B ที่ปรับแต่งตามคำสั่ง (it) และโมเดลก่อนการฝึก (pt):

ชื่อโมเดล คำอธิบาย
2b-it โมเดลที่มีการปรับแต่งคำสั่งพารามิเตอร์ 2 พันล้าน, bFloat16
2b-it-sfp โมเดลที่ปรับแต่งตามคำสั่ง 2 พันล้านพารามิเตอร์ จุดลอยตัวสลับแบบ 8 บิต
2b-pt โมเดลก่อนการฝึก 2 พันล้านพารามิเตอร์ bFloat16
2b-pt-sfp โมเดลก่อนการฝึก 2 พันล้านพารามิเตอร์, จุดลอยตัวสลับแบบ 8 บิต

โมเดล 7B ที่ปรับแต่งตามคำสั่ง (it) และโมเดลก่อนการฝึก (pt):

ชื่อโมเดล คำอธิบาย
7b-it โมเดลที่มีการปรับแต่งคำสั่งพารามิเตอร์ 7 พันล้าน, bFloat16
7b-it-sfp โมเดลที่มีการปรับแต่งสำหรับพารามิเตอร์ 7 พันล้านรายการ จุดลอยตัวสลับแบบ 8 บิต
7b-pt โมเดลก่อนการฝึก 7 พันล้านพารามิเตอร์ bFloat16
7b-pt-sfp โมเดลก่อนการฝึก 7 พันล้านพารามิเตอร์, จุดลอยตัวสลับ 8 บิต

หมายเหตุ: เราแนะนำให้เริ่มต้นด้วย 2b-it-sfp เพื่อเริ่มต้นใช้งาน

ขั้นตอนที่ 2: แตกไฟล์

หลังจากกรอกแบบฟอร์มความยินยอมแล้ว การดาวน์โหลดควรดำเนินต่อเพื่อเรียก ไฟล์เก็บถาวร tar archive.tar.gz แยกไฟล์จาก archive.tar.gz (การดำเนินการนี้สามารถ ใช้เวลาสักครู่)

tar -xf archive.tar.gz

ซึ่งควรสร้างไฟล์ที่มีน้ำหนักโมเดล เช่น 2b-it-sfp.sbs และ ไฟล์การแปลงข้อมูลเป็นโทเค็น (tokenizer.spm) คุณอาจต้องย้ายไฟล์เหล่านี้ไปยัง ตำแหน่งไดเรกทอรีที่สะดวก (เช่น ไดเรกทอรีบิลด์/ ในที่เก็บนี้)

ขั้นตอนที่ 3: สร้าง

ระบบบิลด์ใช้ CMake เพื่อสร้างการอนุมาน Gemma รันไทม์ ให้สร้างไดเรกทอรีบิลด์และสร้างไฟล์บิลด์โดยใช้ cmake จากไดเรกทอรีโปรเจ็กต์ระดับบนสุด:

(cd build && cmake ..)

จากนั้นเรียกใช้ make เพื่อสร้างไฟล์ปฏิบัติการ ./gemma:

cd build make -j [number of parallel threads to use] gemma

เช่น make -j 8 gemma หากสำเร็จ ตอนนี้คุณควรมี gemma ที่ดำเนินการได้ในไดเรกทอรี build/

ขั้นตอนที่ 4: เรียกใช้

ขณะนี้คุณสามารถเรียกใช้ gemma จากภายในไดเรกทอรี build/ ได้แล้ว

gemma มีอาร์กิวเมนต์ที่จำเป็นต่อไปนี้

อาร์กิวเมนต์ คำอธิบาย ค่าตัวอย่าง
--model ประเภทโมเดล 2b-it, 2b-pt, 7b-it, 7b-pt, ... (ดูด้านบน)
--compressed_weights ไฟล์น้ำหนักที่บีบอัด 2b-it-sfp.sbs, ... (ดูด้านบน)
--tokenizer ชื่อไฟล์ของโทเค็นเครื่องมือ tokenizer.spm

gemma ถูกเรียกเป็น:

./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]

ตัวอย่างการเรียกใช้สำหรับการกำหนดค่าต่อไปนี้

  • ไฟล์น้ำหนักที่บีบอัด 2b-it-sfp.sbs (โมเดลที่ปรับแต่งตามคำสั่ง 2B 8 บิต สลับจุดลอยตัว)
  • ไฟล์ Tokenizer tokenizer.spm
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

การใช้งาน

gemma มีโหมดการใช้งานที่แตกต่างกัน ซึ่งควบคุมด้วยธงการพูดรายละเอียด

โหมดการใช้งานทั้งหมดเป็นแบบอินเทอร์แอกทีฟ ซึ่งจะทริกเกอร์การสร้างข้อความเมื่อ ขึ้นบรรทัดใหม่

การพูดรายละเอียด โหมดการใช้งาน รายละเอียด
--verbosity 0 มินิมอล เฉพาะเอาต์พุตการสร้างการพิมพ์เท่านั้น เหมาะที่จะใช้เป็นเครื่องมือ CLI
--verbosity 1 ค่าเริ่มต้น UI เทอร์มินัลมาตรฐานที่แสดงต่อผู้ใช้
--verbosity 2 รายละเอียด แสดงข้อมูลนักพัฒนาซอฟต์แวร์และการแก้ไขข้อบกพร่องเพิ่มเติม

แอปเทอร์มินัลแบบอินเทอร์แอกทีฟ

โดยค่าเริ่มต้น การพูดรายละเอียดจะตั้งค่าเป็น 1 ซึ่งจะแสดงการโต้ตอบแบบเทอร์มินัล เมื่อมีการเรียกใช้ gemma ด้วยอาร์กิวเมนต์ที่จำเป็น

$ ./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.

...

การใช้งานเป็นเครื่องมือบรรทัดคำสั่ง

การใช้ไฟล์ปฏิบัติการ gemma เป็นเครื่องมือบรรทัดคำสั่งอาจเป็นประโยชน์ดังนี้ สร้างชื่อแทนสำหรับ gemma.cpp พร้อมอาร์กิวเมนต์ที่ระบุอย่างครบถ้วน:

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"

แทนที่เส้นทางข้างต้นด้วยเส้นทางของคุณเองไปยังโมเดลและเส้นทางโทเค็น จากการดาวน์โหลด

ต่อไปนี้เป็นตัวอย่างการแสดงข้อความแจ้ง gemma ด้วยอินพุตที่ตัดให้สั้นลง (โดยใช้ ชื่อแทน gemma2b เหมือนที่นิยามไว้ข้างต้น):

cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b

หมายเหตุ: การใช้ CLI ของ gemma.cpp อยู่ในขั้นทดลองและควรใช้ความยาวของบริบท ข้อจำกัดไว้

เอาต์พุตของคำสั่งด้านบนควรมีลักษณะดังนี้

$ 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.