|
|
เรียกใช้ใน Google Colab
|
|
|
ดูแหล่งข้อมูลใน GitHub
|
เราได้เปิดตัวโมเดล "ร่าง" แบบถดถอยอัตโนมัติชุดใหม่ควบคู่ไปกับโมเดลหลักเพื่อปรับปรุงความเร็วในการอนุมานของโมเดล Gemma 4 โมเดลฉบับร่างจะคาดการณ์โทเค็นหลายรายการแบบถดถอยอัตโนมัติในเวลาที่โมเดลเป้าหมายใช้ประมวลผลเพียงรายการเดียว แทนที่จะพึ่งพาโมเดล Gemma 4 หลักเพียงอย่างเดียว (เรียกว่าโมเดล "เป้าหมาย") เทคนิคนี้เรียกอีกอย่างว่าการถอดรหัสแบบคาดการณ์
หลังจากดราฟเตอร์คาดการณ์โทเค็นดราฟต์หลายรายการแล้ว ตอนนี้โมเดลเป้าหมายจะต้องยืนยันเฉพาะโทเค็นดราฟต์ที่แนะนำเท่านั้น การยืนยันจะดำเนินการควบคู่กันไป ซึ่งจะช่วยเร่งการอนุมานได้อย่างมาก ซึ่งจะช่วยลดจำนวนการส่งต่อที่โมเดลเป้าหมายต้องทำสำหรับแต่ละโทเค็น เนื่องจากดราฟเตอร์ของเราสร้างลำดับโทเค็นสำหรับการยืนยัน เราจึงเรียกดราฟเตอร์นี้ว่าส่วนหัวการคาดการณ์แบบหลายโทเค็น (MTP)

โมเดลฉบับร่างที่เปิดตัวสำหรับตระกูล Gemma 4 มีขนาดเล็กและมีการปรับปรุงหลายอย่างเพื่อเพิ่มคุณภาพของโทเค็นฉบับร่างและเพิ่มความเร็วในการอนุมาน เช่น การใช้การเปิดใช้งานโมเดลเป้าหมายและแคช KV เพื่อให้ได้การคาดการณ์ที่ดีขึ้น
การเพิ่มประสิทธิภาพเหล่านี้ส่งผลให้การถอดรหัสเร็วขึ้นอย่างมากในขณะที่รับประกันคุณภาพที่คล้ายกัน ทำให้จุดตรวจสอบเหล่านี้เหมาะอย่างยิ่งสำหรับแอปพลิเคชันที่มีเวลาในการตอบสนองต่ำและแอปพลิเคชันในอุปกรณ์
ติดตั้งแพ็กเกจ Python
ติดตั้งไลบรารี Hugging Face ที่จำเป็นสำหรับการเรียกใช้โมเดล Gemma 4 และโมเดลผู้ช่วย Gemma 4
# Install PyTorch & other librariespip install torch accelerate# Install the transformers librarypip install transformers
โหลดโมเดล
สำหรับแต่ละโมเดลเป้าหมาย (หนึ่งในโมเดลหลักในโมเดล Gemma 4) จะมีผู้ช่วยที่ช่วยเร่งการอนุมาน ดังนั้น คุณจะต้องโหลดโมเดล 2 โมเดล ได้แก่
- เป้าหมาย (เช่น
google/gemma-4-E2B-it): โมเดลเป้าหมาย Gemma 4 แบบเต็ม - Drafter (เช่น
google/gemma-4-E2B-it-assistant): Drafter MTP แบบ 4 เลเยอร์น้ำหนักเบาที่เสนอโทเค็นผู้สมัคร
โปรดทราบว่าเรามักเรียกร่างว่าผู้ช่วย เนื่องจากโมเดลนี้ช่วยโมเดลขนาดใหญ่ในการเลือกโทเค็นที่จะคาดการณ์
ใช้transformersไลบรารีเพื่อสร้างอินสแตนซ์ของ processor และ model โดยใช้คลาส AutoProcessor และ AutoModelForCausalLM ตามที่แสดงในตัวอย่างโค้ดต่อไปนี้
TARGET_MODEL_ID = "google/gemma-4-E2B-it" # @param ["google/gemma-4-E2B-it","google/gemma-4-E4B-it", "google/gemma-4-31B-it", "google/gemma-4-26B-A4B-it"]
ASSISTANT_MODEL_ID = TARGET_MODEL_ID + "-assistant"
import torch
from transformers import AutoProcessor, AutoModelForCausalLM
# Target Model
processor = AutoProcessor.from_pretrained(TARGET_MODEL_ID)
target_model = AutoModelForCausalLM.from_pretrained(
TARGET_MODEL_ID,
torch_dtype=torch.bfloat16,
device_map="auto",
)
# Assistant Model (the drafter)
assistant_model = AutoModelForCausalLM.from_pretrained(
ASSISTANT_MODEL_ID,
torch_dtype=torch.bfloat16,
device_map="auto",
)
[transformers] `torch_dtype` is deprecated! Use `dtype` instead! Loading weights: 0%| | 0/1951 [00:00<?, ?it/s] Loading weights: 0%| | 0/50 [00:00<?, ?it/s]
Gemma 4 พร้อม Assistant
โชคดีที่การใช้ผู้ช่วยใน transformers นั้นค่อนข้างตรงไปตรงมาและกำหนดให้คุณส่งโมเดลผู้ช่วยไปยังฟังก์ชัน model.generate
# Process inputs with the `target_model`
messages = [
{
"role": "user",
"content": "Explain the concepts of speculative decoding and MTP in 3 sentences."
}
]
input_text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=input_text, return_tensors="pt").to(target_model.device)
# `assistant_model=assistant_model` is all you need to enable MTP!
outputs = target_model.generate(
**inputs,
assistant_model=assistant_model,
max_new_tokens=256,
do_sample=False,
)
# Decode the response into text
response = processor.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(response)
**Speculative decoding** is a technique where a smaller, faster language model (the "draft model") generates several candidate tokens, which are then quickly verified by a larger, more accurate model to produce a final, high-quality output much faster than decoding the large model alone. **MTP (Multi-Task Prediction)** involves training a single model to perform multiple related tasks simultaneously, allowing it to leverage shared knowledge across different objectives. Together, these methods aim to significantly accelerate the inference speed of large language models while maintaining or improving output quality.
กระบวนการทำงานเบื้องหลังมีดังนี้
- ร่างจะเสนอโทเค็น N ที่สร้างขึ้นโดยการถดถอยอัตโนมัติ
- โมเดลเป้าหมายจะยืนยันโทเค็นทั้ง N รายการในการส่งต่อครั้งเดียว
- ระบบจะยอมรับโทเค็นที่ร่างไว้ซึ่งมีความน่าจะเป็นสูง
- ระบบจะปฏิเสธโทเค็นที่ร่างไว้ซึ่งมีความน่าจะเป็นต่ำ
- เนื่องจากโมเดลเป้าหมายจะส่งต่อข้อมูล จึงจะสร้างโทเค็น 1 รายการด้วยตัวเองเสมอ ไม่ว่าระบบจะยอมรับหรือปฏิเสธโทเค็นที่ร่างไว้กี่รายการก็ตาม
โทเค็นฉบับร่าง
ผู้ร่างสามารถสร้างโทเค็นจำนวนเท่าใดก็ได้สำหรับโมเดลเป้าหมายเพื่อยืนยัน อย่างไรก็ตาม โมเดลเป้าหมายยังคงเลือกปฏิเสธโทเค็นบางรายการได้ เมื่อพบแล้ว ระบบจะไม่สนใจโทเค็นทั้งหมดหลังจากนั้น

