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, the
Variation` มีตัวเลือกต่อไปนี้ โปรดทราบว่าตัวเลือกน้ำหนัก 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.