Panduan Inferensi LLM untuk Android

LLM Inference API memungkinkan Anda menjalankan model bahasa besar (LLM) sepenuhnya di perangkat untuk aplikasi Android, yang dapat Anda gunakan untuk melakukan berbagai tugas, seperti membuat teks, mengambil informasi dalam bentuk bahasa alami, dan merumuskan dokumen. Tugas ini menyediakan dukungan bawaan untuk beberapa model bahasa besar teks ke teks, sehingga Anda dapat menerapkan model AI generatif terbaru di perangkat ke aplikasi Android.

Untuk menambahkan LLM Inference API dengan cepat ke aplikasi Android Anda, ikuti Panduan Memulai. Untuk contoh dasar aplikasi Android yang menjalankan LLM Inference API, lihat aplikasi contoh. Untuk pemahaman yang lebih mendalam tentang cara kerja LLM Inference API, lihat bagian opsi konfigurasi, konversi model, dan penyesuaian LoRA.

Anda dapat melihat cara kerja tugas ini dengan demo MediaPipe Studio. Untuk informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.

Panduan memulai

Gunakan langkah-langkah berikut untuk menambahkan LLM Inference API ke aplikasi Android Anda. LLM Inference API dioptimalkan untuk perangkat Android kelas atas, seperti Pixel 8 dan Samsung S23 atau yang lebih baru, dan tidak mendukung emulator perangkat dengan andal.

Menambahkan dependensi

LLM Inference API menggunakan library com.google.mediapipe:tasks-genai. Tambahkan dependensi ini ke file build.gradle aplikasi Android Anda:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.22'
}

Untuk perangkat dengan Android 12 (API 31) atau yang lebih tinggi, tambahkan dependensi library OpenCL native. Untuk mengetahui informasi selengkapnya, lihat dokumentasi tentang tag uses-native-library.

Tambahkan tag uses-native-library berikut ke file AndroidManifest.xml:

<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

Mendownload model

Download Gemma-3 1B dalam format kuantisasi 4-bit dari Hugging Face. Untuk mengetahui informasi selengkapnya tentang model yang tersedia, lihat Dokumentasi model.

Kirim konten folder output_path ke perangkat Android.

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task

Melakukan Inisialisasi Tugas

Lakukan inisialisasi tugas dengan opsi konfigurasi dasar:

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath('/data/local/tmp/llm/model_version.task')
        .setMaxTopK(64)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)

Menjalankan Tugas

Gunakan metode generateResponse() untuk menghasilkan respons teks. Tindakan ini akan menghasilkan satu respons yang dihasilkan.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

Untuk melakukan streaming respons, gunakan metode generateResponseAsync().

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

Contoh aplikasi

Aplikasi contoh adalah contoh aplikasi pembuatan teks dasar untuk Android, menggunakan LLM Inference API. Anda dapat menggunakan aplikasi ini sebagai titik awal untuk aplikasi Android Anda sendiri, atau merujuknya saat mengubah aplikasi yang ada. Kode contoh dihosting di GitHub.

Clone repositori git menggunakan perintah berikut:

git clone https://github.com/google-ai-edge/mediapipe-samples

Setelah membuat versi lokal kode contoh, Anda dapat mengimpor project ke Android Studio dan menjalankan aplikasi. Untuk informasi selengkapnya, lihat Panduan Penyiapan untuk Android.

Opsi konfigurasi

Gunakan opsi konfigurasi berikut untuk menyiapkan aplikasi Android:

Nama Opsi Deskripsi Rentang Nilai Nilai Default
modelPath Jalur ke tempat model disimpan dalam direktori project. JALUR T/A
maxTokens Jumlah maksimum token (token input + token output) yang ditangani model. Bilangan Bulat 512
topK Jumlah token yang dipertimbangkan model pada setiap langkah pembuatan. Membatasi prediksi ke token dengan probabilitas tertinggi k teratas. Bilangan Bulat 40
temperature Jumlah keacakan yang diperkenalkan selama pembuatan. Temperatur yang lebih tinggi menghasilkan lebih banyak kreativitas dalam teks yang dihasilkan, sedangkan temperatur yang lebih rendah menghasilkan generasi yang lebih dapat diprediksi. Float 0,8
randomSeed Seed acak yang digunakan selama pembuatan teks. Bilangan Bulat 0
loraPath Jalur absolut ke model LoRA secara lokal di perangkat. Catatan: opsi ini hanya kompatibel dengan model GPU. JALUR T/A
resultListener Menetapkan pemroses hasil untuk menerima hasil secara asinkron. Hanya berlaku saat menggunakan metode pembuatan asinkron. T/A T/A
errorListener Menetapkan pemroses error opsional. T/A T/A

Konversi model

LLM Inference API kompatibel dengan jenis model berikut, beberapa di antaranya memerlukan konversi model. Gunakan tabel untuk mengidentifikasi metode langkah yang diperlukan untuk model Anda.

Model Metode konversi Platform yang kompatibel Jenis file
Gemma-3 1B Tidak diperlukan konversi Android, web .task
Gemma 2B, Gemma 7B, Gemma-2 2B Tidak diperlukan konversi Android, iOS, web .bin
Phi-2, StableLM, Falcon Skrip konversi MediaPipe Android, iOS, web .bin
Semua model LLM PyTorch Library Generatif AI Edge Torch Android, iOS .task

Untuk mempelajari cara mengonversi model lain, lihat bagian Konversi Model.

Penyesuaian LoRA

LLM Inference API mendukung penyesuaian LoRA (Low-Rank Adaptation) menggunakan library PEFT (Parameter-Efficient Fine-Tuning). Penyesuaian LoRA menyesuaikan perilaku LLM melalui proses pelatihan yang hemat biaya, membuat sekumpulan kecil bobot yang dapat dilatih berdasarkan data pelatihan baru, bukan melatih ulang seluruh model.

LLM Inference API mendukung penambahan bobot LoRA ke lapisan perhatian Gemma-2 2B, Gemma 2B, dan Phi-2. Download model dalam format safetensors.

Model dasar harus dalam format safetensors untuk membuat bobot LoRA. Setelah pelatihan LoRA, Anda dapat mengonversi model ke dalam format FlatBuffers untuk dijalankan di MediaPipe.

Menyiapkan bobot LoRA

Gunakan panduan Metode LoRA dari PEFT untuk melatih model LoRA yang telah disesuaikan pada set data Anda sendiri.

LLM Inference API hanya mendukung LoRA di lapisan perhatian, jadi hanya tentukan lapisan perhatian di LoraConfig:

# 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"],
)

Setelah melatih set data yang disiapkan dan menyimpan model, bobot model LoRA yang telah disesuaikan tersedia di adapter_model.safetensors. File safetensors adalah checkpoint LoRA yang digunakan selama konversi model.

Konversi model

Gunakan Paket Python MediaPipe untuk mengonversi bobot model ke dalam format Flatbuffer. ConversionConfig menentukan opsi model dasar beserta opsi LoRA tambahan.

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_FILE,
)

converter.convert_checkpoint(config)

Konverter akan menghasilkan dua file Flatbuffer, satu untuk model dasar dan satu lagi untuk model LoRA.

Inferensi model LoRA

Android mendukung LoRA statis selama inisialisasi. Untuk memuat model LoRA, tentukan jalur model LoRA serta LLM dasar.

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

Untuk menjalankan inferensi LLM dengan LoRA, gunakan metode generateResponse() atau generateResponseAsync() yang sama dengan model dasar.