Panduan Inferensi LLM untuk iOS

LLM Inference API memungkinkan Anda menjalankan model bahasa besar (LLM) sepenuhnya di perangkat untuk aplikasi iOS, yang dapat digunakan untuk melakukan berbagai tugas, seperti seperti menghasilkan teks, mengambil informasi dalam bentuk natural language, dan meringkas dokumen. Tugas ini menyediakan dukungan bawaan untuk beberapa model bahasa besar teks-ke-teks, sehingga Anda dapat menerapkan model bahasa model AI generatif untuk aplikasi iOS Anda.

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

Contoh kode

Kode contoh Tugas MediaPipe adalah implementasi dasar dari LLM Inference API untuk iOS. Anda dapat menggunakan aplikasi ini sebagai titik awal untuk aplikasi iOS Anda sendiri, atau merujuk pada saat memodifikasi aplikasi yang ada. Kode contoh LLM Inference API adalah dihosting di GitHub.

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal dari contoh kode menggunakan alat command line git.

Untuk mendownload kode contoh:

  1. Clone repositori git menggunakan perintah berikut:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Secara opsional, konfigurasikan instance git Anda untuk menggunakan checkout sparse, sehingga Anda memiliki hanya file untuk aplikasi contoh LLM Inference API:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/ios/
    

Setelah membuat versi lokal dari kode contoh, Anda dapat menginstal Library tugas MediaPipe, buka project menggunakan Xcode dan jalankan aplikasi. Sebagai lihat Panduan Penyiapan untuk iOS.

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode untuk menggunakan LLM Inference API. Untuk informasi umum tentang penyiapan lingkungan pengembangan untuk menggunakan tugas MediaPipe, termasuk versi platform persyaratan, lihat Panduan penyiapan untuk iOS.

Dependensi

LLM Inference API menggunakan library MediaPipeTasksGenai, yang harus diinstal menggunakan CocoaPods. Library ini kompatibel dengan aplikasi Swift dan Objective-C dan tidak memerlukan penyiapan tambahan khusus bahasa.

Untuk petunjuk menginstal CocoaPods di macOS, lihat CocoaPods panduan pemasangan kami. Untuk mendapatkan petunjuk cara membuat Podfile dengan pod yang diperlukan untuk aplikasi, lihat Menggunakan CocoaPods.

Tambahkan pod MediaPipeTasksGenai di Podfile menggunakan kode berikut:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

Jika aplikasi Anda menyertakan target pengujian unit, lihat Panduan Penyiapan untuk iOS untuk informasi tambahan terkait penyiapan Podfile Anda.

Model

Tugas MediaPipe LLM Inference API memerlukan model terlatih yang kompatibel dengan tugas ini. Untuk informasi selengkapnya tentang model terlatih yang tersedia LLM Inference API, lihat ringkasan tugas bagian Model.

Mendownload model

Download model dan tambahkan ke direktori project Anda menggunakan Xcode. Sebagai instruksi tentang cara menambahkan file ke proyek Xcode Anda, lihat Mengelola file dan folder di Xcode Anda project Anda.

Unduh Gemma 2B

Saat membangun aplikasi iOS, gunakan salah satu varian berikut:

  • gemma-2b-it-cpu-int4: Model Gemma 4-bit dengan kompatibilitas CPU.
  • gemma-2b-it-gpu-int4: Model Gemma 4-bit dengan kompatibilitas GPU.
  • Model yang dipetakan AI Edge Torch yang sesuai dengan persyaratan memori iOS.

Untuk informasi selengkapnya tentang model lain, lihat ringkasan tugas Model bagian.

Membuat tugas

Anda dapat membuat tugas LLM Inference API dengan memanggil salah satu penginisialisasinya. Tujuan Penginisialisasi LlmInference(options:) menetapkan nilai untuk opsi konfigurasi.

Jika Anda tidak memerlukan LLM Inference API yang diinisialisasi dengan konfigurasi yang disesuaikan Anda dapat menggunakan penginisialisasi LlmInference(modelPath:) untuk membuat LLM Inference API dengan opsi default. Untuk informasi selengkapnya tentang konfigurasi opsi, lihat Ringkasan Konfigurasi.

