Inferenzgeschwindigkeit mit Präfix-Caching optimieren

Präfix-Caching ist eine Funktion, die die Inferenzzeit verkürzt, indem der Zwischenzustand des LLM bei der Verarbeitung eines freigegebenen und wiederkehrenden Prompt-Präfixteils gespeichert und wiederverwendet wird. Wenn Sie das Präfix-Caching aktivieren möchten, müssen Sie in Ihrer API-Anfrage nur das statische Präfix vom dynamischen Suffix trennen.

Das Präfix-Caching unterstützt derzeit nur reine Texteingaben. Sie sollten diese Funktion also nicht verwenden, wenn Sie ein Bild in Ihrem Prompt angeben.

Es gibt zwei Ansätze zur Implementierung des Präfix-Caching: implizit oder explizit:

Präfix-Caching implizit verwenden

Wenn Sie das Präfix-Caching aktivieren möchten, fügen Sie den freigegebenen Teil des Prompts dem Feld promptPrefix hinzu, wie in den folgenden Code-Snippets gezeigt:

Kotlin

val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

val result = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    promptPrefix = PromptPrefix(promptPrefix)
  }
)

Java

String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
    .setPromptPrefix(new PromptPrefix(promptPrefix))
    .build())
    .get();

Im obigen Snippet wird der dynamicSuffix als Hauptinhalt übergeben und der promptPrefix separat bereitgestellt.

Geschätzte Leistungssteigerung

Ohne Präfix-Caching

Mit Präfix-Cache-Treffer

(Cache-Fehler beim Präfix können auftreten, wenn das Präfix zum ersten Mal verwendet wird)

Pixel 9 mit einem festen Präfix mit 300 Tokens und einem dynamischen Suffix mit 50 Tokens

0,82 Sekunden

0,45 Sekunden

Pixel 9 mit einem festen Präfix mit 1.000 Tokens und einem dynamischen Suffix-Prompt mit 100 Tokens

2,11 Sekunden

0,5 Sekunden

Hinweise zum Speicher

Beim impliziten Präfix-Caching werden Cache-Dateien im privaten Speicher der Clientanwendung gespeichert, was die Speichernutzung Ihrer Anwendung erhöht. Verschlüsselte Cache-Dateien und die zugehörigen Metadaten, einschließlich des ursprünglichen Präfixtexts, werden gespeichert. Beachten Sie die folgenden Speicherhinweise:

  • Die Anzahl der Caches wird durch einen LRU-Mechanismus (Least Recently Used) verwaltet. Die am wenigsten verwendeten Caches werden automatisch gelöscht, wenn die maximale Gesamtcachemenge überschritten wird.
  • Die Größe des Prompt-Caches hängt von der Länge des Präfixes ab.
  • Verwenden Sie die Methode generativeMode.clearImplicitCaches(), um alle Caches zu löschen, die durch das Präfix-Caching erstellt wurden.

Explizite Cache-Verwaltung verwenden

Der direkte Modellzugriff umfasst explizite Methoden zur Cache-Verwaltung, mit denen Entwickler genauer steuern können, wie Caches erstellt, durchsucht, verwendet und entfernt werden. Diese manuellen Vorgänge werden unabhängig von der automatischen Cache-Verarbeitung des Systems ausgeführt.

In diesem Beispiel wird gezeigt, wie Sie die explizite Cache-Verwaltung initialisieren und eine Inferenz ausführen:

Kotlin

val cacheName = "my_cache"
val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

// Create a cache
val cacheRequest = createCachedContextRequest(cacheName, PromptPrefix(promptPrefix))
val cache = generativeModel.caches.create(cacheRequest)

// Run inference with the cache
val response = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    cachedContextName = cache.name
  }
)

Java

String cacheName = "my_cache";
String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

// Create a cache
CachedContext cache = cachesFutures.create(
  new CreateCachedContextRequest.Builder(cacheName, new PromptPrefix(promptPrefix))
  .build())
  .get();

// Run inference with the cache
GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
  .setCachedContextName(cache.getName())
  .build())
  .get();

In diesem Beispiel wird gezeigt, wie Sie explizit verwaltete Caches mit generativeModel.caches abfragen, abrufen und löschen:

Kotlin

val cacheName = "my_cache"

// Query pre-created caches
for (cache in generativeModel.caches.list()) {
  // Do something with cache
}

// Get specific cache
val cache = generativeModel.caches.get(cacheName)

// Delete a pre-created cache
generativeModel.caches.delete(cacheName)

Java

String cacheName = "my_cache";

// Query pre-created caches
for (PrefixCache cache : cachesFutures.list().get()) {
  // Do something with cache
}

// Get specific cache
PrefixCache cache = cachesFutures.get(cacheName).get();

// Delete a pre-created cache
cachesFutures.delete(cacheName);