LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) ได้โดยสมบูรณ์บนเบราว์เซอร์สำหรับเว็บแอปพลิเคชัน ซึ่งคุณสามารถใช้ทำงานต่างๆ ได้มากมาย เช่น การสร้างข้อความ การดึงข้อมูลในรูปแบบภาษาธรรมชาติ และสรุปเอกสาร งานนี้รองรับโมเดลภาษาขนาดใหญ่สำหรับการแปลงข้อความเป็นข้อความในตัว เพื่อให้คุณใช้โมเดล Generative AI ล่าสุดในอุปกรณ์กับเว็บแอปได้
คุณดูงานนี้ในการใช้งานจริงได้ในการสาธิต MediaPipe Studio ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ได้ที่ภาพรวม
ตัวอย่างโค้ด
แอปพลิเคชันตัวอย่างสำหรับ LLM Inference API จะระบุการใช้งานเบื้องต้นของงานนี้ใน JavaScript เพื่อเป็นข้อมูลอ้างอิงของคุณ คุณสามารถใช้แอปตัวอย่างนี้ เพื่อเริ่มสร้างแอปสร้างข้อความของคุณเอง
คุณสามารถเข้าถึงแอปตัวอย่าง LLM Inference API ใน GitHub
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้ LLM Inference API โดยเฉพาะ สำหรับข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาสำหรับการใช้ MediaPipe Tasks รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์ม โปรดดูคู่มือการตั้งค่าสำหรับเว็บ
ความเข้ากันได้กับเบราว์เซอร์
LLM Inference API ต้องใช้เว็บเบราว์เซอร์ที่รองรับ WebGPU โปรดดูรายการเบราว์เซอร์ทั้งหมดที่เข้ากันได้ที่หัวข้อความเข้ากันได้ของเบราว์เซอร์ GPU
แพ็กเกจ JavaScript
โค้ด LLM Inference API มีให้บริการผ่านแพ็กเกจ @mediapipe/tasks-genai
คุณจะค้นหาและดาวน์โหลดไลบรารีเหล่านี้ได้จากลิงก์ที่ให้ไว้ในคู่มือการตั้งค่าของแพลตฟอร์ม
ติดตั้งแพ็กเกจที่จำเป็นสำหรับการทดลองใช้ในเครื่อง
npm install @mediapipe/tasks-genai
หากต้องการทำให้เซิร์ฟเวอร์ใช้งานได้ ให้ใช้บริการเครือข่ายนำส่งข้อมูล (CDN) เช่น jsDelivr เพื่อเพิ่มโค้ดลงในหน้า HTML โดยตรง
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
รุ่น
MediaPipe LLM Inference API ต้องใช้โมเดลที่ผ่านการฝึกซึ่งเข้ากันได้กับงานนี้ สำหรับเว็บแอปพลิเคชัน รุ่นดังกล่าวต้องใช้ร่วมกับ GPU ได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกแล้วสำหรับ LLM Inference API ได้ในภาพรวมงานส่วนโมเดล
ดาวน์โหลดโมเดล
ก่อนที่จะเริ่มต้น LLM Inference API ให้ดาวน์โหลดโมเดลที่รองรับมา 1 โมเดลและจัดเก็บไฟล์ไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ
- Gemma: เป็นส่วนหนึ่งของกลุ่มโมเดลแบบเปิดที่ทันสมัยและมีน้ำหนักเบาซึ่งสร้างขึ้นจากการวิจัยและเทคโนโลยีเดียวกันกับที่ใช้สร้างโมเดล Gemini เหมาะกับงานสร้างข้อความที่หลากหลาย รวมถึงการตอบคำถาม การสรุป และการให้เหตุผล ดาวน์โหลดตัวแปรรุ่น Gemma 2B หรือ Gemma 7B
- Phi-2: พารามิเตอร์ 2.7 พันล้านรายการ โมเดล Transformer เหมาะกับรูปแบบ Question-Answer, Chat และโค้ดมากที่สุด
- Falcon-RW-1B: โมเดลถอดรหัสโดยทั่วไปของพารามิเตอร์ 1 พันล้านรายการได้รับการฝึกกับโทเค็น 350B ของ RefinedWeb
- StableLM-3B: โมเดลภาษาแบบถอดรหัสพารามิเตอร์ 3 พันล้านชุดที่ฝึกล่วงหน้ากับชุดข้อมูลโค้ดและภาษาอังกฤษที่หลากหลายกว่า 1 ล้านล้านโทเค็น
เราขอแนะนำให้ใช้ Gemma 2B หรือ Gemma 7B ซึ่งมีให้บริการในโมเดล Kaggle และอยู่ในรูปแบบที่เข้ากันได้กับ LLM Inference API อยู่แล้ว หากใช้ LLM อื่น คุณจะต้องแปลงโมเดลเป็นรูปแบบที่เหมาะกับ MediaPipe ดูข้อมูลเพิ่มเติมเกี่ยวกับ Gemma ได้ที่เว็บไซต์ Gemma ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลอื่นๆ ที่ใช้ได้ที่ภาพรวมงานส่วนโมเดล
แปลงโมเดลเป็นรูปแบบ MediaPipe
Conversion รูปแบบเนทีฟ
หากคุณใช้ LLM ภายนอก (Phi-2, Falcon หรือ StableLM) หรือ Gemma เวอร์ชันที่ไม่ใช่ Kaggle ให้ใช้สคริปต์ Conversion ของเราเพื่อจัดรูปแบบโมเดลให้เข้ากันได้กับ MediaPipe
กระบวนการแปลงรูปแบบต้องใช้แพ็กเกจ MediaPipe PyPI สคริปต์ Conversion จะพร้อมใช้งานในแพ็กเกจ MediaPipe ทั้งหมดหลังจากวันที่ 0.10.11
ติดตั้งและนำเข้าทรัพยากร Dependency พร้อมข้อมูลต่อไปนี้
$ python3 -m pip install mediapipe
ใช้ไลบรารี genai.converter
เพื่อแปลงโมเดล:
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
input_ckpt=INPUT_CKPT,
ckpt_format=CKPT_FORMAT,
model_type=MODEL_TYPE,
backend=BACKEND,
output_dir=OUTPUT_DIR,
combine_file_only=False,
vocab_model_file=VOCAB_MODEL_FILE,
output_tflite_file=OUTPUT_TFLITE_FILE,
)
converter.convert_checkpoint(config)
ในการแปลงโมเดล LoRA คำสั่ง ConversionConfig
ควรระบุตัวเลือกโมเดลฐานและตัวเลือก LoRA เพิ่มเติม โปรดทราบว่าเนื่องจาก API รองรับเฉพาะการอนุมาน LoRA กับ GPU เท่านั้น จึงต้องตั้งค่าแบ็กเอนด์เป็น 'gpu'
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
# Other params related to base model
...
# Must use gpu backend for LoRA conversion
backend='gpu',
# LoRA related params
lora_ckpt=LORA_CKPT,
lora_rank=LORA_RANK,
lora_output_tflite_file=LORA_OUTPUT_TFLITE_FILE,
)
converter.convert_checkpoint(config)
ตัวแปลงจะแสดงผลไฟล์ TFLite Flatbuffer 2 ไฟล์ โดยไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์หนึ่งสำหรับโมเดล LoRA
พารามิเตอร์ | คำอธิบาย | ค่าที่ยอมรับ |
---|---|---|
input_ckpt |
เส้นทางไปยังไฟล์ model.safetensors หรือ pytorch.bin โปรดทราบว่าบางครั้งรูปแบบ Safetensors ของโมเดลจะมีการชาร์ดออกเป็นหลายๆ ไฟล์ เช่น model-00001-of-00003.safetensors , model-00001-of-00003.safetensors คุณระบุรูปแบบไฟล์ได้ เช่น model*.safetensors |
PATH |
ckpt_format |
รูปแบบไฟล์โมเดล | {"safetensors", "pytorch"} |
model_type |
LLM กำลังแปลง | {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"} |
backend |
โปรเซสเซอร์ (มอบสิทธิ์) ที่ใช้เพื่อเรียกใช้โมเดล | {"cpu", "gpu"} |
output_dir |
เส้นทางไปยังไดเรกทอรีเอาต์พุตที่โฮสต์ไฟล์น้ำหนักต่อเลเยอร์ | PATH |
output_tflite_file |
เส้นทางไปยังไฟล์เอาต์พุต เช่น "model_cpu.bin" หรือ "model_gpu.bin" ไฟล์นี้ใช้ร่วมกันได้กับ LLM Inference API เท่านั้น และไม่สามารถนำไปใช้เป็นไฟล์ "tflite" ทั่วไปได้ | PATH |
vocab_model_file |
เส้นทางไปยังไดเรกทอรีซึ่งจัดเก็บไฟล์ tokenizer.json และ tokenizer_config.json สำหรับ Gemma ให้ชี้ไปที่ไฟล์ tokenizer.model ไฟล์เดียว |
PATH |
lora_ckpt |
เส้นทางไปยังไฟล์ LoRA ckpt ของไฟล์ Safetensors ที่จัดเก็บน้ำหนักของอะแดปเตอร์ LoRA | PATH |
lora_rank |
จำนวนเต็มที่แสดงอันดับของ LoRA ckpt ต้องระบุเพื่อแปลงน้ำหนักลอรา หากไม่ระบุ ตัวแปลงจะถือว่าไม่มีน้ำหนัก LoRA หมายเหตุ: เฉพาะแบ็กเอนด์ของ GPU เท่านั้นที่รองรับ LoRA | จำนวนเต็ม |
lora_output_tflite_file |
ชื่อไฟล์เอาต์พุต tflite สำหรับน้ำหนัก LoRA | PATH |
การแปลงรูปแบบ AI Edge
หากคุณใช้ LLM ที่แมปกับโมเดล TFLite ผ่าน AI Edge ให้ใช้สคริปต์การรวมกลุ่มของเราเพื่อสร้าง Task Bundle กระบวนการรวมกลุ่มจะแพ็กโมเดลที่แมป พร้อมข้อมูลเมตาเพิ่มเติม (เช่น พารามิเตอร์ Tokenizer) เพื่อเรียกใช้การอนุมานจากต้นทางถึงปลายทาง
กระบวนการรวมกลุ่มโมเดลต้องใช้แพ็กเกจ MediaPipe PyPI สคริปต์ Conversion จะพร้อมใช้งานในแพ็กเกจ MediaPipe ทั้งหมดหลังจากวันที่ 0.10.14
ติดตั้งและนำเข้าทรัพยากร Dependency พร้อมข้อมูลต่อไปนี้
$ python3 -m pip install mediapipe
ใช้ไลบรารี genai.bundler
เพื่อรวมโมเดล:
import mediapipe as mp
from mediapipe.tasks.python.genai import bundler
config = bundler.BundleConfig(
tflite_model=TFLITE_MODEL,
tokenizer_model=TOKENIZER_MODEL,
start_token=START_TOKEN,
stop_tokens=STOP_TOKENS,
output_filename=OUTPUT_FILENAME,
enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
พารามิเตอร์ | คำอธิบาย | ค่าที่ยอมรับ |
---|---|---|
tflite_model |
เส้นทางไปยังโมเดล TFLite ที่ส่งออกของ AI Edge | PATH |
tokenizer_model |
เส้นทางไปยังโมเดลเครื่องมือทำโทเค็นของ SentencePiece | PATH |
start_token |
โทเค็นเริ่มต้นที่เจาะจงรุ่น โทเค็นเริ่มต้นต้องมีอยู่ในโมเดล Tokenizer ที่ระบุ | STRING |
stop_tokens |
โทเค็นการหยุดที่เจาะจงของโมเดล โทเค็นหยุดต้องมีอยู่ในโมเดล Tokenizer ที่ระบุ | รายการ [STRING] |
output_filename |
ชื่อของไฟล์กลุ่มงานเอาต์พุต | PATH |
เพิ่มโมเดลในไดเรกทอรีโปรเจ็กต์
เก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
ระบุเส้นทางของโมเดลด้วยพารามิเตอร์ baseOptions
ของออบเจ็กต์ modelAssetPath
:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
สร้างงาน
ใช้หนึ่งในฟังก์ชัน LLM Inference API createFrom...()
เพื่อเตรียมงานสำหรับการเรียกใช้การอนุมาน คุณสามารถใช้ฟังก์ชัน createFromModelPath()
ที่มีเส้นทางแบบสัมพัทธ์หรือสัมบูรณ์ไปยังไฟล์โมเดลที่ฝึกแล้วได้ ตัวอย่างโค้ดใช้ฟังก์ชัน createFromOptions()
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าที่ใช้ได้ที่หัวข้อตัวเลือกการกำหนดค่า
โค้ดต่อไปนี้แสดงวิธีการสร้างและกำหนดค่างานนี้
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int4.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
ตัวเลือกการกำหนดค่า
งานมีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอปในเว็บและ JavaScript
ชื่อตัวเลือก | คำอธิบาย | ช่วงของค่า | ค่าเริ่มต้น |
---|---|---|---|
modelPath |
เส้นทางไปยังที่เก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ | PATH | ไม่มีข้อมูล |
maxTokens |
จำนวนโทเค็นสูงสุดที่โมเดลจัดการ (โทเค็นอินพุต + โทเค็นเอาต์พุต) | จำนวนเต็ม | 512 |
topK |
จำนวนโทเค็นที่โมเดลจะพิจารณาในแต่ละขั้นตอนของการสร้าง
จำกัดการคาดการณ์ไว้ที่โทเค็นที่เป็นไปได้มากที่สุดอันดับต้นๆ เมื่อตั้งค่า topK คุณต้องกำหนดค่าสำหรับ randomSeed ด้วย |
จำนวนเต็ม | 40 |
temperature |
ปริมาณการสุ่มที่เกิดขึ้นระหว่างการสร้าง อุณหภูมิที่สูงขึ้นส่งผลให้ข้อความที่สร้างขึ้นมีความคิดสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทําให้เกิดการสร้างที่คาดการณ์ได้มากขึ้น เมื่อตั้งค่า temperature คุณต้องกำหนดค่าสำหรับ randomSeed ด้วย |
ทศนิยม | 0.8 |
randomSeed |
Seed แบบสุ่มที่ใช้ระหว่างการสร้างข้อความ | จำนวนเต็ม | 0 |
loraRanks |
LoRA จัดอันดับให้ใช้โดยโมเดล LoRA ระหว่างรันไทม์ หมายเหตุ: ใช้ได้กับรุ่น GPU เท่านั้น | อาร์เรย์จำนวนเต็ม | ไม่มีข้อมูล |
เตรียมข้อมูล
LLM Inference API ยอมรับข้อความ (string
) งานนี้จะจัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการแปลงข้อมูลเป็นโทเค็นและการประมวลผลล่วงหน้าของ tensor
การประมวลผลล่วงหน้าทั้งหมดได้รับการจัดการภายในฟังก์ชัน generateResponse()
ไม่จำเป็นต้องประมวลผลข้อความอินพุตล่วงหน้าเพิ่มเติม
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
เรียกใช้งาน
LLM Inference API ใช้ฟังก์ชัน generateResponse()
เพื่อทริกเกอร์การอนุมาน
สำหรับการจัดประเภทข้อความ จะหมายถึงการแสดงผลหมวดหมู่ที่เป็นไปได้สำหรับข้อความอินพุต
โค้ดต่อไปนี้แสดงวิธีเรียกใช้การประมวลผลด้วยโมเดลงาน
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
หากต้องการสตรีมคำตอบ ให้ใช้รายการต่อไปนี้
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
แฮนเดิลและแสดงผลลัพธ์
LLM Inference API จะแสดงผลสตริง ซึ่งรวมถึงข้อความตอบกลับที่สร้างขึ้น
Here's a draft you can use:
Subject: Lunch on Saturday Reminder
Hi Brett,
Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.
Looking forward to it!
Best,
[Your Name]
การปรับแต่งโมเดล LoRA
Mediapipe LLM Inference API สามารถกำหนดค่าให้รองรับการปรับแรงก์ต่ำ (LoRA) สำหรับโมเดลภาษาขนาดใหญ่ได้ นักพัฒนาซอฟต์แวร์จะใช้โมเดล LoRA ที่ปรับแต่งมาปรับแต่งลักษณะการทำงานของ LLM ผ่านกระบวนการฝึกอบรมที่คุ้มค่า
การรองรับ LoRA ของ LLM Inference API ใช้งานได้กับรุ่น Gemma-2B และ Phi-2 สำหรับแบ็กเอนด์ GPU โดยน้ำหนัก LoRA จะใช้กับเลเยอร์ความสนใจเท่านั้น การใช้งานในช่วงแรกนี้เป็น API ทดลองสำหรับการพัฒนาในอนาคต โดยมีแผนที่จะรองรับโมเดลเพิ่มเติมและเลเยอร์ประเภทต่างๆ ในการอัปเดตที่กำลังจะมาถึง
เตรียมโมเดล LoRA
ทำตามวิธีการใน HuggingFace เพื่อฝึกโมเดล LoRA ที่ปรับแต่งอย่างละเอียดในชุดข้อมูลของคุณเองด้วยประเภทโมเดลที่รองรับ Gemma-2B หรือ Phi-2 ทั้งรุ่น Gemma-2B และ Phi-2 พร้อมใช้งานบน HuggingFace ในรูปแบบ Safetensors เนื่องจาก LLM Inference API รองรับ LoRA ในเลเยอร์ความสนใจเท่านั้น โปรดระบุเลเยอร์ความสนใจในขณะที่สร้าง LoraConfig
ดังต่อไปนี้เท่านั้น
# For Gemma-2B
from peft import LoraConfig
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
# For Phi-2
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)
สำหรับการทดสอบ มีโมเดล LoRA ที่ปรับแต่งแล้วที่เข้าถึงได้แบบสาธารณะซึ่งพอดีกับ LLM Inference API ที่พร้อมให้ใช้งานบน HuggingFace เช่น monsterapi/gemma-2b-lora-maths-orca-200k สำหรับ Gemma-2B และ lole25/phi-2-sft-ultrachat-lora สำหรับ Phi-2
หลังจากฝึกชุดข้อมูลที่เตรียมและบันทึกโมเดลแล้ว คุณจะได้รับไฟล์ adapter_model.safetensors
ที่มีน้ำหนักของโมเดล LoRA ที่ปรับแต่งแล้ว ไฟล์ Safetensors คือจุดตรวจสอบ LoRA ที่ใช้ในการแปลงโมเดล
ในขั้นตอนถัดไป คุณต้องแปลงน้ำหนักของโมเดลเป็น TensorFlow Lite Flatbuffer โดยใช้แพ็กเกจ MediaPipe Python ConversionConfig
ควรระบุตัวเลือกรุ่นพื้นฐานและตัวเลือก LoRA เพิ่มเติม โปรดทราบว่า เนื่องจาก API รองรับเฉพาะการอนุมาน LoRA กับ GPU เท่านั้น จึงต้องตั้งค่าแบ็กเอนด์เป็น 'gpu'
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
# Other params related to base model
...
# Must use gpu backend for LoRA conversion
backend='gpu',
# LoRA related params
lora_ckpt=LORA_CKPT,
lora_rank=LORA_RANK,
lora_output_tflite_file=LORA_OUTPUT_TFLITE_FILE,
)
converter.convert_checkpoint(config)
ตัวแปลงจะแสดงผลไฟล์ TFLite Flatbuffer 2 ไฟล์ โดยไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์หนึ่งสำหรับโมเดล LoRA
การอนุมานโมเดล LoRA
API การอนุมาน LLM บนเว็บ, Android และ iOS ได้รับการอัปเดตให้รองรับการอนุมานโมเดล LoRA เว็บรองรับ LoRA แบบไดนามิก ซึ่งเปลี่ยน LoRA รุ่นต่างๆ ได้ระหว่างรันไทม์ Android และ iOS รองรับ LoRA แบบคงที่ ซึ่งใช้น้ำหนัก LoRA เดียวกันตลอดอายุการทำงาน
เว็บรองรับ LoRA แบบไดนามิกในระหว่างรันไทม์ กล่าวคือ ผู้ใช้ประกาศว่าจะใช้อันดับ LoRA ระหว่างการเริ่มต้น และสลับรุ่น LoRA ที่แตกต่างกันในระหว่างรันไทม์ได้const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
ในระหว่างรันไทม์ หลังจากเริ่มต้นโมเดลฐานแล้ว ให้โหลดโมเดล LoRA ที่จะใช้ นอกจากนี้ ให้ทริกเกอร์โมเดล LoRA ด้วยการส่งการอ้างอิงโมเดล LoRA ขณะสร้างการตอบสนอง LLM
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});