Przewodnik po wnioskowaniu LLM dla iOS

Interfejs LLM Inference API umożliwia uruchamianie dużych modeli językowych (LLM) w całości na urządzeniu w przypadku aplikacji na iOS. Możesz go używać do wykonywania wielu różnych zadań, takich jak generowanie tekstu, wyszukiwanie informacji w formie języka naturalnego i podsumowywanie dokumentów. Zadanie ma wbudowaną obsługę wielu dużych modeli językowych typu tekst na tekst, dzięki czemu możesz stosować w aplikacjach na iOS najnowsze modele generatywnej AI na urządzeniu.

Aby szybko dodać interfejs LLM Inference API do aplikacji na iOS, przeczytaj Krótkie wprowadzenie. Podstawowy przykład aplikacji na iOS korzystającej z interfejsu LLM Inference API znajdziesz w przykładowej aplikacji. Aby lepiej zrozumieć, jak działa interfejs LLM Inference API, zapoznaj się z sekcjami opcje konfiguracji, konwersja modeludostrajanie LoRA.

Możesz zobaczyć to zadanie w akcji w demonstracji MediaPipe Studio. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w tym artykule.

Krótkie wprowadzenie

Aby dodać interfejs LLM Inference API do aplikacji na iOS, wykonaj te czynności. Interfejs LLM Inference API korzysta z biblioteki MediaPipeTasksGenai, którą należy zainstalować za pomocą CocoaPods. Biblioteka jest zgodna z aplikacjami w językach Swift i Objective-C i nie wymaga dodatkowej konfiguracji specyficznej dla danego języka.

Instrukcje instalowania CocoaPods na macOS znajdziesz w przewodniku instalacji CocoaPods. Instrukcje tworzenia pliku Podfile z niezbędnymi podami dla aplikacji znajdziesz w artykule Korzystanie z CocoaPods.

Dodawanie zależności

Dodaj komponent MediaPipeTasksGenai do komponentu Podfile za pomocą tego kodu:

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

Jeśli Twoja aplikacja zawiera cele testów jednostkowych, w przewodniku po konfiguracji na iOS znajdziesz dodatkowe informacje o konfigurowaniu Podfile.

Pobieranie modelu

Pobierz model Gemma-2 2B w 8-bitowym formacie skwantyzowanym z Kaggle Models. Więcej informacji o dostępnych modelach znajdziesz w dokumentacji dotyczącej modeli.

Dodaj model do katalogu projektu za pomocą Xcode. Instrukcje dodawania plików do projektu Xcode znajdziesz w artykule Zarządzanie plikami i folderami w projekcie Xcode.

Inicjowanie zadania

Zainicjuj zadanie za pomocą podstawowych opcji konfiguracji:

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)

Uruchamianie zadania

Użyj metody generateResponse(inputText:), aby wygenerować odpowiedź tekstową. W ten sposób powstaje jedna wygenerowana odpowiedź.

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

Aby przesyłać odpowiedź strumieniowo, użyj metody generateResponseAsync(inputText:).

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

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

Przykładowa aplikacja

Przykładowa aplikacja to podstawowa aplikacja do generowania tekstu na iOS, która korzysta z interfejsu LLM Inference API. Możesz użyć tej aplikacji jako punktu wyjścia do utworzenia własnej aplikacji na iOS lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod jest hostowany w GitHub.

Sklonuj repozytorium Git za pomocą tego polecenia:

git clone https://github.com/google-ai-edge/mediapipe-samples

Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt do iOS Studio i uruchomić aplikację. Więcej informacji znajdziesz w przewodniku po konfiguracji na iOS.

Opcje konfiguracji

Aby skonfigurować aplikację na iOS, użyj tych opcji:

