คู่มือการสรุป LLM สำหรับ Android

LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) บนอุปกรณ์ได้ทั้งหมดสําหรับแอปพลิเคชัน Android ซึ่งคุณสามารถใช้เพื่อทํางานได้หลากหลาย เช่น การสร้างข้อความ การดึงข้อมูลในรูปแบบภาษาธรรมชาติ และการสรุปเอกสาร งานนี้รองรับโมเดลภาษาขนาดใหญ่แบบข้อความเป็นข้อความหลายรายการในตัว คุณจึงใช้โมเดล Generative AI บนอุปกรณ์ล่าสุดกับแอป Android ได้

งานนี้รองรับตัวแปรต่อไปนี้ของ Gemma ได้แก่ Gemma-3 1B, Gemma-2 2B, Gemma 2B และ Gemma 7B Gemma เป็นกลุ่มผลิตภัณฑ์โมเดลแบบเปิดที่ทันสมัยและน้ำหนักเบาซึ่งสร้างขึ้นจากงานวิจัยและเทคโนโลยีเดียวกับที่ใช้สร้างโมเดล Gemini และยังรองรับรุ่นภายนอกต่อไปนี้ด้วย Phi-2, Falcon-RW-1B และ StableLM-3B

นอกจากโมเดลที่รองรับแล้ว ผู้ใช้ยังสามารถใช้ AI Edge Torch ของ Google เพื่อส่งออกโมเดล PyTorch เป็นโมเดล LiteRT (tflite) หลายลายเซ็น ซึ่งจะรวมอยู่กับพารามิเตอร์ตัวแยกวิเคราะห์เพื่อสร้างกลุ่มงานที่เข้ากันได้กับ LLM Inference API

คุณดูการทำงานของงานนี้ได้จากการสาธิต MediaPipe Studio ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

คู่มือนี้กล่าวถึงตัวอย่างแอปการสร้างข้อความพื้นฐานสําหรับ Android คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป Android ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างจะโฮสต์อยู่ใน GitHub

ดาวน์โหลดรหัส

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คําสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. คุณอาจกำหนดค่าอินสแตนซ์ git ให้ใช้การตรวจสอบแบบเบาบางเพื่อให้มีเฉพาะไฟล์สำหรับแอปตัวอย่าง LLM Inference API เท่านั้น โดยทำดังนี้
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/android
    

หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณสามารถนําเข้าโปรเจ็กต์ไปยัง Android Studio และเรียกใช้แอปได้ ดูวิธีการได้ที่คู่มือการตั้งค่าสําหรับ Android

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสําคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้ LLM Inference API โดยเฉพาะ ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ Android

การอ้างอิง

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"/>

รุ่น

MediaPipe LLM Inference API ต้องใช้โมเดลภาษาแบบข้อความเป็นข้อความที่ได้รับการฝึกฝนมาซึ่งเข้ากันได้กับงานนี้ หลังจากดาวน์โหลดโมเดลแล้ว ให้ติดตั้งข้อกําหนดเบื้องต้นที่จําเป็นและพุชโมเดลไปยังอุปกรณ์ Android หากใช้โมเดลอื่นที่ไม่ใช่ Gemma คุณจะต้องแปลงโมเดลเป็นรูปแบบที่เข้ากันได้กับ MediaPipe

ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกแล้วซึ่งมีให้ใช้งานสําหรับ LLM Inference API ได้ที่ส่วนโมเดลในภาพรวมของงาน

ดาวน์โหลดโมเดล

ก่อนเริ่มต้น LLM Inference API ให้ดาวน์โหลดโมเดลที่รองรับรายการใดรายการหนึ่งและเก็บไฟล์ไว้ในไดเรกทอรีโปรเจ็กต์ เราขอแนะนำให้ใช้ Gemma-3 1B ในรูปแบบการแปลงค่า 4 บิต ซึ่งมีอยู่ใน Hugging Face