Kode berikut menunjukkan cara membangun dan mengonfigurasi tugas ini.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let LlmInference = try LlmInference(options: options)

Opsi konfigurasi

Tugas ini memiliki opsi konfigurasi berikut untuk aplikasi iOS:

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 di setiap langkah pembuatan. Membatasi prediksi ke token top k yang paling mungkin. Bilangan Bulat 40
temperature Jumlah keacakan yang diperkenalkan selama pembuatan. Semakin tinggi temperatur akan menghasilkan lebih banyak kreativitas dalam teks yang dihasilkan, sementara suhu 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: ini hanya kompatibel dengan model GPU. JALUR T/A

Menyiapkan data

LLM Inference API berfungsi dengan data teks. Tugas ini menangani input data pra-pemrosesan, termasuk tokenisasi dan pra-pemrosesan tensor.

Semua pra-pemrosesan ditangani dalam fungsi generateResponse(inputText:). Tidak perlu pra-pemrosesan tambahan teks input terlebih dahulu.

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

Menjalankan tugas

Untuk menjalankan LLM Inference API, gunakan metode generateResponse(inputText:). Tujuan LLM Inference API menampilkan kategori yang mungkin untuk teks input.

let result = try LlmInference.generateResponse(inputText: inputPrompt)

Untuk men-streaming respons, gunakan metode generateResponseAsync(inputText:).

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

Menangani dan menampilkan hasil

LLM Inference API menampilkan LlmInferenceResult, yang menyertakan ID teks respons.

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]

Penyesuaian model LoRA

API inferensi LLM Mediapipe dapat dikonfigurasi untuk mendukung Adaptasi Peringkat Rendah (LoRA) untuk model bahasa besar. Dengan memanfaatkan model LoRA yang telah disesuaikan, developer dapat menyesuaikan perilaku LLM melalui proses pelatihan yang hemat biaya.

Dukungan LoRA untuk LLM Inference API berfungsi untuk model Gemma-2B dan Phi-2 untuk backend GPU, dengan bobot LoRA yang hanya berlaku untuk lapisan atensi. Ini implementasi awal berfungsi sebagai API eksperimental untuk pengembangan mendatang dengan rencana untuk mendukung lebih banyak model dan berbagai jenis lapisan dalam pembaruan.

Menyiapkan model LoRA

Ikuti petunjuk tentang HuggingFace untuk melatih model LoRA yang telah disesuaikan pada set data Anda sendiri dengan jenis model yang didukung, Gemma-2B atau Phi-2. Model Gemma-2B dan Phi-2 tersedia di HuggingFace dalam format safetensors. Karena LLM Inference API hanya mendukung LoRA di lapisan atensi, hanya tentukan lapisan atensi saat membuat LoraConfig sebagai berikut:

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

Untuk pengujian, ada model LoRA yang disesuaikan dan dapat diakses secara publik, serta sesuai dengan LLM Inference API yang tersedia di HuggingFace. Misalnya, monsterapi/gemma-2b-lora-maths-orca-200k untuk Gemma-2B dan lole25/phi-2-sft-ultrachat-lora untuk Phi-2.

Setelah melatih set data yang disiapkan dan menyimpan model, Anda akan mendapatkan file adapter_model.safetensors yang berisi bobot model LoRA yang telah disesuaikan. File safetensors adalah checkpoint LoRA yang digunakan dalam konversi model.

Sebagai langkah berikutnya, Anda perlu mengonversi bobot model menjadi Flatbuffer TensorFlow Lite menggunakan Paket Python MediaPipe. ConversionConfig harus menentukan opsi model dasar serta opsi LoRA tambahan. Perhatikan bahwa karena API hanya mendukung inferensi LoRA dengan GPU, backend harus ditetapkan ke '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)

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

Inferensi model LoRA

LLM Inference API Web, Android, dan iOS diupdate untuk mendukung inferensi model LoRA. Web mendukung LoRA dinamis, yang dapat mengganti berbagai model LoRA selama runtime. Android dan iOS mendukung LoRA statis, yang menggunakan bobot LoRA yang sama selama masa aktif tugas.

iOS mendukung LoRA statis selama inisialisasi. Untuk memuat model LoRA, pengguna menentukan jalur model LoRA serta LLM dasar.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let LlmInference = try LlmInference(options: options)

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