Nazwa opcji Opis Zakres wartości Wartość domyślna
modelPath Ścieżka do miejsca, w którym model jest przechowywany w katalogu projektu. PATH Nie dotyczy
maxTokens Maksymalna liczba tokenów (tokenów wejściowych i wyjściowych), które obsługuje model. Liczba całkowita 512
topk Liczba tokenów, które model bierze pod uwagę na każdym etapie generowania. Ogranicza prognozy do k najbardziej prawdopodobnych tokenów. Liczba całkowita 40
temperature Wielkość losowości wprowadzanej podczas generowania. Wyższa temperatura zapewnia większą kreatywność generowanego tekstu, a niższa – bardziej przewidywalne generowanie. Liczba zmiennoprzecinkowa 0,8
randomSeed Losowy klucz używany podczas generowania tekstu. Liczba całkowita 0
loraPath Ścieżka bezwzględna do modelu LoRA na urządzeniu. Uwaga: ta opcja jest zgodna tylko z modelami GPU. PATH Nie dotyczy

Konwersja modelu

Interfejs LLM Inference API jest zgodny z tymi typami modeli, z których niektóre wymagają konwersji. W tabeli znajdziesz wymagane kroki i metody dla swojego modelu.

Modele Metoda konwersji Zgodne platformy Typ pliku
Gemma-3 1B Nie jest wymagana Android, internet .task
Gemma 2B, Gemma 7B, Gemma-2 2B Nie jest wymagana Android, iOS, internet .bin
Phi-2, StableLM, Falcon Skrypt konwersji MediaPipe Android, iOS, internet .bin
Wszystkie modele LLM PyTorch Biblioteka generatywna LiteRT Torch Android, iOS .task

Więcej informacji o tym, jak przekonwertować inne modele, znajdziesz w sekcji Konwersja modelu.

Dostosowywanie LoRA

Interfejs LLM Inference API obsługuje dostrajanie LoRA (Low-Rank Adaptation) za pomocą biblioteki PEFT (Parameter-Efficient Fine-Tuning). Dostrajanie LoRA dostosowuje zachowanie dużych modeli językowych za pomocą ekonomicznego procesu trenowania, który tworzy mały zestaw wag podlegających trenowaniu na podstawie nowych danych treningowych, zamiast ponownie trenować cały model.

Interfejs LLM Inference API obsługuje dodawanie wag LoRA do warstw uwagi modeli Gemma-2 2B, Gemma 2BPhi-2. Pobierz model w formacie safetensors.

Aby utworzyć wagi LoRA, model podstawowy musi być w formacie safetensors. Po wytrenowaniu modelu LoRA możesz przekonwertować go do formatu FlatBuffers, aby uruchomić go w MediaPipe.

Przygotowywanie wag LoRA

Skorzystaj z przewodnika LoRA Methods z biblioteki PEFT, aby wytrenować dostrojony model LoRA na własnym zbiorze danych.

Interfejs LLM Inference API obsługuje LoRA tylko w przypadku warstw uwagi, więc w parametrze LoraConfig podaj tylko warstwy uwagi:

# 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"],
)

Po wytrenowaniu modelu na przygotowanym zbiorze danych i zapisaniu modelu dostrojone wagi modelu LoRA są dostępne w adapter_model.safetensors. Plik safetensors to punkt kontrolny LoRA używany podczas konwersji modelu.

Konwersja modelu

Użyj pakietu MediaPipe Python, aby przekonwertować wagi modelu na format Flatbuffer. Symbol ConversionConfig określa opcje modelu podstawowego wraz z dodatkowymi opcjami 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)

Konwerter utworzy 2 pliki Flatbuffer: jeden dla modelu podstawowego, a drugi dla modelu LoRA.

Wnioskowanie na podstawie modelu LoRA

iOS obsługuje statyczne LoRA podczas inicjowania. Aby wczytać model LoRA, podaj ścieżkę do modelu LoRA oraz podstawowy LLM.

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)

Aby uruchomić wnioskowanie LLM za pomocą LoRA, użyj tych samych metod generateResponse() lub generateResponseAsync() co w przypadku modelu podstawowego.