Interfejs LLM Inference API umożliwia uruchamianie dużych modeli językowych (LLM) całkowicie na urządzeniu w przypadku aplikacji na Androida. Możesz go używać do wykonywania wielu zadań, takich jak generowanie tekstu, pobieranie informacji w formie naturalnego języka czy streszczanie dokumentów. Zadanie zapewnia wbudowane wsparcie dla wielu dużych modeli językowych do konwersji tekstu na tekst, dzięki czemu możesz stosować najnowsze modele generatywnej AI na urządzeniu w swoich aplikacjach na Androida.
Zadanie obsługuje te warianty Gemma: Gemma-2 2B, Gemma 2B i Gemma 7B. Gemma to rodzina lekkich, najnowocześniejszych otwartych modeli opartych na tych samych badaniach i technologiach, które posłużyły do utworzenia modeli Gemini. Obsługuje też te modele zewnętrzne: Phi-2, Falcon-RW-1B i StableLM-3B.
Oprócz obsługiwanych modeli użytkownicy mogą używać AI Edge
Torch Google do eksportowania modeli PyTorch do modeli LiteRT (tflite
) z wieloma podpisami, które są dostarczane z parametrami tokenizera w celu utworzenia pakietów zadań zgodnych z interfejsem LLM
Inference API.
Możesz zobaczyć to zadanie w działaniu w demonstracji MediaPipe Studio. Więcej informacji o możliwościach, modelach i opcjach konfiguracji związanych z tym zadaniem znajdziesz w sekcji Omówienie.
Przykładowy kod
Ten przewodnik odnosi się do przykładowej podstawowej aplikacji do generowania tekstu na Androida. Możesz użyć tej aplikacji jako punktu wyjścia do tworzenia własnej aplikacji na Androida lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod jest hostowany na GitHub.
Pobieranie kodu
Z tych instrukcji dowiesz się, jak utworzyć lokalną kopię przykładowego kodu za pomocą narzędzia wiersza poleceń git.
Aby pobrać przykładowy kod:
- Sklonuj repozytorium Git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Opcjonalnie skonfiguruj instancję git, aby używać rzadkiego sprawdzania, dzięki czemu będziesz mieć tylko pliki przykładowej aplikacji LLM Inference API:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/llm_inference/android
Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt do Android Studio i uruchomić aplikację. Instrukcje znajdziesz w przewodniku konfiguracji Androida.
Konfiguracja
W tej sekcji opisano kluczowe kroki konfigurowania środowiska programistycznego i projektów kodu w celu używania interfejsu LLM Inference API. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku konfiguracji na Androida.
Zależności
Interfejs LLM Inference API korzysta z biblioteki com.google.mediapipe:tasks-genai
. Dodaj ten element zależny do pliku build.gradle
aplikacji na Androida:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}
W przypadku urządzeń z Androidem 12 (poziom API 31) lub nowszym dodaj zależność od natywnej biblioteki OpenCL. Więcej informacji znajdziesz w dokumentacji dotyczącej tagu uses-native-library
.
Dodaj do pliku AndroidManifest.xml
te tagi uses-native-library
:
<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>
Model
Interfejs API MediaPipe LLM Inference wymaga przetrenowanej modelu językowego tekst-tekst, który jest zgodny z tym zadaniem. Po pobraniu modelu zainstaluj wymagane zależności i prześlij model na urządzenie z Androidem. Jeśli używasz modelu innego niż Gemma, musisz przekonwertować go do formatu zgodnego z MediaPipe.
Więcej informacji o dostępnych wytrenowanych modelach interfejsu LLM Inference API znajdziesz w sekcji Modele w omówieniu zadania.
Pobieranie modelu
Przed zainicjowaniem interfejsu LLM Inference API pobierz jedną z obsługiwanych przez niego wersji modelu i zapisz plik w katalogu projektu:
- Gemma-2 2B: najnowsza wersja modeli z rodziny Gemma. Należy do rodziny lekkich, najnowocześniejszych otwartych modeli opartych na tych samych badaniach i technologiach, które posłużyły do utworzenia modeli Gemini.
- Gemma 2B: należy do rodziny lekkich, najnowocześniejszych otwartych modeli opartych na tych samych badaniach i technologiach, które posłużyły do utworzenia modeli Gemini. Model ten dobrze sprawdza się w różnych zadaniach związanych z generowaniem tekstu, takich jak odpowiadanie na pytania, podsumowywanie i rozumowanie.
- Phi-2: model Transformer z 2, 7 miliardami parametrów, najlepiej nadający się do formatu pytania i odpowiedzi, czatu i kodu.
- Falcon-RW-1B: model z 1 mld parametrów, który jest dekoderem przyczynowym wytrenowanym na 350 mld tokenów z RefinedWeb.
- StableLM-3B: model językowy z 3 mld parametrów, który jest dekoderem i został wstępnie wytrenowany na 1 trylionie tokenów z różnych zbiorów danych z tekstem i kodem w języku angielskim.
Oprócz obsługiwanych modeli możesz też używać AI Edge Torch od Google do eksportowania modeli PyTorch do modeli LiteRT (tflite
) z wieloma podpisami. Więcej informacji znajdziesz w artykule Konwerter Torch Generative na potrzeby modeli PyTorch.
Zalecamy użycie Gemma-2 2B, która jest dostępna na Kaggle w sekcji Modele. Więcej informacji o dostępnych modelach znajdziesz w sekcji Modele w omówieniu zadania.
Konwertowanie modelu na format MediaPipe
Interfejs LLM Inference API jest zgodny z 2 kategoriami modeli, z których niektóre wymagają konwersji modelu. Korzystając z tabeli, określ wymagane kroki i metodę dla swojego modelu.
Modele | Metoda konwersji | Zgodne platformy | Typ pliku | |
---|---|---|---|---|
Obsługiwane modele | Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon | MediaPipe | Android, iOS, internet | .bin |
Inne modele PyTorch | Wszystkie modele LLM PyTorch | Biblioteka generatywnej AI Edge Torch | Android, iOS | .task |
Konwertowane pliki .bin
dotyczące Gemma 2B, Gemma 7B i Gemma-2 2B są dostępne na Kaggle. Te modele można wdrażać bezpośrednio za pomocą naszego interfejsu LLM Inference API. Aby dowiedzieć się, jak konwertować inne modele, zapoznaj się z sekcją Konwersja modelu.
Przesyłanie modelu na urządzenie
Przekaż zawartość folderu output_path na urządzenie z Androidem.
$ 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.bin
Tworzenie zadania
Interfejs MediaPipe LLM Inference API używa funkcji createFromOptions()
do konfigurowania zadania. Funkcja createFromOptions()
przyjmuje wartości opcji konfiguracji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.
Ten kod inicjuje zadanie za pomocą podstawowych opcji konfiguracji:
// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPATH('/data/local/.../')
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
Opcje konfiguracji
Aby skonfigurować aplikację na Androida, użyj tych opcji konfiguracji:
Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
---|---|---|---|
modelPath |
Ścieżka do miejsca przechowywania modelu w katalogu projektu. | ŚCIEŻKA | Nie dotyczy |
maxTokens |
Maksymalna liczba tokenów (tokenów wejściowych + tokenów wyjściowych), którą obsługuje model. | Liczba całkowita | 512 |
topK |
Liczba tokenów uwzględnianych przez model na każdym etapie generowania. Ogranicza prognozy do k najbardziej prawdopodobnych tokenów. | Liczba całkowita | 40 |
temperature |
Ilość losowości wprowadzonej podczas generowania. Wyższa temperatura powoduje większą kreatywność wygenerowanego tekstu, a niższa – bardziej przewidywalne generowanie. | Liczba zmiennoprzecinkowa | 0,8 |
randomSeed |
Losowe nasiono użyte podczas generowania tekstu. | Liczba całkowita | 0 |
loraPath |
Ścieżka bezwzględna do modelu LoRa na urządzeniu. Uwaga: ta funkcja jest zgodna tylko z modelami GPU. | ŚCIEŻKA | Nie dotyczy |
resultListener |
Ustawia odbiornik wyników na odbiór wyników asynchronicznie. Dotyczy tylko metody generowania asynchronicznego. | Nie dotyczy | Nie dotyczy |
errorListener |
Ustawia opcjonalny odbiornik błędów. | Nie dotyczy | Nie dotyczy |
Przygotuj dane
Interfejs LLM Inference API akceptuje te dane wejściowe:
- prompt (string): pytanie lub prompt.
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
Uruchamianie zadania
Użyj metody generateResponse()
, aby wygenerować odpowiedź tekstową na tekst wejściowy podany w poprzedniej sekcji (inputPrompt
). Spowoduje to wygenerowanie jednej odpowiedzi.
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")
Aby przesyłać odpowiedź strumieniowo, użyj metody generateResponseAsync()
.
val options = LlmInference.LlmInferenceOptions.builder()
...
.setResultListener { partialResult, done ->
logger.atInfo().log("partial result: $partialResult")
}
.build()
llmInference.generateResponseAsync(inputPrompt)
Obsługa i wyświetlanie wyników
Interfejs LLM Inference API zwraca LlmInferenceResult
, który zawiera wygenerowany tekst odpowiedzi.
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]
Dostosowywanie modelu LoRA
Interfejs API Mediapipe do wnioskowania oparte na dużych modelach językowych można skonfigurować tak, aby obsługiwał adaptację niskiego rzędu (LoRA) dla dużych modeli językowych. Dzięki dostosowanym modelom LoRA deweloperzy mogą dostosowywać działanie LLM za pomocą ekonomicznego procesu trenowania.
Obsługa LoRA w LLM Inference API działa we wszystkich wariantach Gemma i modelach Phi-2 w przypadku backendu GPU. Wagi LoRA są stosowane tylko do warstw uwagi. Ta początkowa implementacja jest eksperymentalnym interfejsem API przeznaczonym do przyszłych wersji. W przyszłych aktualizacjach planujemy obsługiwać więcej modeli i różne typy warstw.
Przygotowanie modeli LoRA
Postępuj zgodnie ze wskazówkami na stronie huggingface.org, aby wytrenować dostosowany model LoRA na podstawie własnego zbioru danych za pomocą obsługiwanych typów modeli: Gemma lub Phi-2. Modele Gemma-2 2B, Gemma
2B i Phi-2 są dostępne na stronie huggingface w formacie safetensors. Ponieważ interfejs LLM Inference API obsługuje tylko LoRA na warstwach uwagi, podczas tworzenia modeluLoraConfig
należy określić 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"],
)
Do testowania dostępne są publicznie dostępne modele LoRA, które pasują do interfejsu LLM Inference API dostępnego na HuggingFace. Na przykład: monsterapi/gemma-2b-lora-maths-orca-200k w przypadku Gemma-2B i lole25/phi-2-sft-ultrachat-lora w przypadku Phi-2.
Po wytrenowaniu modelu na przygotowanym zbiorze danych i zapisaniu go otrzymasz plik adapter_model.safetensors
zawierający dostrojone wagi modelu LoRA.
Plik safetensors to punkt kontrolny LoRA używany do konwertowania modelu.
W następnym kroku musisz przekonwertować wagi modelu na Flatbuffera TensorFlow Lite za pomocą pakietu MediaPipe w Pythonie. W polu ConversionConfig
należy podać opcje modelu podstawowego oraz dodatkowe opcje LoRa. Pamiętaj, że interfejs API obsługuje wnioskowanie LoRA tylko z użyciem procesora graficznego, więc backend musi być ustawiony na '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)
Konwerter wygeneruje 2 pliki flatbuffera TFLite: jeden dla modelu podstawowego, a drugi dla modelu LoRA.
Wnioskowanie modelu LoRA
Interfejsy API LLM Inference na potrzeby sieci Web, Androida i iOS zostały zaktualizowane, aby obsługiwać wnioskowanie modelu LoRA.
Android obsługuje statyczny LoRA podczas inicjowania. Aby załadować model LoRA, użytkownicy muszą podać ścieżkę do tego modelu oraz model LLM podstawowy.// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPath('<path to base model>')
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.setLoraPath('<path to LoRA model>')
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
Aby uruchomić wnioskowanie LLM z LoRA, użyj tych samych metod generateResponse()
lub generateResponseAsync()
co w przypadku modelu podstawowego.