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, które można wykorzystać do wykonywania wielu zadań, takich jak generowanie tekstu, pobieranie informacji w formie języka naturalnego i podsumowywanie dokumentów. Zadanie 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.

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.

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 przechowywania:

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

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.

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 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
loraRanks Rankingi LoRA używane przez modele LoRA podczas działania. 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 obsługuje wstępną obróbkę danych wejściowych, w tym tokenizację i przetwarzanie tensorów.

Cała wstępna obróbka odbywa się 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 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.

W czasie działania aplikacja 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]
});

Podczas działania, po zainicjowaniu modelu podstawowego, wczytaj modele LoRA, które mają być używane. 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;
});