LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) บนอุปกรณ์ได้ทั้งหมดสําหรับแอปพลิเคชัน Android ซึ่งคุณสามารถใช้เพื่อทํางานได้หลากหลาย เช่น การสร้างข้อความ การดึงข้อมูลในรูปแบบภาษาธรรมชาติ และการสรุปเอกสาร งานนี้รองรับโมเดลภาษาขนาดใหญ่แบบข้อความเป็นข้อความหลายรายการในตัว คุณจึงใช้โมเดล Generative AI บนอุปกรณ์ล่าสุดกับแอป Android ได้
หากต้องการเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android อย่างรวดเร็ว ให้ทําตามการเริ่มต้นใช้งานอย่างรวดเร็ว ดูตัวอย่างพื้นฐานของแอปพลิเคชัน Android ที่เรียกใช้ LLM Inference API ได้ที่ตัวอย่างแอปพลิเคชัน หากต้องการทําความเข้าใจวิธีการทํางานของ LLM Inference API อย่างละเอียดยิ่งขึ้น โปรดดูส่วนตัวเลือกการกําหนดค่า การเปลี่ยนรูปแบบ และการปรับ LoRA
คุณดูการทำงานของงานนี้ได้จากการสาธิต MediaPipe Studio ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม
คู่มือเริ่มใช้งานฉบับย่อ
ทําตามขั้นตอนต่อไปนี้เพื่อเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android LLM Inference API ได้รับการปรับให้เหมาะกับอุปกรณ์ Android ระดับสูง เช่น Pixel 8 และ Samsung S23 ขึ้นไป และไม่รองรับโปรแกรมจำลองอุปกรณ์อย่างน่าเชื่อถือ
เพิ่มการพึ่งพา
LLM Inference API ใช้ไลบรารี com.google.mediapipe:tasks-genai
เพิ่มข้อกำหนดต่อไปนี้ลงในไฟล์ build.gradle
ของแอป Android
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.22'
}
สําหรับอุปกรณ์ที่ใช้ Android 12 (API 31) ขึ้นไป ให้เพิ่มข้อกําหนดของไลบรารี OpenCL ดั้งเดิม ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับแท็ก uses-native-library
เพิ่มแท็ก uses-native-library
ต่อไปนี้ลงในไฟล์ AndroidManifest.xml
<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>
ดาวน์โหลดโมเดล
ดาวน์โหลด Gemma-3 1B ในรูปแบบ 4 บิตจาก Hugging Face ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่ใช้ได้ได้ที่เอกสารประกอบเกี่ยวกับรูปแบบ
พุชเนื้อหาของโฟลเดอร์ output_path ไปยังอุปกรณ์ Android
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version .task
เริ่มต้นใช้งาน Tasks
เริ่มต้นใช้งานงานด้วยตัวเลือกการกําหนดค่าพื้นฐาน
// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
.setModelPath('/data/local/tmp/llm/model_version .task')
.setMaxTopK(64)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)
เรียกใช้งาน
ใช้เมธอด generateResponse()
เพื่อสร้างคำตอบที่เป็นข้อความ ซึ่งจะสร้างคำตอบที่สร้างขึ้นรายการเดียว
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")
หากต้องการสตรีมคำตอบ ให้ใช้เมธอด generateResponseAsync()
val options = LlmInference.LlmInferenceOptions.builder()
...
.setResultListener { partialResult, done ->
logger.atInfo().log("partial result: $partialResult")
}
.build()
llmInference.generateResponseAsync(inputPrompt)
แอปพลิเคชันตัวอย่าง
แอปพลิเคชันตัวอย่างนี้เป็นตัวอย่างแอปการสร้างข้อความพื้นฐานสําหรับ Android ที่ใช้ LLM Inference API คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป Android ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างจะโฮสต์อยู่ใน GitHub
โคลนที่เก็บ Git โดยใช้คําสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณสามารถนําเข้าโปรเจ็กต์มายัง Android Studio และเรียกใช้แอปได้ ดูข้อมูลเพิ่มเติมได้ที่คู่มือการตั้งค่าสำหรับ Android
ตัวเลือกการกำหนดค่า
ใช้ตัวเลือกการกําหนดค่าต่อไปนี้เพื่อตั้งค่าแอป Android
ชื่อตัวเลือก | คำอธิบาย | ช่วงของค่า | ค่าเริ่มต้น |
---|---|---|---|
modelPath |
เส้นทางไปยังตำแหน่งที่จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ | PATH | ไม่มี |
maxTokens |
จํานวนโทเค็นสูงสุด (โทเค็นอินพุต + โทเค็นเอาต์พุต) ที่โมเดลจัดการได้ | จำนวนเต็ม | 512 |
topK |
จำนวนโทเค็นที่โมเดลพิจารณาในแต่ละขั้นตอนของการสร้าง จำกัดการคาดการณ์ไว้ที่โทเค็นที่เป็นไปได้มากที่สุด k รายการแรก | จำนวนเต็ม | 40 |
temperature |
ระดับความสุ่มที่เกิดขึ้นระหว่างการสร้าง อุณหภูมิที่สูงขึ้นจะทำให้ข้อความที่สร้างขึ้นมีความสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทำให้ระบบสร้างข้อความที่คาดการณ์ได้มากขึ้น | ทศนิยม | 0.8 |
randomSeed |
เมล็ดพันธุ์แบบสุ่มที่ใช้ระหว่างการสร้างข้อความ | จำนวนเต็ม | 0 |
loraPath |
เส้นทางแบบสัมบูรณ์ไปยังโมเดล LoRA ในอุปกรณ์ หมายเหตุ: ใช้ได้กับ GPU บางรุ่นเท่านั้น | PATH | ไม่มี |
resultListener |
ตั้งค่าโปรแกรมรับฟังผลลัพธ์ให้รับผลลัพธ์แบบไม่พร้อมกัน ใช้ได้เฉพาะเมื่อใช้วิธีการสร้างแบบแอสซิงค์เท่านั้น | ไม่มี | ไม่มี |
errorListener |
ตั้งค่าโปรแกรมรับฟังข้อผิดพลาด (ไม่บังคับ) | ไม่มี | ไม่มี |
การแปลงโมเดล
LLM Inference API ใช้ได้กับโมเดลประเภทต่อไปนี้ ซึ่งบางประเภทต้องแปลงโมเดล ใช้ตารางเพื่อระบุขั้นตอนและวิธีการที่จำเป็นสำหรับโมเดลของคุณ
โมเดล | วิธีการแปลง | แพลตฟอร์มที่เข้ากันได้ | ประเภทไฟล์ |
---|---|---|---|
Gemma-3 1B | ไม่ต้องแปลง | Android, เว็บ | .task |
Gemma 2B, Gemma 7B, Gemma-2 2B | ไม่ต้องแปลง | Android, iOS, เว็บ | .bin |
Phi-2, StableLM, Falcon | สคริปต์การเปลี่ยนรูปแบบของ MediaPipe | Android, iOS, เว็บ | .bin |
โมเดล LLM ของ PyTorch ทั้งหมด | คลัง Generative ของ AI Edge Torch | Android, iOS | .task |
ดูวิธีแปลงรูปแบบอื่นๆ ได้ที่ส่วน รูปแบบ Conversion
การปรับแต่ง LoRA
LLM Inference API รองรับการปรับ LoRA (Low-Rank Adaptation) โดยใช้ไลบรารี PEFT (Parameter-Efficient Fine-Tuning) การปรับ LoRA จะปรับแต่งลักษณะการทํางานของ LLM ผ่านกระบวนการฝึกที่ประหยัดค่าใช้จ่าย โดยสร้างชุดน้ำหนักที่ฝึกได้จำนวนน้อยๆ โดยอิงตามข้อมูลการฝึกใหม่แทนที่จะฝึกโมเดลทั้งชุดใหม่
LLM Inference API รองรับการเพิ่มน้ำหนัก LoRA ไปยังเลเยอร์ Attention ของโมเดล Gemma-2 2B, Gemma 2B และ Phi-2 ดาวน์โหลดโมเดลในรูปแบบ safetensors
โมเดลพื้นฐานต้องอยู่ในรูปแบบ safetensors
จึงจะสร้างน้ำหนัก LoRA ได้ หลังจากการฝึก LoRA แล้ว คุณสามารถแปลงโมเดลเป็นรูปแบบ FlatBuffers เพื่อใช้งานใน MediaPipe
เตรียมน้ำหนัก LoRA
ใช้คำแนะนำวิธีการ LoRA จาก PEFT เพื่อฝึกโมเดล LoRA ที่ปรับแต่งอย่างละเอียดในชุดข้อมูลของคุณเอง
LLM Inference API รองรับ LoRA ในเลเยอร์ Attention เท่านั้น ดังนั้นโปรดระบุเฉพาะเลเยอร์ Attention ใน LoraConfig
# For Gemma
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 ที่ปรับแต่งอย่างละเอียดจะพร้อมใช้งานใน adapter_model.safetensors
ไฟล์ safetensors
คือจุดตรวจสอบ LoRA ที่ใช้ในการแปลงโมเดล
การแปลงโมเดล
ใช้แพ็กเกจ MediaPipe Python เพื่อแปลงน้ำหนักโมเดลเป็นรูปแบบ Flatbuffer ConversionConfig
จะระบุตัวเลือกโมเดลพื้นฐานพร้อมกับตัวเลือก LoRA เพิ่มเติม
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_FILE ,
)
converter.convert_checkpoint(config)
ตัวแปลงจะสร้างไฟล์ Flatbuffer 2 ไฟล์ ไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์สำหรับโมเดล LoRA
การอนุมานโมเดล LoRA
Android รองรับ LoRA แบบคงที่ระหว่างการเริ่มต้น หากต้องการโหลดโมเดล LoRA ให้ระบุเส้นทางโมเดล LoRA และ LLM พื้นฐาน
// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPath(BASE_MODEL_PATH )
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.setLoraPath(LORA_MODEL_PATH )
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
หากต้องการเรียกใช้การอนุมาน LLM ด้วย LoRA ให้ใช้วิธีการ generateResponse()
หรือ
generateResponseAsync()
เดียวกันกับโมเดลพื้นฐาน