Guida all'inferenza LLM per iOS

di Gemini Advanced.

L'API LLM Inference consente di eseguire modelli linguistici di grandi dimensioni (LLM) completamente sul dispositivo per le applicazioni iOS, che puoi usare per svolgere una vasta gamma di attività, come generazione di testo, recupero di informazioni in formato di linguaggio naturale e riassumere documenti. L'attività fornisce supporto integrato per modelli linguistici di grandi dimensioni (LLM) da testo a testo, in modo da poter applicare i più recenti modelli di IA generativa alle tue app per iOS.

Puoi vedere questa attività in azione con MediaPipe Studio una demo. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio relativo alle attività di MediaPipe è un'implementazione di base di un'API di inferenza LLM per iOS. Puoi utilizzare l'app come punto di partenza per la tua app per iOS oppure farvi riferimento quando modifichi un'app esistente. L'esempio di codice dell'API LLM Inference è ospitato su GitHub.

Scarica il codice

Le seguenti istruzioni mostrano come creare una copia locale dell'esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il comando seguente:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura la tua istanza Git per l'utilizzo di un pagamento sparso, in modo da avere solo i file dell'app di esempio dell'API LLM Inference:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/ios/
    

Dopo aver creato una versione locale del codice di esempio, puoi installare nella libreria di attività MediaPipe, apri il progetto con Xcode ed esegui l'app. Per istruzioni, vedi la Guida alla configurazione per iOS.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare l'API LLM Inference. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'uso di attività MediaPipe, inclusa la versione della piattaforma consulta la Guida alla configurazione per iOS.

Dipendenze

L'API LLM Inference utilizza la libreria MediaPipeTasksGenai, che deve essere installata utilizzando CocoaPods. La raccolta è compatibile con le app Swift e Objective-C e non richiede alcuna configurazione aggiuntiva specifica per la lingua.

Per istruzioni su come installare CocoaPods su macOS, consulta l'articolo CocoaPods Guida all'installazione. Per istruzioni su come creare un elemento Podfile con i pod necessari per il tuo consulta la sezione Utilizzo CocoaPods.

Aggiungi il pod MediaPipeTasksGenai in Podfile utilizzando il seguente codice:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

Se la tua app include target dei test delle unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione il tuo Podfile.

Modello

L'attività dell'API Inference LLM MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Per l'API LLM Inference, consulta la sezione Modelli della panoramica delle attività.

Scarica un modello

Scarica un modello e aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta Gestire i file e cartelle in Xcode progetto.

Scarica Gemma 2B .

Quando crei app per iOS, utilizza una delle seguenti varianti:

  • gemma-2b-it-cpu-int4: Modello Gemma a 4 bit con compatibilità della CPU.
  • gemma-2b-it-gpu-int4: Modello Gemma a 4 bit con compatibilità GPU.
  • Modelli mappati AI Edge Torch che sono conformi ai requisiti di memoria di iOS.

Per saperne di più su altri modelli, consulta la panoramica delle attività Modelli .

Crea l'attività

Puoi creare l'attività dell'API Inference LLM chiamando uno dei suoi inizializzatori. La L'inizializzazione di LlmInference(options:) imposta i valori per le opzioni di configurazione.

Se non hai bisogno di un'API Inference LLM inizializzata con una configurazione personalizzata puoi usare l'inizializzatore LlmInference(modelPath:) per creare un l'API LLM Inference con le opzioni predefinite. Per ulteriori informazioni sulla configurazione vedi Panoramica della configurazione.

Il codice seguente illustra come creare e configurare questa attività.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let LlmInference = try LlmInference(options: options)

Opzioni di configurazione

Questa attività include le seguenti opzioni di configurazione per le app per iOS:

Nome opzione Descrizione Intervallo di valori Valore predefinito
modelPath Il percorso di archiviazione del modello all'interno della directory del progetto. PERCORSO N/D
maxTokens Il numero massimo di token (token di input + token di output) gestiti dal modello. Numero intero 512
topk Il numero di token presi in considerazione dal modello in ogni passaggio della generazione. Limita le previsioni ai token top-k più probabili. Numero intero 40
temperature La quantità di casualità introdotta durante la generazione. Un della temperatura aumenta la creatività del testo generato, mentre una temperatura più bassa genera una generazione più prevedibile. Float 0,8
randomSeed Il seed casuale utilizzato durante la generazione del testo. Numero intero 0
loraPath Il percorso assoluto al modello LoRA localmente sul dispositivo. Nota: è compatibile solo con i modelli di GPU. PERCORSO N/D

