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

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() เดียวกันกับโมเดลพื้นฐาน