บทแนะนำของ 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 กำหนดเป้าหมายกรณีการใช้งานด้านการทดลองและการวิจัย โดยเฉพาะการสำรวจพื้นที่ในการออกแบบอัลกอริทึมการอนุมาน 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, theรูปแบบจะมีตัวเลือกต่อไปนี้ที่ด้านล่าง โปรดทราบว่าตัวเลือกน้ำหนัก bFloat 16 มีระดับความแม่นยำสูงกว่า ในขณะที่น้ำหนักจุดลอยตัวแบบเปลี่ยน 8 บิตช่วยให้อนุมานได้เร็วขึ้น

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

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

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

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

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

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

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

tar -xf archive.tar.gz

การดำเนินการนี้ควรสร้างไฟล์ที่มีน้ำหนักโมเดล เช่น 2b-it-sfp.sbs และไฟล์ Tokenizer (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 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.cpp พร้อมอาร์กิวเมนต์ที่ระบุครบถ้วนสมบูรณ์สำหรับการใช้ไฟล์ปฏิบัติการ gemma เป็นเครื่องมือบรรทัดคำสั่ง

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

หมายเหตุ: การใช้ gemma.cpp ใน CLI เป็นเวอร์ชันทดลองและควรคำนึงถึงขีดจำกัดความยาวของบริบท

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

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