บทแนะนำของ 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 Inference และอัลกอริทึม Inference โดยใช้ SIMD แบบพกพาผ่านไลบรารี Google Highway เครื่องมือนี้ออกแบบมาเพื่อให้ฝังในโปรเจ็กต์อื่นๆ ได้โดยง่ายโดยมีทรัพยากรที่ต้องพึ่งพาน้อย และแก้ไขได้ง่ายด้วยการติดตั้งใช้งานโค้ดหลักประมาณ 2,000 บรรทัด (พร้อมกับยูทิลิตีสนับสนุนประมาณ 4,000 บรรทัด)

สําหรับการใช้งานที่มุ่งเน้นที่ระบบขอบ เราขอแนะนําเส้นทางการทําให้ใช้งานได้มาตรฐานโดยใช้เฟรมเวิร์ก Python ที่พัฒนามาอย่างสมบูรณ์ เช่น JAX, Keras, PyTorch และ Transformer (ดูรูปแบบโมเดลทั้งหมดได้ที่นี่)

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

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

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

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

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

  • CMake
  • Clang C++ Compiler
  • tar สำหรับการดึงไฟล์เก็บถาวรจาก Kaggle

ขั้นตอนที่ 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 บิต

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

ชื่อโมเดล คำอธิบาย
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 (อาจใช้เวลา 2-3 นาที)

tar -xf archive.tar.gz

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

ขั้นตอนที่ 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 มีแ arguments ที่ต้องระบุดังต่อไปนี้

อาร์กิวเมนต์ คำอธิบาย ค่าตัวอย่าง
--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.spm
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

การใช้งาน

gemma มีโหมดการใช้งานที่แตกต่างกัน ซึ่งควบคุมโดย Flag verbosity

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

การพูดรายละเอียด โหมดการใช้งาน รายละเอียด
--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.