Udhëzues LLM Inference për Android

API-ja LLM Inference ju lejon të ekzekutoni modele të mëdha gjuhësore (LLM) plotësisht në pajisje për aplikacionet Android, të cilat mund t'i përdorni për të kryer një gamë të gjerë detyrash, të tilla si gjenerimi i tekstit, marrja e informacionit në formë gjuhe natyrore dhe përmbledhja e dokumenteve. Detyra ofron mbështetje të integruar për shumë modele të mëdha gjuhësore tekst-në-tekst, kështu që ju mund të aplikoni modelet më të fundit të IA-së gjeneruese në pajisje në aplikacionet tuaja Android.

Për të shtuar shpejt API-në LLM Inference në aplikacionin tuaj Android, ndiqni Udhëzimin e Fillimit të Shpejtë . Për një shembull bazë të një aplikacioni Android që ekzekuton API-në LLM Inference, shihni aplikacionin shembull . Për një kuptim më të thellë se si funksionon API-ja LLM Inference, referojuni seksioneve të opsioneve të konfigurimit , konvertimit të modelit dhe akordimit LoRA .

Mund ta shihni këtë detyrë në veprim me demonstrimin e MediaPipe Studio . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .

Nisje e shpejtë

Përdorni hapat e mëposhtëm për të shtuar API-në LLM Inference në aplikacionin tuaj Android. API-ja LLM Inference është e optimizuar për pajisjet Android të nivelit të lartë, të tilla si Pixel 8 dhe Samsung S23 ose më të ri, dhe nuk mbështet në mënyrë të besueshme emulatorët e pajisjeve.

Shto varësi

API-ja LLM Inference përdor bibliotekën com.google.mediapipe:tasks-genai . Shtoni këtë varësi në skedarin build.gradle të aplikacionit tuaj Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.27'
}

Shkarkoni një model

Shkarkoni Gemma-3 1B në një format të kuantizuar 4-bit nga Hugging Face . Për më shumë informacion mbi modelet e disponueshme, shihni dokumentacionin e Modeleve .

Transferoni përmbajtjen e dosjes output_path në pajisjen 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

Inicializoni Detyrën

Inicializoni detyrën me opsionet bazë të konfigurimit:

// 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
val llmInference = LlmInference.createFromOptions(context, taskOptions)

Ekzekutoni Detyrën

Përdorni metodën generateResponse() për të gjeneruar një përgjigje tekstuale. Kjo prodhon një përgjigje të vetme të gjeneruar.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

Për të transmetuar përgjigjen, përdorni metodën generateResponseAsync() .

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

Aplikim shembull

Për të parë API-të LLM Inference në veprim dhe për të eksploruar një gamë të gjerë të aftësive të IA-së Gjenerative në pajisje, shikoni aplikacionin Google AI Edge Gallery .

Galeria Google AI Edge është një aplikacion Android me burim të hapur që shërben si një platformë interaktive për zhvilluesit. Ajo shfaq:

  • Shembuj praktikë të përdorimit të API-t LLM Inference për detyra të ndryshme, duke përfshirë:
    • Pyet Imazhin: Ngarko një imazh dhe bëj pyetje rreth tij. Merr përshkrime, zgjidh probleme ose identifiko objekte.
    • Laboratori i Sugjerimeve: Përmbledhni, rishkruani, gjeneroni kod ose përdorni sugjerime në formë të lirë për të eksploruar rastet e përdorimit të LLM me një kthesë të vetme.
    • Bisedë me IA: Angazhohuni në biseda me shumë kthesa.
  • Mundësia për të zbuluar, shkarkuar dhe eksperimentuar me një sërë modelesh të optimizuara për LiteRT nga Komuniteti Hugging Face LiteRT dhe versionet zyrtare të Google (p.sh. Gemma 3N).
  • Standardet e performancës në kohë reale në pajisje për modele të ndryshme (Koha për të parë shenjën, shpejtësia e dekodimit, etj.).
  • Si të importoni dhe testoni modelet tuaja të personalizuara .litertlm ose .task .

Ky aplikacion është një burim për të kuptuar zbatimin praktik të API-t LLM Inference dhe potencialin e IA-së Gjenerative në pajisje. Eksploroni kodin burimor dhe shkarkoni aplikacionin nga depoja Google AI Edge Gallery GitHub .

Opsionet e konfigurimit

Përdorni opsionet e mëposhtme të konfigurimit për të konfiguruar një aplikacion Android:

Emri i opsionit Përshkrimi Diapazoni i Vlerave Vlera e parazgjedhur
modelPath Shtegu për në vendin ku ruhet modeli brenda direktorisë së projektit. SHTEG N/A
maxTokens Numri maksimal i tokenëve (tokenët hyrës + tokenët dalës) që trajton modeli. Numër i plotë 512
topK Numri i tokenëve që modeli merr në konsideratë në çdo hap të gjenerimit. Kufizon parashikimet në k tokenët më të mundshëm. Numër i plotë 40
temperature Sasia e rastësisë së futur gjatë gjenerimit. Një temperaturë më e lartë rezulton në më shumë kreativitet në tekstin e gjeneruar, ndërsa një temperaturë më e ulët prodhon gjenerim më të parashikueshëm. Noton 0.8
randomSeed Farërat e rastësishme të përdorura gjatë gjenerimit të tekstit. Numër i plotë 0
loraPath Shtegu absolut për në modelin LoRA lokalisht në pajisje. Shënim: kjo është e pajtueshme vetëm me modelet GPU. SHTEG N/A
resultListener Cakton dëgjuesin e rezultateve që t'i marrë rezultatet në mënyrë asinkrone. I zbatueshëm vetëm kur përdoret metoda e gjenerimit asinkron. N/A N/A
errorListener Cakton një dëgjues gabimi opsional. N/A N/A

