Mengoptimalkan kecepatan inferensi dengan caching awalan

Caching awalan adalah fitur yang mengurangi waktu inferensi dengan menyimpan dan menggunakan kembali status LLM perantara dalam memproses bagian awalan perintah bersama dan berulang. Untuk mengaktifkan penyimpanan dalam cache awalan, Anda hanya perlu memisahkan awalan statis dari akhiran dinamis dalam permintaan API.

Saat ini, penyiapan cache awalan hanya mendukung input berupa teks saja, jadi Anda tidak boleh menggunakan fitur ini jika Anda memberikan gambar dalam perintah Anda.

Ada dua pendekatan untuk menerapkan caching awalan: implisit atau eksplisit:

Menggunakan caching awalan secara implisit

Untuk mengaktifkan penayangan cache awalan, tambahkan bagian bersama dari perintah ke kolom promptPrefix, seperti yang ditunjukkan dalam cuplikan kode berikut:

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

Dalam cuplikan sebelumnya, dynamicSuffix diteruskan sebagai konten utama, dan promptPrefix diberikan secara terpisah.

Estimasi peningkatan performa

Tanpa caching awalan

Dengan hit cache awalan

(Cache-miss awalan dapat terjadi saat awalan digunakan untuk pertama kalinya)

Pixel 9 dengan awalan tetap 300 token dan akhiran dinamis 50 token perintah

0,82 detik

0,45 detik

Pixel 9 dengan perintah akhiran dinamis 100 token dan awalan tetap 1.000 token

2,11 detik

0,5 detik

Pertimbangan penyimpanan

Dengan pembuatan cache awalan implisit, file cache disimpan di penyimpanan pribadi aplikasi klien, yang meningkatkan penggunaan penyimpanan aplikasi Anda. File cache terenkripsi dan metadata terkaitnya, termasuk teks awalan asli, disimpan. Perhatikan pertimbangan penyimpanan berikut:

  • Jumlah cache dikelola oleh mekanisme LRU (Least Recently Used). Cache yang paling jarang digunakan akan dihapus secara otomatis jika melebihi jumlah total cache maksimum.
  • Ukuran cache perintah bergantung pada panjang awalan.
  • Untuk menghapus semua cache yang dibuat dari caching awalan, gunakan metode generativeMode.clearImplicitCaches().

Menggunakan pengelolaan cache eksplisit

Prompt API menyertakan metode pengelolaan cache eksplisit untuk memberi developer kontrol yang lebih presisi atas cara cache dibuat, ditelusuri, digunakan, dan dihapus. Operasi manual ini berjalan secara independen dari penanganan cache otomatis sistem.

Contoh ini menggambarkan cara menginisialisasi pengelolaan cache eksplisit dan melakukan inferensi:

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

Contoh ini menunjukkan cara membuat kueri, mengambil, dan menghapus cache yang dikelola secara eksplisit menggunakan generativeModel.caches:

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