L'API LLM Inference ti consente di eseguire modelli linguistici di grandi dimensioni (LLM) completamente on-device per le applicazioni iOS, che puoi utilizzare per svolgere un'ampia gamma di attività, come la generazione di testo, il recupero di informazioni in forma di linguaggio naturale e il riepilogo dei documenti. L'attività fornisce il supporto integrato per più modelli linguistici di grandi dimensioni di conversione da testo a testo, in modo da poter applicare i modelli di AI generativa on-device più recenti alle tue app per iOS.
L'attività supporta le seguenti varianti di Gemma: Gemma-2 2B, Gemma 2B e Gemma 7B. Gemma è una famiglia di modelli aperti leggeri e all'avanguardia creati sulla base della stessa ricerca e tecnologia utilizzata per creare i modelli Gemini. Supporta inoltre i seguenti modelli esterni: Phi-2, Falcon-RW-1B e StableLM-3B.
Oltre ai modelli supportati, gli utenti possono utilizzare AI Edge
Torch di Google per esportare i modelli PyTorch
in modelli LiteRT (tflite
) con più firme, che sono raggruppati con
i parametri del tokenizzatore per creare pacchetti di attività compatibili con l'API LLM
Inference.
Puoi vedere questa operazione in azione con la demo di MediaPipe Studio. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio di MediaPipe Tasks è un'implementazione di base di un'app API di inferenza LLM per iOS. Puoi utilizzare l'app come punto di partenza per la tua app per iOS o farvi riferimento quando modifichi un'app esistente. Il codice di esempio dell'API LLM Inference è ospitato su GitHub.
Scarica il codice
Le istruzioni riportate di seguito mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
Clona il repository Git utilizzando il seguente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
Se vuoi, configura l'istanza Git in modo da utilizzare il controllo sparse, in modo da avere solo i file per l'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 la libreria di attività MediaPipe, aprire il progetto utilizzando Xcode ed eseguire l'app. Per le istruzioni, consulta la Guida alla configurazione per iOS.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice per utilizzare l'API LLM Inference. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della 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 libreria è compatibile con le app Swift e Objective-C
e non richiede alcuna configurazione aggiuntiva specifica per il linguaggio.
Per istruzioni su come installare CocoaPods su macOS, consulta la guida all'installazione di CocoaPods.
Per istruzioni su come creare un Podfile
con i pod necessari per la tua app, consulta Utilizzare 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 di test di unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione del tuo Podfile
.
Modello
L'attività dell'API MediaPipe LLM Inference richiede un modello addestrato compatibile con questa attività. Per saperne di più sui modelli addestrati disponibili per l'API LLM Inference, consulta la sezione Modelli della panoramica dell'attività.
Scaricare un modello
Scarica un modello e aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta Gestire file e cartelle nel progetto Xcode.
Prima di inizializzare l'API di inferenza LLM, scarica uno dei modelli supportati e memorizza il file nella directory del progetto:
- Gemma-2 2B: la versione più recente della famiglia di modelli Gemma. Fa parte di una famiglia di modelli aperti leggeri e all'avanguardia creati sulla base della stessa ricerca e tecnologia utilizzata per creare i modelli Gemini.
- Gemma 2B: appartiene a una famiglia di modelli aperti leggeri e all'avanguardia creati sulla base della stessa ricerca e tecnologia utilizzata per creare i modelli Gemini. Molto adatto per una serie di attività di generazione di testo, tra cui risposta a domande, riassunto e ragionamento.
- Phi-2: modello Transformer con 2, 7 miliardi di parametri, più adatto per il formato di domande e risposte, chat e codice.
- Falcon-RW-1B: modello causale solo decoder con 1 miliardo di parametri addestrato su 350 miliardi di token di RefinedWeb.
- StableLM-3B: modello linguistico solo decodificatore con 3 miliardi di parametri preaddestrato su 1 triliardo di token di diversi set di dati di codice e in inglese.
Oltre ai modelli supportati, puoi utilizzare AI Edge
Torch di Google per esportare i modelli PyTorch
in modelli LiteRT (tflite
) con più firme. Per ulteriori informazioni, consulta
Torch Generative Converter per i modelli PyTorch.
Ti consigliamo di utilizzare Gemma-2 2B, disponibile su Kaggle Models. Per ulteriori informazioni sugli altri modelli disponibili, consulta la panoramica dell'attività sezione Modelli.
Converti il modello in formato MediaPipe
L'API LLM Inference è compatibile con due tipi di categorie di modelli, alcuni dei quali richiedono la conversione del modello. Utilizza la tabella per identificare il metodo di procedura richiesto per il tuo modello.
Modelli | Metodo di conversione | Piattaforme compatibili | Tipo di file | |
---|---|---|---|---|
Modelli supportati | Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon | MediaPipe | Android, iOS, web | .bin |
Altri modelli PyTorch | Tutti i modelli LLM di PyTorch | Libreria Torch Generative di AI Edge | Android, iOS | .task |
Stiamo ospitando i file .bin
convertiti per Gemma 2B, Gemma 7B e Gemma-2 2B su Kaggle. Questi modelli possono essere implementati direttamente utilizzando la nostra API di inferenza LLM. Per scoprire come convertire altri modelli, consulta la sezione Conversione di modelli.
Crea l'attività
Puoi creare l'attività dell'API LLM Inference chiamando uno dei relativi inizializzatori. L'inizializzatore
LlmInference(options:)
imposta i valori per le opzioni di configurazione.
Se non hai bisogno di un'API LLM Inference inizializzata con opzioni di configurazione personalizzate, puoi utilizzare l'inizializzatore LlmInference(modelPath:)
per creare un'API LLM Inference con le opzioni predefinite. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.
Il codice seguente mostra 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à offre le seguenti opzioni di configurazione per le app per iOS:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
modelPath |
Il percorso in cui è archiviato il 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 fase di generazione. Limita le previsioni ai token più probabili tra i primi k. | Numero intero | 40 |
temperature |
La quantità di casualità introdotta durante la generazione. Una temperatura più alta consente di ottenere un testo generato più creativo, mentre una temperatura più bassa produce una generazione più prevedibile. | Float | 0,8 |
randomSeed |
Il seed casuale utilizzato durante la generazione del testo. | Numero intero | 0 |
loraPath |
Il percorso assoluto del modello LoRA localmente sul dispositivo. Nota: questa opzione è compatibile solo con i modelli GPU. | PERCORSO | N/D |
Preparazione dei dati
L'API di inferenza LLM funziona con i dati di testo. L'attività gestisce la preelaborazione dei dati di input, inclusa la tokenizzazione e la preelaborazione dei tensori.
Tutta la pre-elaborazione viene gestita all'interno della funzione generateResponse(inputText:)
.
Non è necessaria un'ulteriore preelaborazione del testo inserito.
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:)
. 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 streaming, 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 il testo della risposta generata.
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 di Mediapipe può essere configurata per supportare l'adattamento a basso ranking (LoRA) per i modelli linguistici di grandi dimensioni. Utilizzando modelli LoRA ottimizzati, gli sviluppatori possono personalizzare il comportamento degli LLM tramite un processo di addestramento conveniente.
Il supporto LoRA dell'API LLM Inference funziona per tutte le varianti di Gemma e per i modelli Phi-2 per il backend GPU, con i pesi LoRA applicabili solo ai livelli di attenzione. Questa implementazione iniziale funge da API sperimentale per sviluppi futuri, con piani per supportare più modelli e vari tipi di livelli nei prossimi aggiornamenti.
Prepara i modelli LoRA
Segui le istruzioni su HuggingFace per addestrare un modello LoRA ottimizzato sul tuo set di dati con i tipi di modelli supportati, Gemma o Phi-2. I modelli Gemma-2 2B, Gemma
2B e
Phi-2 sono entrambi disponibili su
HuggingFace nel formato safetensors. Poiché l'API LLM Inference supporta solo LoRA nei livelli di attenzione, specifica solo i livelli di attenzione durante la creazione di LoraConfig
come segue:
# 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"],
)
Per i test, sono disponibili modelli LoRA ottimizzati e accessibili al pubblico che si adattano all'API di inferenza LLM su HuggingFace. 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 perfezionato.
Il file safetensors è il checkpoint LoRA utilizzato nella conversione del modello.
Come passaggio successivo, devi convertire i pesi del modello in un Flatbuffer di TensorFlow Lite utilizzando il pacchetto Python MediaPipe. ConversionConfig
deve specificare le opzioni del modello di base e altre opzioni LoRa. Tieni presente che, poiché l'API supporta l'inferenza LoRa solo 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 produrrà 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 è stata aggiornata per supportare l'inferenza del modello LoRA.
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.