นอกจากนี้ คุณยังดาวน์โหลดรูปแบบอื่นๆ ที่รองรับต่อไปนี้ได้ด้วย

  • Gemma-2 2B: รุ่นที่ 2 ของ Gemma เป็นส่วนหนึ่งของตระกูลโมเดลแบบเปิดที่ทันสมัยและน้ำหนักเบาซึ่งสร้างขึ้นจากงานวิจัยและเทคโนโลยีเดียวกันกับที่ใช้สร้างโมเดล Gemini
  • Gemma 2B:เป็นส่วนหนึ่งของกลุ่มโมเดลแบบเปิดที่ทันสมัยและน้ำหนักเบาซึ่งสร้างขึ้นจากงานวิจัยและเทคโนโลยีเดียวกันกับที่ใช้สร้างโมเดล Gemini เหมาะสําหรับงานการสร้างข้อความที่หลากหลาย ซึ่งรวมถึงการตอบคําถาม การสรุป และการหาเหตุผล
  • Phi-2: โมเดล Transformer ที่มีพารามิเตอร์ 2.7 พันล้านรายการ ซึ่งเหมาะสําหรับรูปแบบคําถามและคําตอบ แชท และโค้ด
  • Falcon-RW-1B: โมเดลเฉพาะตัวถอดรหัสเชิงสาเหตุที่มีพารามิเตอร์ 1,000 ล้านรายการซึ่งได้รับการฝึกด้วยโทเค็น 350,000 ล้านรายการจาก RefinedWeb
  • StableLM-3B: โมเดลภาษาเฉพาะตัวถอดรหัสพารามิเตอร์ 3 พันล้านรายการซึ่งได้รับการฝึกล่วงหน้าด้วยโทเค็น 1 ล้านล้านรายการจากชุดข้อมูลภาษาอังกฤษและโค้ดที่หลากหลาย

นอกจากโมเดลที่รองรับแล้ว คุณยังใช้ AI Edge ของ Google เพื่อส่งออกโมเดล PyTorch ไปเป็นโมเดล LiteRT (tflite) ที่มีลายเซ็นหลายรายการได้ ดูข้อมูลเพิ่มเติมได้ที่ Torch ตัวแปลง Generative สําหรับโมเดล PyTorch

ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่ใช้ได้ในส่วนรูปแบบภาพรวมของงาน

แปลงโมเดลเป็นรูปแบบ MediaPipe

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

พุชโมเดลไปยังอุปกรณ์

พุชเนื้อหาของโฟลเดอร์ 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

สร้างงาน

MediaPipe LLM Inference API ใช้ฟังก์ชัน createFromOptions() เพื่อตั้งค่างาน ฟังก์ชัน createFromOptions() ยอมรับค่าสำหรับตัวเลือกการกําหนดค่า ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ตัวเลือกการกำหนดค่า

โค้ดต่อไปนี้จะเริ่มต้นงานโดยใช้ตัวเลือกการกําหนดค่าพื้นฐาน

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath("/data/local/.../")
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

ตัวเลือกการกำหนดค่า

ใช้ตัวเลือกการกําหนดค่าต่อไปนี้เพื่อตั้งค่าแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
modelPath เส้นทางไปยังตำแหน่งที่จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ PATH ไม่มี
maxTokens จํานวนโทเค็นสูงสุด (โทเค็นอินพุต + โทเค็นเอาต์พุต) ที่โมเดลจัดการได้ จำนวนเต็ม 512
topK จำนวนโทเค็นที่โมเดลพิจารณาในแต่ละขั้นตอนของการสร้าง จำกัดการคาดการณ์ไว้ที่โทเค็นที่เป็นไปได้มากที่สุด k รายการแรก จำนวนเต็ม 40
temperature ระดับความสุ่มที่เกิดขึ้นระหว่างการสร้าง อุณหภูมิที่สูงขึ้นจะทำให้ข้อความที่สร้างขึ้นมีความสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทำให้ระบบสร้างข้อความที่คาดเดาได้มากขึ้น ทศนิยม 0.8
randomSeed เมล็ดพันธุ์แบบสุ่มที่ใช้ระหว่างการสร้างข้อความ จำนวนเต็ม 0
loraPath เส้นทางแบบสัมบูรณ์ไปยังโมเดล LoRA ในอุปกรณ์ หมายเหตุ: ใช้ได้กับ GPU บางรุ่นเท่านั้น PATH ไม่มี
resultListener ตั้งค่าโปรแกรมรับฟังผลลัพธ์ให้รับผลลัพธ์แบบไม่พร้อมกัน ใช้ได้เฉพาะเมื่อใช้วิธีการสร้างแบบแอสซิงค์เท่านั้น ไม่มี ไม่มี
errorListener ตั้งค่าโปรแกรมรับฟังข้อผิดพลาด (ไม่บังคับ) ไม่มี ไม่มี