Preparazione dei dati

L'API LLM Inference funziona con i dati di testo. L'attività gestisce l'input dei dati pre-elaborazione, tra cui la tokenizzazione e la pre-elaborazione dei tensori.

Tutte le pre-elaborazioni vengono gestite all'interno della funzione generateResponse(inputText:). Non è necessaria un'ulteriore pre-elaborazione del testo di input in anticipo.

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

Esegui l'attività

Per eseguire l'API LLM Inference, utilizza il metodo generateResponse(inputText:). La L'API LLM Inference restituisce le possibili categorie per il testo di input.

let result = try LlmInference.generateResponse(inputText: inputPrompt)

Per trasmettere la risposta in modalità flusso, utilizza il metodo generateResponseAsync(inputText:).

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

Gestire e visualizzare i risultati

L'API LLM Inference restituisce un valore LlmInferenceResult, che include i valori generati testo della risposta.

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]

Personalizzazione del modello LoRA

L'API di inferenza LLM Mediapipe può essere configurata per supportare l'adattamento basso ranking (LoRA) per gli LLM. Utilizzando modelli LoRA perfezionati, gli sviluppatori possono personalizzare il comportamento degli LLM attraverso un processo di addestramento conveniente.

Il supporto LoRA dell'API LLM Inference funziona per i modelli Gemma-2B e Phi-2 per il backend GPU, con pesi LoRA applicabili solo ai livelli di attenzione. Questo l'implementazione iniziale funge da API sperimentale per gli sviluppi futuri e prevediamo di supportare più modelli e vari tipi di strati nel prossimo aggiornamenti.

prepara i modelli LoRA

Segui le istruzioni su HuggingFace per addestrare un modello LoRA ottimizzato sul tuo set di dati con tipi di modelli supportati, Gemma-2B o Phi-2. I modelli Gemma-2B e Phi-2 sono entrambi disponibili su HuggingFace in formato securetensors. Poiché l'API LLM Inference supporta solo LoRA sui livelli di attenzione, specifica solo i livelli di attenzione durante la creazione di LoraConfig come segue:

# For Gemma-2B
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"],
)

Per i test, su HuggingFace sono disponibili modelli LoRA ottimizzati e accessibili pubblicamente che si adattano all'API Inference LLM. Ad esempio, monsterapi/gemma-2b-lora-maths-orca-200k per Gemma-2B e lole25/phi-2-sft-ultrachat-lora per Phi-2.

Dopo l'addestramento sul set di dati preparato e il salvataggio del modello, ottieni un file adapter_model.safetensors contenente i pesi del modello LoRA ottimizzati. Il file securetensors è il checkpoint LoRA utilizzato nella conversione del modello.

Come passaggio successivo, devi convertire i pesi del modello in un Flatbuffer TensorFlow Lite utilizzando il pacchetto Python MediaPipe. ConversionConfig deve specificare le opzioni del modello di base e ulteriori opzioni LoRA. Tieni presente che poiché l'API supporta solo l'inferenza LoRA con GPU, il backend deve essere impostato su '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)

Il convertitore restituirà due file flatbuffer TFLite, uno per il modello di base e l'altro per il modello LoRA.

Inferenza del modello LoRA

L'API di inferenza LLM per web, Android e iOS viene aggiornata per supportare l'inferenza del modello LoRA. Il web supporta LoRA dinamico, che può cambiare modelli LoRA diversi durante il runtime. Android e iOS supportano LoRA statico, che utilizza gli stessi pesi LoRA per tutta la durata dell'attività.

iOS supporta LoRA statico durante l'inizializzazione. Per caricare un modello LoRA, gli utenti devono specificare il percorso del modello LoRA e l'LLM di base.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let LlmInference = try LlmInference(options: options)

Per eseguire l'inferenza LLM con LoRA, utilizza gli stessi metodi generateResponse() o generateResponseAsync() del modello di base.