LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) บนอุปกรณ์ได้อย่างสมบูรณ์ สำหรับแอปพลิเคชัน Android ซึ่งคุณสามารถใช้เพื่อทำงานได้หลากหลาย เช่น สร้างข้อความ ดึงข้อมูลในรูปแบบภาษาธรรมชาติ และ สรุปเอกสาร โดยงานนี้รองรับโมเดลภาษาขนาดใหญ่แบบข้อความต่อข้อความหลายรายการในตัว คุณจึงใช้โมเดล Generative AI ล่าสุดในอุปกรณ์กับแอป Android ได้
หากต้องการเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android อย่างรวดเร็ว ให้ทำตามQuickstart ดูตัวอย่างพื้นฐานของแอปพลิเคชัน Android ที่เรียกใช้ LLM Inference API ได้ที่แอปพลิเคชันตัวอย่าง หากต้องการทำความเข้าใจวิธีการทำงานของ LLM Inference API อย่างละเอียด โปรดดูส่วนตัวเลือกการกำหนดค่า การแปลงโมเดล และการปรับแต่ง LoRA
คุณดูตัวอย่างการทำงานของงานนี้ได้ในเดโม MediaPipe Studio ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ได้ที่ภาพรวม
คู่มือเริ่มใช้งานฉบับย่อ
ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android API การอนุมาน LLM ได้รับการเพิ่มประสิทธิภาพสำหรับอุปกรณ์ Android ระดับไฮเอนด์ เช่น Pixel 8 และ Samsung S23 ขึ้นไป และไม่รองรับโปรแกรมจำลองอุปกรณ์อย่างน่าเชื่อถือ
เพิ่มทรัพยากร Dependency
LLM Inference API ใช้ไลบรารี com.google.mediapipe:tasks-genai
เพิ่มทรัพยากร Dependency นี้ลงในไฟล์ build.gradle
ของแอป Android
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.27'
}
ดาวน์โหลดโมเดล
ดาวน์โหลด 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
เริ่มต้นงาน
เริ่มต้นงานด้วยตัวเลือกการกำหนดค่าพื้นฐาน
// 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)
แอปพลิเคชันตัวอย่าง
หากต้องการดู LLM Inference API ในการทำงานและสำรวจความสามารถของ Generative AI บนอุปกรณ์อย่างครอบคลุม โปรดดูแอป Google AI Edge Gallery
Google AI Edge Gallery เป็นแอปพลิเคชัน Android แบบโอเพนซอร์สที่ทำหน้าที่เป็น สนามเด็กเล่นแบบอินเทอร์แอกทีฟสำหรับนักพัฒนาซอฟต์แวร์ โดยจะแสดงข้อมูลต่อไปนี้
- ตัวอย่างการใช้งานจริงของ LLM Inference API สำหรับงานต่างๆ
ซึ่งรวมถึง
- ถามเกี่ยวกับรูปภาพ: อัปโหลดรูปภาพและถามคำถามเกี่ยวกับรูปภาพนั้น รับคำอธิบาย แก้ปัญหา หรือระบุวัตถุ
- พรอมต์แล็บ: สรุป เขียนใหม่ สร้างโค้ด หรือใช้พรอมต์รูปแบบอิสระ เพื่อสำรวจกรณีการใช้งาน LLM แบบการสนทนาเดียว
- AI Chat: เข้าร่วมการสนทนาหลายรอบ
- ความสามารถในการค้นหา ดาวน์โหลด และทดลองใช้โมเดลที่หลากหลายซึ่งได้รับการเพิ่มประสิทธิภาพสำหรับ LiteRT จากชุมชน Hugging Face LiteRT และรุ่นอย่างเป็นทางการของ Google (เช่น Gemma 3N)
- การเปรียบเทียบประสิทธิภาพแบบเรียลไทม์ในอุปกรณ์สำหรับโมเดลต่างๆ (เวลาจนถึงโทเค็นแรก, ความเร็วในการถอดรหัส ฯลฯ)
- วิธีนําเข้าและทดสอบโมเดล
.litertlm
หรือ.task
ที่กําหนดเอง
แอปนี้เป็นแหล่งข้อมูลที่ช่วยให้เข้าใจการใช้งานจริงของ LLM Inference API และศักยภาพของ Generative AI บนอุปกรณ์ สำรวจซอร์สโค้ดและดาวน์โหลดแอปจากที่เก็บ GitHub ของ Google AI Edge Gallery
ตัวเลือกการกำหนดค่า
ใช้ตัวเลือกการกำหนดค่าต่อไปนี้เพื่อตั้งค่าแอป Android
ชื่อตัวเลือก | คำอธิบาย | ช่วงค่า | ค่าเริ่มต้น |
---|---|---|---|
modelPath |
เส้นทางไปยังตำแหน่งที่จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ | เส้นทาง | ไม่มี |
maxTokens |
จำนวนโทเค็นสูงสุด (โทเค็นอินพุต + โทเค็นเอาต์พุต) ที่โมเดลจัดการ | จำนวนเต็ม | 512 |
topK |
จำนวนโทเค็นที่โมเดลพิจารณาในแต่ละขั้นตอนของการสร้าง จำกัดการคาดการณ์ไว้ที่โทเค็นที่มีแนวโน้มมากที่สุด k อันดับแรก | จำนวนเต็ม | 40 |
temperature |
ระดับความสุ่มที่ใช้ระหว่างการสร้าง อุณหภูมิที่สูงขึ้นจะทำให้ข้อความที่สร้างขึ้นมีความคิดสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทำให้การสร้างข้อความคาดการณ์ได้มากขึ้น | ทศนิยม | 0.8 |
randomSeed |
ค่าเริ่มต้นแบบสุ่มที่ใช้ระหว่างการสร้างข้อความ | จำนวนเต็ม | 0 |
loraPath |
เส้นทางแบบสัมบูรณ์ไปยังโมเดล LoRA ในอุปกรณ์ หมายเหตุ: ใช้ได้กับรุ่น GPU เท่านั้น | เส้นทาง | ไม่มี |
resultListener |
ตั้งค่าเครื่องมือฟังผลลัพธ์เพื่อรับผลลัพธ์แบบไม่พร้อมกัน ใช้ได้เมื่อใช้วิธีการสร้างแบบไม่พร้อมกันเท่านั้น | ไม่มี | ไม่มี |
errorListener |
ตั้งค่าเครื่องมือฟังข้อผิดพลาดที่ไม่บังคับ | ไม่มี | ไม่มี |
การเขียนพรอมต์แบบหลายรูปแบบ
API การอนุมาน LLM ของ Android รองรับการแจ้งหลายรูปแบบด้วยโมเดลที่ ยอมรับอินพุตข้อความ รูปภาพ และเสียง เมื่อเปิดใช้ความสามารถแบบหลายรูปแบบ ผู้ใช้จะ รวมรูปภาพและข้อความ หรือเสียงและข้อความไว้ในพรอมต์ได้ จากนั้น LLM จะให้คำตอบเป็นข้อความ
หากต้องการเริ่มต้นใช้งาน ให้ใช้ Gemma 3n เวอร์ชันที่เข้ากันได้กับ MediaPipe ดังนี้
- Gemma-3n E2B: โมเดล 2B ที่มีประสิทธิภาพในตระกูล Gemma-3n
- Gemma-3n E4B: โมเดล 4B ที่มีประสิทธิภาพในกลุ่มผลิตภัณฑ์ Gemma-3n
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ Gemma-3n
ทำตามขั้นตอนด้านล่างเพื่อเปิดใช้การป้อนรูปภาพหรือเสียงสำหรับ LLM Inference API
การป้อนรูปภาพ
หากต้องการระบุรูปภาพภายในพรอมต์ ให้แปลงรูปภาพหรือเฟรมอินพุตเป็นออบเจ็กต์
com.google.mediapipe.framework.image.MPImage
ก่อนส่งไปยัง
LLM Inference API โดยทำดังนี้
import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage
// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
หากต้องการเปิดใช้การรองรับการมองเห็นสำหรับ LLM Inference API ให้ตั้งค่าEnableVisionModality
ตัวเลือกการกำหนดค่าเป็น true
ภายในตัวเลือกกราฟ
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
ตั้งค่ารูปภาพสูงสุด 10 ภาพต่อเซสชัน
LlmInferenceOptions options = LlmInferenceOptions.builder()
...
.setMaxNumImages(10)
.build();
ต่อไปนี้เป็นตัวอย่างการติดตั้งใช้งาน LLM Inference API ที่ตั้งค่าไว้เพื่อจัดการอินพุตข้อความและอินพุตภาพ
MPImage image = getImageFromAsset(BURGER_IMAGE);
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
.setTopK(10)
.setTemperature(0.4f)
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
try (LlmInference llmInference =
LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
LlmInferenceSession session =
LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
session.addQueryChunk("Describe the objects in the image.");
session.addImage(image);
String result = session.generateResponse();
}
อินพุตเสียง
เปิดใช้การรองรับเสียงใน LlmInferenceOptions
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
...
.setAudioModelOptions(AudioModelOptions.builder().build())
.build()
เปิดใช้การรองรับเสียงใน sessionOptions
val sessionOptions = LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
.build()
ส่งข้อมูลเสียงระหว่างการอนุมาน หมายเหตุ: เสียงต้องเป็นช่องโมโนในรูปแบบ .wav
val audioData: ByteArray = ...
inferenceEngine.llmInferenceSession.addAudio(audioData)
ต่อไปนี้เป็นตัวอย่างการใช้งาน LLM Inference API ที่ตั้งค่าไว้เพื่อจัดการอินพุตเสียงและข้อความ
val audioData: ByteArray = ...
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
...
.setAudioModelOptions(AudioModelOptions.builder().build())
.build()
val sessionOptions = LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
.build()
LlmInference.createFromOptions(context, inferenceOptions).use { llmInference ->
LlmInferenceSession.createFromOptions(llmInference, sessionOptions).use { session ->
session.addQueryChunk("Transcribe the following speech segment:")
session.addAudio(audioData)
val result = session.generateResponse()
}
}
การปรับแต่ง LoRA
LLM Inference API รองรับการปรับแต่ง LoRA (Low-Rank Adaptation) โดยใช้ไลบรารี PEFT (Parameter-Efficient Fine-Tuning) การปรับแต่ง LoRA จะปรับแต่งลักษณะการทำงานของ LLM ผ่านกระบวนการฝึกที่มีต้นทุนต่ำ โดยสร้างชุดน้ำหนักที่ฝึกได้ขนาดเล็กตามข้อมูลการฝึกใหม่แทนที่จะฝึกโมเดลทั้งหมดอีกครั้ง
LLM Inference API รองรับการเพิ่มน้ำหนัก LoRA ลงในเลเยอร์ความสนใจของโมเดล Gemma-2 2B, Gemma 2B และ Phi-2 ดาวน์โหลดโมเดลในรูปแบบ safetensors
โมเดลพื้นฐานต้องอยู่ในรูปแบบ safetensors
เพื่อสร้างน้ำหนัก LoRA
หลังจากการฝึก LoRA คุณจะแปลงโมเดลเป็นรูปแบบ FlatBuffers
เพื่อเรียกใช้ใน MediaPipe ได้
เตรียมน้ำหนัก LoRA
ใช้คู่มือวิธีการ LoRA จาก PEFT เพื่อฝึกโมเดล LoRA ที่ปรับแต่งแล้วในชุดข้อมูลของคุณเอง
LLM Inference API รองรับเฉพาะ LoRA ในเลเยอร์ความสนใจ ดังนั้นให้ระบุเฉพาะเลเยอร์ความสนใจใน 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 ที่ใช้ในระหว่างการแปลงโมเดล
การแปลงโมเดล
ใช้แพ็กเกจ Python ของ MediaPipe เพื่อแปลงน้ำหนักของโมเดลเป็นรูปแบบ 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()
เดียวกันกับโมเดลพื้นฐาน