เตรียมข้อมูล

LLM Inference API ยอมรับอินพุตต่อไปนี้

  • prompt (สตริง): คําถามหรือพรอมต์
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

เรียกใช้งาน

ใช้เมธอด generateResponse() เพื่อสร้างคำตอบแบบข้อความสำหรับข้อความอินพุตที่ระบุไว้ในส่วนก่อนหน้า (inputPrompt) ซึ่งจะสร้างคำตอบที่สร้างขึ้นรายการเดียว

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 จะแสดงผล LlmInferenceResult ซึ่งมีข้อความตอบกลับที่สร้างขึ้น

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

คุณสามารถกําหนดค่า API การอนุมาน LLM ของ Mediapipe เพื่อรองรับการปรับรูปแบบตามลําดับชั้นต่ำ (LoRA) สําหรับโมเดลภาษาขนาดใหญ่ได้ การใช้โมเดล LoRA ที่ปรับแต่งมาอย่างดีช่วยให้นักพัฒนาซอฟต์แวร์ปรับแต่งลักษณะการทํางานของ LLM ผ่านกระบวนการฝึกที่ประหยัดค่าใช้จ่ายได้

การรองรับ LoRA ของ LLM Inference API ใช้ได้กับตัวแปร Gemma และโมเดล Phi-2 ทั้งหมดสําหรับแบ็กเอนด์ GPU โดยน้ำหนัก LoRA ใช้ได้กับเลเยอร์การใส่ใจเท่านั้น การใช้งานครั้งแรกนี้ถือเป็น API เวอร์ชันทดลองสําหรับการพัฒนาในอนาคต โดยมีแผนที่จะรองรับโมเดลและเลเยอร์ประเภทต่างๆ เพิ่มเติมในการอัปเดตที่กําลังจะมาถึง

เตรียมโมเดล LoRA

ทําตามวิธีการใน HuggingFace เพื่อฝึกโมเดล LoRA ที่ปรับแต่งอย่างละเอียดในชุดข้อมูลของคุณเองด้วยประเภทโมเดลที่รองรับ ซึ่งได้แก่ Gemma หรือ Phi-2 โมเดล Gemma-2 2B, Gemma 2B และ Phi-2 พร้อมใช้งานบน HuggingFace ในรูปแบบ SafeTensor เนื่องจาก 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 ที่ปรับแต่งอย่างละเอียดซึ่งเข้ากันได้กับ 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)

ตัวแปลงจะแสดงผลไฟล์ Flatbuffer ของ TFLite 2 ไฟล์ ไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์สำหรับโมเดล LoRA

การอนุมานโมเดล LoRA

อัปเดต LLM Inference API ของเว็บ, Android และ iOS เพื่อรองรับการอนุมานโมเดล LoRA

Android รองรับ LoRA แบบคงที่ระหว่างการเริ่มต้น หากต้องการโหลดโมเดล LoRA ผู้ใช้จะต้องระบุเส้นทางโมเดล LoRA และ LLM พื้นฐาน

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

หากต้องการเรียกใช้การอนุมาน LLM ด้วย LoRA ให้ใช้วิธีการ generateResponse() หรือ generateResponseAsync() เดียวกันกับโมเดลพื้นฐาน