ดังนั้น คุณจึงควรทราบข้อแลกเปลี่ยนเมื่อใช้ค่าต่างๆ สำหรับจำนวนโทเค็นที่ร่าง
โทเค็นฉบับร่างเพิ่มเติม
เมื่อคุณร่างโทเค็นจำนวนมาก (เช่น 15 รายการ) ก็มีโอกาสสูงที่ระบบจะไม่ยอมรับโทเค็นทั้งหมด ดังนั้นจึงมีโอกาสสูงที่จะสูญเสียการคำนวณไปโดยเปล่าประโยชน์ ในทางตรงกันข้าม เมื่ออัตราการยอมรับสูง โมเดลมีแนวโน้มที่จะเร่งความเร็วการอนุมาน

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

โชคดีที่คุณไม่ต้องทดสอบค่าที่ดีที่สุดสำหรับกรณีการใช้งานของคุณใน transformers เนื่องจากคุณสามารถตั้งค่า num_assistant_tokens_schedule เป็น "ฮิวริสติก" ซึ่งจะปรับจำนวนโทเค็นที่ร่างไว้โดยอัตโนมัติในขณะรันไทม์
- ยอมรับโทเค็นทั้งหมด - เพิ่มจำนวนโทเค็นที่จะร่างเป็น 2 เนื่องจากผู้ร่างค่อนข้างแม่นยำสำหรับพรอมต์ การเพิ่มจำนวนโทเค็นที่ร่างไว้อาจทำให้การดำเนินการเร็วขึ้นหากมีการยอมรับโทเค็นเหล่านั้นด้วย
- โทเค็นที่ถูกปฏิเสธ - หากมีโทเค็นถูกปฏิเสธ ให้ลดจำนวนโทเค็นที่จะร่างลง 1 การลดจำนวนโทเค็นจะช่วยให้ไม่เสียโทเค็นที่ร่างไว้มากเกินไป หากโมเดลเป้าหมายยังคงปฏิเสธโทเค็นส่วนใหญ่
ในทำนองเดียวกัน คุณสามารถอัปเดตจำนวนโทเค็นแบบร่างได้โดยการอัปเดต num_assistant_tokens ในเครื่องมือร่างดังนี้
# Update how many draft tokens are generated at the start of inference
assistant_model.generation_config.num_assistant_tokens = 4
# Update how the number of draft tokens are updated ("heuristic" for a dynamic schedule and "constant" for a constant schedule)
assistant_model.generation_config.num_assistant_tokens_schedule = "heuristic"
# Run with MTP
outputs = target_model.generate(
**inputs,
assistant_model=assistant_model,
max_new_tokens=256,
do_sample=False,
)
# Decode the response into text
response = processor.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(response)
**Speculative decoding** is a technique where a smaller, faster language model (the "draft model") generates several candidate tokens, which are then verified by a larger, more accurate model to quickly produce a high-quality output. **MTP (Multi-Task Prediction)** involves training a single model to perform multiple related tasks simultaneously, allowing it to leverage shared knowledge across different objectives. Together, these methods aim to significantly speed up the inference process of large language models while maintaining or improving output quality.
เรียกใช้ใน Google Colab
ดูแหล่งข้อมูลใน GitHub