Mit der LLM Inference API können Sie Large Language Models (LLMs) vollständig im Browser für Webanwendungen ausführen, um eine Vielzahl von Aufgaben auszuführen, z. B. Text generieren, Informationen in natürlicher Sprache abrufen und Dokumente zusammenfassen. Die Aufgabe bietet integrierte Unterstützung für mehrere Large Language Models (Text-zu-Text), sodass Sie die neuesten generativen KI-Modelle auf dem Gerät auf Ihre Webanwendungen anwenden können.
An der MediaPipe Studio-Demo können Sie sich diese Aufgabe ansehen. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Die Beispielanwendung für die LLM Inference API bietet eine einfache Implementierung dieser Aufgabe in JavaScript als Referenz. Sie können diese Beispiel-App verwenden, um Ihre eigene Textgenerierungs-App zu erstellen.
Sie können auf die Beispiel-App für die LLM Inference API auf GitHub zugreifen.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung der LLM Inference API beschrieben. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für MediaPipe Tasks, einschließlich der Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für das Web.
Browserkompatibilität
Für die LLM Inference API ist ein Webbrowser mit WebGPU-Kompatibilität erforderlich. Eine vollständige Liste der kompatiblen Browser finden Sie unter GPU-Browserkompatibilität.
JavaScript-Pakete
Der Code der LLM Inference API ist im Paket @mediapipe/tasks-genai
verfügbar. Sie können diese Bibliotheken über die Links im Einrichtungsleitfaden für die Plattform herunterladen.
Installieren Sie die erforderlichen Pakete für das lokale Staging:
npm install @mediapipe/tasks-genai
Verwenden Sie für die Bereitstellung auf einem Server einen Content Delivery Network-Dienst (CDN) wie jsDelivr, um Code direkt auf Ihrer HTML-Seite einzufügen:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
Modell
Die MediaPipe LLM Inference API erfordert ein trainiertes Modell, das mit dieser Aufgabe kompatibel ist. Bei Webanwendungen muss das Modell GPU-kompatibel sein.
Weitere Informationen zu verfügbaren trainierten Modellen für die LLM Inference API finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Modell herunterladen
Laden Sie vor dem Initialisieren der LLM Inference API eines der unterstützten Modelle herunter und speichern Sie die Datei in Ihrem Projektverzeichnis:
- Gemma: Teil einer Familie von einfachen, modernen offenen Modellen, die auf derselben Forschung und Technologie basieren, die auch zum Erstellen der Gemini-Modelle verwendet wird. Eignet sich gut für eine Vielzahl von Aufgaben zur Textgenerierung, einschließlich Fragenbeantwortung, Zusammenfassung und Logik. Laden Sie entweder die Modellvariante Gemma 2B oder Gemma 7B herunter.
- Phi-2: Transformer-Modell mit 2, 7 Milliarden Parametern, das sich am besten für das Frage-Antwort-, Chat- und Codeformat eignet.
- Falcon-RW-1B: 1 Milliarde Parametermodell, das nur mit kausalen Decodern arbeitet und mit 350 Mrd. Tokens von RefinedWeb trainiert wurde.
- StableLM-3B: 3 Milliarden Sprachmodell für Decodierer, das mit 1 Billion Tokens verschiedener Englisch- und Code-Datasets vortrainiert wurde.
Wir empfehlen die Verwendung von Gemma 2B oder Gemma 7B, die auf Kaggle-Modellen verfügbar sind und in einem Format vorliegen, das bereits mit der LLM Inference API kompatibel ist. Wenn Sie ein anderes LLM verwenden, müssen Sie das Modell in ein MediaPipe-kompatibles Format konvertieren. Weitere Informationen zu Gemma finden Sie auf der Gemma-Website. Weitere Informationen zu den anderen verfügbaren Modellen finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Modell in das MediaPipe-Format konvertieren
Conversion für natives Modell
Wenn Sie ein externes LLM (Phi-2, Falcon oder StableLM) oder eine Nicht-Kaggle-Version von Gemma verwenden, formatieren Sie das Modell mithilfe unserer Konvertierungsskripts so, dass es mit MediaPipe kompatibel ist.
Für den Modellkonvertierungsprozess ist das MediaPipe-PyPI-Paket erforderlich. Das Konvertierungsskript ist nach dem 0.10.11
in allen MediaPipe-Paketen verfügbar.
Installieren und importieren Sie die Abhängigkeiten mit Folgendem:
$ python3 -m pip install mediapipe
Verwenden Sie die genai.converter
-Bibliothek, um das Modell zu konvertieren:
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
input_ckpt=INPUT_CKPT,
ckpt_format=CKPT_FORMAT,
model_type=MODEL_TYPE,
backend=BACKEND,
output_dir=OUTPUT_DIR,
combine_file_only=False,
vocab_model_file=VOCAB_MODEL_FILE,
output_tflite_file=OUTPUT_TFLITE_FILE,
)
converter.convert_checkpoint(config)
Zum Konvertieren des LoRA-Modells sollten in ConversionConfig
die Basismodelloptionen sowie zusätzliche LoRA-Optionen angegeben werden. Da die API nur LoRA-Inferenz mit GPU unterstützt, muss das Back-End auf 'gpu'
festgelegt werden.
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)
Der Converter gibt zwei TFLite-Flatbuffer-Dateien aus, eine für das Basismodell und eine für das LoRA-Modell.
Parameter | Beschreibung | Zulässige Werte |
---|---|---|
input_ckpt |
Der Pfad zur Datei model.safetensors oder pytorch.bin . Beachten Sie, dass das Safetensors-Format für das Modell manchmal in mehrere Dateien fragmentiert wird, z.B. model-00001-of-00003.safetensors , model-00001-of-00003.safetensors . Sie können ein Dateimuster wie model*.safetensors angeben. |
PATH |
ckpt_format |
Das Modelldateiformat. | {"safetensors", "pytorch"} |
model_type |
Das LLM, das konvertiert wird. | {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"} |
backend |
Der Prozessor (Bevollmächtigte), der zum Ausführen des Modells verwendet wird. | {"cpu", "gpu"} |
output_dir |
Der Pfad zum Ausgabeverzeichnis, in dem die Gewichtungsdateien pro Ebene gehostet werden. | PATH |
output_tflite_file |
Der Pfad zur Ausgabedatei. Zum Beispiel: "model_cpu.bin" oder "model_gpu.bin". Diese Datei ist nur mit der LLM Inference API kompatibel und kann nicht als allgemeine TFlite-Datei verwendet werden. | PATH |
vocab_model_file |
Der Pfad zu dem Verzeichnis, in dem die Dateien tokenizer.json und tokenizer_config.json gespeichert sind. Verweisen Sie bei Gemma auf die einzelne Datei tokenizer.model . |
PATH |
lora_ckpt |
Der Pfad zur LoRA-ckpt der Safetensors-Datei, in der die Gewichtung des LoRA-Adapters gespeichert ist. | PATH |
lora_rank |
Eine Ganzzahl, die den Rang von LoRA ckpt darstellt. Erforderlich für die Umrechnung der Lora-Gewichtungen. Wenn nicht angegeben, geht der Conversion-Wert davon aus, dass keine LoRA-Gewichtungen vorhanden sind. Hinweis: Nur das GPU-Backend unterstützt LoRA. | Integer |
lora_output_tflite_file |
Ausgabe des TFlite-Dateinamens für die LoRA-Gewichtungen. | PATH |
AI Edge-Modellkonvertierung
Wenn Sie ein LLM verwenden, das einem TFLite-Modell über AI Edge zugeordnet ist, verwenden Sie unser Bündelungsskript, um ein Task Bundle zu erstellen. Bei der Bündelung wird das zugeordnete Modell mit zusätzlichen Metadaten verpackt (z.B. Tokenizer-Parameter) erforderlich sind, um End-to-End-Inferenzen auszuführen.
Für den Modellbündelungsprozess ist das MediaPipe-PyPI-Paket erforderlich. Das Konvertierungsskript ist nach dem 0.10.14
in allen MediaPipe-Paketen verfügbar.
Installieren und importieren Sie die Abhängigkeiten mit Folgendem:
$ python3 -m pip install mediapipe
Verwende die genai.bundler
-Bibliothek, um das Modell zu bündeln:
import mediapipe as mp
from mediapipe.tasks.python.genai import bundler
config = bundler.BundleConfig(
tflite_model=TFLITE_MODEL,
tokenizer_model=TOKENIZER_MODEL,
start_token=START_TOKEN,
stop_tokens=STOP_TOKENS,
output_filename=OUTPUT_FILENAME,
enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
Parameter | Beschreibung | Zulässige Werte |
---|---|---|
tflite_model |
Der Pfad zum exportierten AI Edge-TFLite-Modell. | PATH |
tokenizer_model |
Der Pfad zum SentencePiece-Tokenizer-Modell. | PATH |
start_token |
Modellspezifisches Starttoken. Das Starttoken muss im angegebenen Tokenizer-Modell vorhanden sein. | STRING |
stop_tokens |
Modellspezifische Stopptokens. Die Stopptokens müssen im angegebenen Tokenizer-Modell vorhanden sein. | LISTE[STRING] |
output_filename |
Der Name der Ausgabe-Task-Bundle-Datei. | PATH |
Modell zum Projektverzeichnis hinzufügen
Speichern Sie das Modell in Ihrem Projektverzeichnis:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
Geben Sie den Pfad des Modells mit dem Parameter baseOptions
des modelAssetPath
-Objekts an:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
Aufgabe erstellen
Verwenden Sie eine der createFrom...()
-Funktionen der LLM Inference API, um die Aufgabe für das Ausführen von Inferenzen vorzubereiten. Sie können die Funktion createFromModelPath()
mit einem relativen oder absoluten Pfad zur Datei des trainierten Modells verwenden. In diesem Codebeispiel wird die Funktion createFromOptions()
verwendet. Weitere Informationen zu den verfügbaren Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.
Der folgende Code zeigt, wie diese Aufgabe erstellt und konfiguriert wird:
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
});
Konfigurationsoptionen
Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Web- und JavaScript-Apps:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
modelPath |
Der Pfad zum Speicherort des Modells im Projektverzeichnis. | PATH | – |
maxTokens |
Die maximale Anzahl von Tokens (Eingabe- und Ausgabetokens), die das Modell verarbeitet. | Integer | 512 |
topK |
Die Anzahl der Tokens, die das Modell bei jedem Generierungsschritt berücksichtigt.
Beschränkt die Vorhersagen auf die k wahrscheinlichsten Tokens. Beim Festlegen von topK müssen Sie auch einen Wert für randomSeed festlegen. |
Integer | 40 |
temperature |
Das Ausmaß der Zufälligkeit, die während der Generierung eingeführt wird. Eine höhere Temperatur ermöglicht mehr Kreativität im generierten Text, während eine niedrigere Temperatur eine vorhersehbarere Generierung des Textes ermöglicht. Beim Festlegen von temperature müssen Sie auch einen Wert für randomSeed festlegen. |
Gleitkommazahl | 0,8 |
randomSeed |
Der zufällige Startwert, der bei der Textgenerierung verwendet wird. | Integer | 0 |
loraRanks |
Das LoRA-Rang, das von den LoRA-Modellen während der Laufzeit verwendet werden soll. Hinweis: Dies ist nur mit GPU-Modellen kompatibel. | Ganzzahl-Array | – |
Daten vorbereiten
Die LLM Inference API akzeptiert Textdaten (string
). Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Tokenisierung und Tensor-Vorverarbeitung.
Die gesamte Vorverarbeitung erfolgt in der generateResponse()
-Funktion. Eine zusätzliche Vorverarbeitung des Eingabetexts ist nicht erforderlich.
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
Task ausführen
Die LLM Inference API verwendet die Funktion generateResponse()
, um Inferenzen auszulösen.
Bei der Textklassifizierung bedeutet dies, dass die möglichen Kategorien für den Eingabetext zurückgegeben werden.
Der folgende Code zeigt, wie die Verarbeitung mit dem Aufgabenmodell ausgeführt wird.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
Verwenden Sie folgenden Code, um die Antwort zu streamen:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
Ergebnisse verarbeiten und anzeigen
Die LLM Inference API gibt einen String zurück, der den generierten Antworttext enthält.
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]
LoRA-Modellanpassung
Die Mediapipe LLM Inference API kann so konfiguriert werden, dass sie Low-Rank Adaptation (LoRA) für Large Language Models unterstützt. Mit fein abgestimmten LoRA-Modellen können Entwickler das Verhalten von LLMs durch einen kostengünstigen Trainingsprozess anpassen.
Die LoRA-Unterstützung der LLM Inference API funktioniert für Gemma-2B- und Phi-2-Modelle für das GPU-Back-End, wobei die LoRA-Gewichtungen nur für Aufmerksamkeitsebenen gelten. Diese anfängliche Implementierung dient als experimentelle API für zukünftige Entwicklungen mit Plänen zur Unterstützung weiterer Modelle und verschiedener Ebenentypen in den kommenden Updates.
LoRA-Modelle vorbereiten
Folgen Sie der Anleitung für HuggingFace, um ein abgestimmtes LoRA-Modell in Ihrem eigenen Dataset mit den unterstützten Modelltypen Gemma-2B oder Phi-2 zu trainieren. Die Modelle Gemma-2B und Phi-2 sind in HuggingFace im Safetensors-Format verfügbar. Da die LLM Inference API LoRA nur auf Aufmerksamkeitsebenen unterstützt, geben Sie beim Erstellen des LoraConfig
nur Aufmerksamkeitsebenen an:
# For Gemma-2B
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"],
)
Für Tests gibt es öffentlich zugängliche, abgestimmte LoRA-Modelle, die auf die LLM Inference API abgestimmt sind, die auf HuggingFace verfügbar sind. Beispiel: monsterapi/gemma-2b-lora-maths-orca-200k für Gemma-2B und lole25/phi-2-sft-ultrachat-lora für Phi-2.
Nachdem Sie mit dem vorbereiteten Dataset trainiert und das Modell gespeichert haben, erhalten Sie eine adapter_model.safetensors
-Datei mit den abgestimmten LoRA-Modellgewichtungen. Die Safetensors-Datei ist der LoRA-Prüfpunkt, der bei der Modellkonvertierung verwendet wird.
Im nächsten Schritt müssen Sie die Modellgewichtungen mithilfe des Python-Pakets „MediaPipe“ in einen TensorFlow Lite-Flatbuffer konvertieren. In ConversionConfig
sollten die Basismodelloptionen sowie zusätzliche LoRA-Optionen angegeben werden. Da die API nur LoRA-Inferenzen mit GPU unterstützt, muss das Back-End auf 'gpu'
festgelegt werden.
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)
Der Converter gibt zwei TFLite-Flatbuffer-Dateien aus, eine für das Basismodell und eine für das LoRA-Modell.
Inferenz des LoRA-Modells
Die Web, Android und iOS LLM Inference API wurde aktualisiert, um die Inferenz des LoRA-Modells zu unterstützen. Das Web unterstützt dynamische LoRA-Modelle, die während der Laufzeit zwischen verschiedenen LoRA-Modellen wechseln können. Android und iOS unterstützen die statische LORA, die während der Lebensdauer der Aufgabe dieselben LoRA-Gewichtungen verwendet.
Das Web unterstützt während der Laufzeit dynamische LoRA. Das heißt, Nutzer deklarieren die LoRA-Ränge, die während der Initialisierung verwendet werden, und können während der Laufzeit verschiedene LoRA-Modelle austauschen.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]
});
Laden Sie während der Laufzeit die zu verwendenden LoRA-Modelle, nachdem das Basismodell initialisiert wurde. Lösen Sie außerdem das LoRA-Modell aus, indem Sie beim Generieren der LLM-Antwort die LoRA-Modellreferenz übergeben.
// 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;
});