Przewodnik po wnioskowaniu LLM dla witryn internetowych

Interfejs LLM Inference API umożliwia uruchamianie dużych modeli językowych (LLM) całkowicie w przeglądarce w przypadku aplikacji internetowych. Możesz go używać do wykonywania wielu zadań, takich jak generowanie tekstu, pobieranie informacji w formie języka naturalnego i podsumowywanie dokumentów. Zadaniem jest wbudowane wsparcie dla wielu dużych modeli językowych (LLM) typu „tekst na tekst”, dzięki czemu możesz stosować najnowsze modele generatywnej AI na urządzeniu w swoich aplikacjach internetowych.

Zadanie obsługuje te warianty Gemma: Gemma-3 1B, Gemma-2 2B, Gemma 2B i Gemma 7B. Gemma to rodzina lekkich, najnowocześniejszych otwartych modeli stworzonych na podstawie tych samych badań i technologii, które posłużyły do opracowania modeli Gemini. Obsługuje też te modele zewnętrzne: Phi-2, Falcon-RW-1B i StableLM-3B.

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

Przykładowa aplikacja dla interfejsu LLM Inference API zawiera podstawową implementację tego zadania w języku JavaScript. Możesz użyć tej przykładowej aplikacji, aby rozpocząć tworzenie własnej aplikacji do generowania tekstu.

Przykładową aplikację korzystającą z interfejsu LLM Inference API znajdziesz na GitHubzie.

Konfiguracja

Ta sekcja opisuje kluczowe kroki konfigurowania środowiska programistycznego i projektów kodu w celu używania interfejsu LLM Inference API. Informacje ogólne o konfigurowaniu środowiska programistycznego na potrzeby korzystania z MediaPipe Tasks, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku konfiguracji dla przeglądarki internetowej.

Zgodność z przeglądarką

Interfejs LLM Inference API wymaga przeglądarki internetowej zgodnej z WebGPU. Pełną listę zgodnych przeglądarek znajdziesz w sekcji Zgodność przeglądarek z GPU.

Pakiety JavaScript

Kod interfejsu LLM Inference API jest dostępny w pakiecie @mediapipe/tasks-genai. Te biblioteki znajdziesz i pobierzesz, klikając linki podane w przewodniku po konfiguracji platformy.

Zainstaluj wymagane pakiety do lokalnego publikowania:

npm install @mediapipe/tasks-genai

Aby wdrożyć na serwerze, użyj usługi sieci dystrybucji 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>

Model

Interfejs API MediaPipe LLM Inference wymaga wytrenowanego modelu, który jest zgodny z tym zadaniem. W przypadku aplikacji internetowych model musi być zgodny z procesorem GPU.

Więcej informacji o dostępnych wytrenowanych modelach interfejsu LLM Inference API znajdziesz w sekcji Modele w omówieniu zadania.

Pobieranie modelu

Zanim zainicjujesz interfejs LLM Inference API, pobierz jeden z obsługiwanych modeli i przechowuj plik w katalogu projektu. Zalecamy użycie Gemma-2 2B, która jest dostępna na Kaggle Models.

Możesz też pobrać jedną z innych obsługiwanych wersji:

  • 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. Dobrze nadaje się do różnych zadań związanych z generowaniem tekstu, w tym do odpowiadania na pytania, podsumowywania i rozumowania.
  • Gemma-31B: najnowszy model z rodziny Gemma, czyli lekka, zaawansowana, otwarta i oparta na najnowszych osiągnięciach nauka, która powstała na podstawie tych samych badań i technologii, co modele Gemini. Model zawiera 1 mld. Wersja 1B to najlżejszy model w rodzinie Gemma, dzięki czemu doskonale nadaje się do wielu zastosowań na urządzeniu. Zanim zaczniesz używać tego modelu, zapoznaj się z sekcją Omówienie modelu, aby dowiedzieć się, jakie wymagania dotyczące konfiguracji modelu musisz spełnić.
  • 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.

Więcej informacji o dostępnych modelach znajdziesz w sekcji Modele w omówieniu zadania.

Konwertowanie modelu na format MediaPipe

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.

Dodawanie modelu do katalogu projektu

Zapisz model w katalogu projektu:

<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin

Określ ścieżkę modelu za pomocą parametru baseOptions obiektu modelAssetPath:

baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}

Tworzenie zadania

Aby przygotować zadanie do wykonywania wnioskowań, użyj jednej z funkcji interfejsu LLM Inference API createFrom...(). Funkcję createFromModelPath() możesz użyć z względną lub bezwzględną ścieżką do wytrenowanego pliku modelu. Przykładowy kod używa funkcji createFromOptions(). Więcej informacji o dostępnych opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie:

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-int4.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

Opcje konfiguracji

W tym zadaniu dostępne są te opcje konfiguracji aplikacji internetowych i aplikacji w języku JavaScript:

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 podczas wykonywania. Uwaga: ta funkcja jest zgodna tylko z modelami GPU. Tablica liczb całkowitych Nie dotyczy

Przygotuj dane

Interfejs LLM Inference API obsługuje dane tekstowe (string). To zadanie odpowiada za wstępną obróbkę danych wejściowych, w tym tokenizację i przetwarzanie tensorów.

Cała wstępna obróbka danych jest wykonywana w ramach funkcji generateResponse(). Nie musisz dodatkowo przetwarzać tekstu wejściowego.

const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";

Uruchamianie zadania

Interfejs LLM Inference API używa funkcji generateResponse() do wywoływania wnioskowań. W przypadku klasyfikacji tekstu oznacza to zwrócenie możliwych kategorii dla tekstu wejściowego.

Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadania.

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

Obsługa i wyświetlanie wyników

Interfejs LLM Inference API zwraca ciąg znaków, 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 na podstawie LLM można skonfigurować tak, aby obsługiwał adaptację niskiego rzędu (LoRA) w przypadku 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 ramach interfejsu API LLM Inference działa w przypadku wszystkich wariantów Gemma i modeli Phi-2 na backendzie GPU, przy czym wagi LoRA są stosowane tylko do warstw uwagi. Ta początkowa implementacja jest eksperymentalnym interfejsem API, który posłuży do przyszłych prac nad obsługą większej liczby modeli i różnych typów warstw w przyszłych aktualizacjach.

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 TensorFlow Lite Flatbuffer 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.

W czasie działania usługa internetowa obsługuje dynamiczne LoRA. Oznacza to, że użytkownicy deklarują hierarchie LoRA, które mają być używane podczas inicjalizacji, oraz mogą przełączać różne modele LoRA w czasie działania.

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]
});

W czasie wykonywania, po zainicjowaniu modelu podstawowego, wczytaj modele LoRA, których chcesz użyć. Podczas generowania odpowiedzi LLM wywołaj model LoRA, przekazując odwołanie do tego modelu.

// 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;
});