L'API LLM Inference vous permet d'exécuter de grands modèles de langage (LLM) entièrement sur l'appareil pour les applications iOS. Vous pouvez l'utiliser pour effectuer un large éventail de tâches, comme générer du texte, récupérer des informations en langage naturel et résumer des documents. La tâche offre une compatibilité intégrée avec plusieurs grands modèles de langage de texte à texte. Vous pouvez ainsi appliquer les derniers modèles d'IA générative sur l'appareil à vos applications iOS.
Pour ajouter rapidement l'API LLM Inference à votre application iOS, suivez le guide de démarrage rapide. Pour obtenir un exemple de base d'application iOS exécutant l'API LLM Inference, consultez l'application exemple. Pour mieux comprendre le fonctionnement de l'API LLM Inference, consultez les sections Options de configuration, Conversion de modèle et Réglage LoRA.
Vous pouvez voir cette tâche en action dans la démonstration MediaPipe Studio. Pour en savoir plus sur les fonctionnalités, les modèles et les options de configuration de cette tâche, consultez la présentation.
Guide de démarrage rapide
Suivez les étapes ci-dessous pour ajouter l'API LLM Inference à votre application iOS.
L'API LLM Inference utilise la bibliothèque MediaPipeTasksGenai, qui doit être installée à l'aide de CocoaPods. La bibliothèque est compatible avec les applications Swift et Objective-C, et ne nécessite aucune configuration supplémentaire spécifique à une langue.
Pour savoir comment installer CocoaPods sur macOS, consultez le guide d'installation de CocoaPods.
Pour savoir comment créer un Podfile avec les pods nécessaires pour votre application, consultez Utiliser CocoaPods.
Ajouter des dépendances
Ajoutez le pod MediaPipeTasksGenai dans le Podfile à l'aide du code suivant :
target 'MyLlmInferenceApp' do
use_frameworks!
pod 'MediaPipeTasksGenAI'
pod 'MediaPipeTasksGenAIC'
end
Si votre application inclut des cibles de tests unitaires, consultez le guide de configuration pour iOS pour en savoir plus sur la configuration de votre Podfile.
Télécharger un modèle
Téléchargez Gemma-2 2B au format quantifié sur 8 bits depuis Kaggle Models. Pour en savoir plus sur les modèles disponibles, consultez la documentation sur les modèles.
Ajoutez le modèle au répertoire de votre projet à l'aide d'Xcode. Pour savoir comment ajouter des fichiers à votre projet Xcode, consultez Gérer les fichiers et les dossiers dans votre projet Xcode.
Initialiser la tâche
Initialisez la tâche avec les options de configuration de base :
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)
Exécuter la tâche
Utilisez la méthode generateResponse(inputText:) pour générer une réponse textuelle. Cela génère une seule réponse.
let result = try LlmInference.generateResponse(inputText: inputPrompt)
Pour diffuser la réponse en streaming, utilisez la méthode generateResponseAsync(inputText:).
let resultStream = LlmInference.generateResponseAsync(inputText: inputPrompt)
do {
for try await partialResult in resultStream {
print("\(partialResult)")
}
print("Done")
}
catch {
print("Response error: '\(error)")
}
Exemple d'application
L'application exemple est une application de génération de texte de base pour iOS, utilisant l'API LLM Inference. Vous pouvez utiliser l'application comme point de départ pour votre propre application iOS ou vous y référer lorsque vous modifiez une application existante. L'exemple de code est hébergé sur GitHub.
Clonez le dépôt Git à l'aide de la commande suivante :
git clone https://github.com/google-ai-edge/mediapipe-samples
Après avoir créé une version locale de l'exemple de code, vous pouvez importer le projet dans iOS Studio et exécuter l'application. Pour en savoir plus, consultez le guide de configuration pour iOS.
Options de configuration
Utilisez les options de configuration suivantes pour configurer une application iOS :
| Nom de l'option | Description | Plage de valeurs | Valeur par défaut |
|---|---|---|---|
modelPath |
Chemin d'accès à l'emplacement où le modèle est stocké dans le répertoire du projet. | CHEMIN | N/A |
maxTokens |
Nombre maximal de jetons (jetons d'entrée + jetons de sortie) gérés par le modèle. | Nombre entier | 512 |
topk |
Nombre de jetons que le modèle prend en compte à chaque étape de la génération. Limite les prédictions aux k jetons les plus probables. | Nombre entier | 40 |
temperature |
Degré d'aléatoire introduit lors de la génération. Une température plus élevée rend le texte généré plus créatif, tandis qu'une température plus basse produit une génération plus prévisible. | Float | 0,8 |
randomSeed |
Source aléatoire utilisée lors de la génération de texte. | Nombre entier | 0 |
loraPath |
Chemin absolu du modèle LoRA localement sur l'appareil. Remarque : Cette fonctionnalité n'est compatible qu'avec les modèles de GPU. | CHEMIN | N/A |
Conversion de modèles
L'API LLM Inference est compatible avec les types de modèles suivants, dont certains nécessitent une conversion. Utilisez le tableau pour identifier la méthode et les étapes requises pour votre modèle.
| Modèles | Méthode de conversion | Plates-formes compatibles | Type de fichier |
|---|---|---|---|
| Gemma-3 1B | Aucune conversion requise | Android, Web | .task |
| Gemma 2B, Gemma 7B, Gemma-2 2B | Aucune conversion requise | Android, iOS, Web | .bin |
| Phi-2, StableLM, Falcon | Script de conversion MediaPipe | Android, iOS, Web | .bin |
| Tous les modèles LLM PyTorch | Bibliothèque LiteRT Torch Generative | Android, iOS | .task |
Pour savoir comment convertir d'autres modèles, consultez la section Conversion de modèles.
Personnalisation LoRA
L'API LLM Inference est compatible avec l'affinage LoRA (Low-Rank Adaptation) à l'aide de la bibliothèque PEFT (Parameter-Efficient Fine-Tuning). L'ajustement LoRA personnalise le comportement des LLM grâce à un processus d'entraînement économique. Il crée un petit ensemble de pondérations entraînables basées sur de nouvelles données d'entraînement au lieu de réentraîner l'ensemble du modèle.
L'API LLM Inference permet d'ajouter des pondérations LoRA aux couches d'attention des modèles Gemma-2 2B, Gemma 2B et Phi-2. Téléchargez le modèle au format safetensors.
Le modèle de base doit être au format safetensors pour que vous puissiez créer des pondérations LoRA. Après l'entraînement LoRA, vous pouvez convertir les modèles au format FlatBuffers pour les exécuter sur MediaPipe.
Préparer les pondérations LoRA
Utilisez le guide Méthodes LoRA de PEFT pour entraîner un modèle LoRA affiné sur votre propre ensemble de données.
L'API LLM Inference n'est compatible qu'avec LoRA sur les couches d'attention. Par conséquent, ne spécifiez que les couches d'attention dans 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"],
)
Après l'entraînement sur l'ensemble de données préparé et l'enregistrement du modèle, les pondérations du modèle LoRA affiné sont disponibles dans adapter_model.safetensors. Le fichier safetensors est le point de contrôle LoRA utilisé lors de la conversion du modèle.
Conversion de modèles
Utilisez le package Python MediaPipe pour convertir les pondérations du modèle au format Flatbuffer. ConversionConfig spécifie les options du modèle de base ainsi que les options LoRA supplémentaires.
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)
Le convertisseur génère deux fichiers Flatbuffer : un pour le modèle de base et un autre pour le modèle LoRA.
Inférence de modèle LoRA
iOS est compatible avec LoRA statique lors de l'initialisation. Pour charger un modèle LoRA, spécifiez le chemin d'accès au modèle LoRA ainsi que le LLM de 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)
Pour exécuter l'inférence LLM avec LoRA, utilisez les mêmes méthodes generateResponse() ou generateResponseAsync() que le modèle de base.