Przewodnik po wnioskowaniu LLM dla witryn internetowych

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 modeluDostosowywanie 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 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ć 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;
});