Nxitje multimodale

API-të Android të LLM Inference API mbështesin nxitjen multimodale me modele që pranojnë hyrje teksti, imazhi dhe audio. Me multimodalitetin e aktivizuar, përdoruesit mund të përfshijnë një kombinim imazhesh dhe teksti ose audio dhe teksti në nxitjet e tyre. LLM më pas ofron një përgjigje me tekst.

Për të filluar, përdorni një variant të Gemma 3n të pajtueshëm me MediaPipe:

Për më shumë informacion, shihni dokumentacionin e Gemma-3n .

Ndiqni hapat më poshtë për të aktivizuar hyrjen e imazhit ose audios për LLM Inference API.

Futja e imazhit

Për të ofruar imazhe brenda një njoftimi, konvertoni imazhet ose kornizat hyrëse në një objekt com.google.mediapipe.framework.image.MPImage përpara se ta kaloni atë në API-n LLM Inference:

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()

Për të aktivizuar mbështetjen e vizionit për API-n LLM Inference, caktoni opsionin e konfigurimit EnableVisionModalitytrue brenda opsioneve të Graph:

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    ...
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

Vendosni një maksimum prej 10 imazhesh për seancë.

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(10)
  .build();

Më poshtë është një shembull i implementimit të API-t LLM Inference të konfiguruar për të trajtuar të dhënat hyrëse të vizionit dhe tekstit:

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();
}

Hyrja audio

Aktivizo mbështetjen audio në LlmInferenceOptions

val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
  ...
  .setAudioModelOptions(AudioModelOptions.builder().build())
  .build()

Aktivizo mbështetjen audio në sessionOptions

    val sessionOptions =  LlmInferenceSessionOptions.builder()
      ...
      .setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
      .build()

Dërgo të dhëna audio gjatë nxjerrjes së përfundimit. Shënim: Audioja duhet të jetë në formatin mono kanal si .wav


val audioData: ByteArray = ...
inferenceEngine.llmInferenceSession.addAudio(audioData)

Më poshtë është një shembull implementimi i API-t LLM Inference të konfiguruar për të trajtuar hyrjet audio dhe tekst:

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()
  }
}

Përshtatje e LoRA-s

API-ja e Inferencës LLM mbështet akordimin LoRA (Përshtatje me Rang të Ulët) duke përdorur bibliotekën PEFT (Akordim i Fine-Efiktiv i Parametrave). Akordimi LoRA personalizon sjelljen e LLM-ve përmes një procesi trajnimi me kosto efektive, duke krijuar një grup të vogël peshash të trajnueshme bazuar në të dhëna të reja trajnimi në vend që të ritrajnojë të gjithë modelin.

API-ja LLM Inference mbështet shtimin e peshave LoRA në shtresat e vëmendjes së modeleve Gemma-2 2B , Gemma 2B dhe Phi-2 . Shkarkoni modelin në formatin safetensors .

Modeli bazë duhet të jetë në formatin safetensors për të krijuar pesha LoRA. Pas trajnimit LoRA, mund t'i konvertoni modelet në formatin FlatBuffers për t'u ekzekutuar në MediaPipe.

Përgatitni peshat LoRA

Përdorni udhëzuesin e Metodave LoRA nga PEFT për të trajnuar një model LoRA të përshtatur imët në të dhënat tuaja.

API-ja LLM Inference mbështet LoRA vetëm në shtresat e vëmendjes, prandaj specifikoni vetëm shtresat e vëmendjes në 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"],
)

Pas trajnimit në të dhënat e përgatitura dhe ruajtjes së modelit, peshat e modelit LoRA të rregulluara me imtësi janë të disponueshme në adapter_model.safetensors . Skedari safetensors është pika e kontrollit LoRA e përdorur gjatë konvertimit të modelit.

Konvertimi i modelit

Përdorni paketën MediaPipe Python për të konvertuar peshat e modelit në formatin Flatbuffer. ConversionConfig specifikon opsionet e modelit bazë së bashku me opsionet shtesë 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)

Konvertuesi do të prodhojë dy skedarë Flatbuffer, një për modelin bazë dhe një tjetër për modelin LoRA.

Përfundimi i modelit LoRA

Android mbështet LoRA statike gjatë inicializimit. Për të ngarkuar një model LoRA, specifikoni shtegun e modelit LoRA si dhe LLM-në bazë.

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

Për të ekzekutuar inferencën LLM me LoRA, përdorni të njëjtat metoda generateResponse() ose generateResponseAsync() si modeli bazë.