Interfejs LLM Inference API umożliwia uruchamianie dużych modeli językowych (LLM) całkowicie na urządzeniu w przypadku aplikacji internetowych, które można wykorzystać do wykonywania wielu zadań, takich jak generowanie tekstu, pobieranie informacji w formie naturalnego języka czy streszczanie dokumentów. Zadanie to zapewnia wbudowane wsparcie dla wielu dużych modeli językowych typu „tekst na tekst”, dzięki czemu możesz stosować najnowsze modele generatywnej AI na urządzeniu w swoich aplikacjach internetowych.
Aby szybko dodać interfejs LLM Inference API do swojej aplikacji internetowej, postępuj zgodnie z krótkim wprowadzeniem. Przykładową aplikację internetową korzystającą z interfejsu LLM Inference API znajdziesz w pliku przykładowej aplikacji. Więcej informacji o tym, jak działa interfejs LLM Inference API, znajdziesz w sekcjach Opcje konfiguracji, Konwersja modelu i Dostosowywanie modelu LoRa.
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.
Krótkie wprowadzenie
Aby dodać interfejs LLM Inference API do swojej aplikacji internetowej: Interfejs LLM Inference API wymaga przeglądarki internetowej zgodnej z WebGPU. Pełną listę kompatybilnych przeglądarek znajdziesz w sekcji Zgodność przeglądarek z procesorem graficznym.
Dodawanie zależności
Interfejs LLM Inference API korzysta z pakietu @mediapipe/tasks-genai
.
Zainstaluj wymagane pakiety do lokalnego publikowania:
npm install @mediapipe/tasks-genai
Aby wdrożyć na serwerze, użyj usługi sieci dostarczania treści (CDN), takiej jak jsDelivr, aby dodać kod bezpośrednio do strony HTML:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
Pobieranie modelu
Pobierz model Gemma-2 2B w 8-bitowym formacie kwantowanym z Kaggle Models. Więcej informacji o dostępnych modelach znajdziesz w dokumentacji modeli.
Zapisz model w katalogu projektu:
<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin
Określ ścieżkę modelu za pomocą parametru baseOptions
obiektu modelAssetPath
:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}
Inicjowanie zadania
Inicjowanie zadania za pomocą podstawowych opcji konfiguracji:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int8.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
Uruchamianie zadania
Aby wywołać wnioskowanie, użyj funkcji generateResponse()
.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
Aby przesyłać strumieniowo odpowiedź, użyj:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
Przykładowa aplikacja
Przykładowa aplikacja to przykład podstawowej aplikacji do generowania tekstu w internecie, która korzysta z interfejsu LLM Inference API. Możesz użyć tej aplikacji jako punktu wyjścia do stworzenia własnej aplikacji internetowej lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod jest hostowany na GitHub.
Sklonuj repozytorium Git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
Więcej informacji znajdziesz w przewodniku po konfiguracji w przeglądarce internetowej.
Opcje konfiguracji
Aby skonfigurować aplikację internetową, 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, które model bierze pod uwagę 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 |
loraRanks |
Rankingi LoRA używane przez modele LoRA w czasie wykonywania. Uwaga: ta funkcja jest zgodna tylko z modelami GPU. | Tablica liczb całkowitych | Nie dotyczy |
Konwersja modelu
Interfejs API wnioskowania LLM jest zgodny z tymi typami modeli, z których niektóre wymagają konwersji. Korzystając z tabeli, określ wymagane kroki i metodę dla swojego modelu.
Modele | Metoda konwersji | Zgodne platformy | Typ pliku |
---|---|---|---|
Gemma-3 1B | Konwersja nie jest wymagana | Android, internet | .task |
Gemma 2B, Gemma 7B, Gemma-2 2B | Konwersja nie jest wymagana | Android, iOS, internet | .bin |
Phi-2, StableLM, Falcon | Skrypt konwersji MediaPipe | Android, iOS, internet | .bin |
Wszystkie modele LLM PyTorch | Biblioteka generatywnej AI Edge Torch | Android, iOS | .task |
Więcej informacji o konwertowaniu innych modeli znajdziesz w sekcji Model konwersji.
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 LLM za pomocą opłacalnego procesu trenowania, tworząc mały zestaw trenowanych wag na podstawie nowych danych treningowych, a nie trenując ponownie całego modelu.
Interfejs LLM Inference API umożliwia dodawanie wag LoRA do warstw uwagi w modelach Gemma-2 2B, Gemma
2B i Phi-2. Pobierz model w formacie safetensors
.
Aby utworzyć wagi LoRA, model podstawowy musi być w formacie safetensors
. Po wytrenowaniu modelu LoRA możesz przekonwertować modele do formatu FlatBuffers, aby można było je uruchomić w MediaPipe.
Przygotuj wagi LoRA
Aby wytrenować dopracowany model LoRA na podstawie własnego zbioru danych, skorzystaj z przewodnika LoRA Methods (w języku angielskim) opracowanego przez PEFT.
Interfejs LLM Inference API obsługuje tylko LoRA na warstwach uwagi, więc w pliku LoraConfig
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"],
)
Po wytrenowaniu modelu na przygotowanym zbiorze danych i zapisaniu go domyślnie dopasowane wagi modelu LoRA są dostępne w adapter_model.safetensors
. Plik safetensors
to punkt kontrolny LoRA używany podczas konwertowania modelu.
Konwersja modelu
Użyj pakietu Python MediaPipe, aby przekonwertować wagi modelu na format Flatbuffer. W polu ConversionConfig
określasz opcje modelu podstawowego oraz dodatkowe opcje 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 wygeneruje 2 pliki zgodne z MediaPipe: jeden dla modelu podstawowego, a drugi dla modelu LoRa.
Wnioskowanie modelu LoRA
W internetowej wersji gry LoRA jest dynamiczna w czasie działania, co oznacza, że użytkownicy deklarują pozycje LoRA podczas inicjalizacji. Oznacza to, że w trakcie działania możesz zastąpić różne modele LoRa.
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
Ładuj modele LoRA w czasie wykonywania po zainicjowaniu modelu podstawowego. Uruchom model LoRA, przekazując odwołanie do modelu podczas generowania odpowiedzi LLM.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});