iOS için LLM Çıkarım rehberi

LLM Tahmini API'si, iOS uygulamaları için büyük dil modellerini (LLM'ler) tamamen cihaz üzerinde çalıştırmanıza olanak tanır. Bu modelleri metin oluşturma, bilgileri doğal dil biçiminde alma ve belgeleri özetleme gibi çeşitli görevleri gerçekleştirmek için kullanabilirsiniz. Görev, birden fazla metinden metne büyük dil modeli için yerleşik destek sağlar. Böylece, en yeni cihaz üzerinde üretken yapay zeka modellerini iOS uygulamalarınıza uygulayabilirsiniz.

LLM Tahmini API'yi iOS uygulamanıza hızlıca eklemek için Hızlı Başlangıç kılavuzunu uygulayın. LLM Tahmine Dayalı API'yi çalıştıran bir iOS uygulamasının temel örneği için örnek uygulamaya bakın. LLM Inference API'nin işleyiş şekli hakkında daha ayrıntılı bilgi edinmek için yapılandırma seçenekleri, model dönüştürme ve LoRA ayarlama bölümlerine bakın.

Bu görevi MediaPipe Studio demosunda görebilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.

Hızlı başlangıç kılavuzu

LLM Tahmini API'sini iOS uygulamanıza eklemek için aşağıdaki adımları uygulayın. LLM Tahmini API'si, CocoaPods kullanılarak yüklenmesi gereken MediaPipeTasksGenai kitaplığını kullanır. Kitaplık hem Swift hem de Objective-C uygulamalarıyla uyumludur ve dile özgü ek kurulum gerektirmez.

CocoaPods'u macOS'e yükleme talimatları için CocoaPods yükleme kılavuzuna bakın. Uygulamanız için gerekli kapsülleri içeren bir Podfile oluşturma talimatları için CocoaPods'u kullanma başlıklı makaleyi inceleyin.

Bağımlılıklar ekleme

Aşağıdaki kodu kullanarak MediaPipeTasksGenai kapsülünü Podfile'a ekleyin:

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

Uygulamanız birim testi hedefleri içeriyorsa Podfile'inizi ayarlama hakkında daha fazla bilgi için iOS için Kurulum Kılavuzu'na bakın.

Model indirme

Gemma-2 2B'yi Kaggle Models'den 8 bitlik kesirli biçimde indirin. Mevcut modeller hakkında daha fazla bilgi için Modeller dokümanına bakın.

Xcode'u kullanarak modeli proje dizininize ekleyin. Xcode projenize dosya eklemeyle ilgili talimatlar için Xcode projenizdeki dosyaları ve klasörleri yönetme başlıklı makaleyi inceleyin.

Görevi başlatma

Görevi temel yapılandırma seçenekleriyle başlatın:

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)

Görevi çalıştırma

Metin yanıtı oluşturmak için generateResponse(inputText:) yöntemini kullanın. Bu işlem sonucunda tek bir yanıt oluşturulur.

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

Yanıtı aktarmak için generateResponseAsync(inputText:) yöntemini kullanın.

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

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

Örnek uygulama

Örnek uygulama, LLM Inference API'nin kullanıldığı iOS için temel bir metin oluşturma uygulaması örneğidir. Uygulamayı kendi iOS uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Örnek kod GitHub'da barındırılır.

Aşağıdaki komutu kullanarak git deposunu klonlayın:

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

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi iOS Studio'ya aktarabilir ve uygulamayı çalıştırabilirsiniz. Daha fazla bilgi için iOS için Kurulum Kılavuzu'na bakın.

Yapılandırma seçenekleri

iOS uygulaması oluşturmak için aşağıdaki yapılandırma seçeneklerini kullanın:

Seçenek Adı Açıklama Değer Aralığı Varsayılan değer
modelPath Modelin proje dizininde depolandığı yolunu belirtir. PATH Yok
maxTokens Modelin işlediği maksimum jeton sayısı (giriş jetonları + çıkış jetonları). Tamsayı 512
topk Modelin, oluşturma işleminin her adımında dikkate aldığı jeton sayısı. Tahminleri, en olası k jetonla sınırlandırır. Tamsayı 40
temperature Oluşturma sırasında uygulanan rastgelelik miktarı. Sıcaklık yükseldikçe oluşturulan metinde daha fazla yaratıcılık elde edilir. Sıcaklık düştükçe ise daha tahmin edilebilir bir metin oluşturulur. Kayan 0,8
randomSeed Metin oluşturma sırasında kullanılan rastgele tohum. Tamsayı 0
loraPath Cihazdaki LoRA modelinin mutlak yolu. Not: Bu özellik yalnızca GPU modelleriyle uyumludur. PATH Yok

Model dönüşümü

LLM Tahmini API'si, bazılarında model dönüşümü gerektiren aşağıdaki model türleriyle uyumludur. Modeliniz için gerekli adımlar yöntemini belirlemek üzere tabloyu kullanın.

Modeller Dönüşüm yöntemi Uyumlu platformlar Dosya türü
Gemma-3 1B Dönüşüm gerekmez Android, web .task
Gemma 2B, Gemma 7B, Gemma-2 2B Dönüşüm gerekmez Android, iOS, web .bin
Phi-2, StableLM, Falcon MediaPipe dönüşüm komut dosyası Android, iOS, web .bin
Tüm PyTorch LLM modelleri AI Edge Torch Üretken kitaplığı Android, iOS .task

Diğer modelleri nasıl dönüştürebileceğinizi öğrenmek için Model Dönüşüm bölümüne bakın.

LoRA özelleştirmesi

LLM Tahmini API'si, PEFT (Parametre Verimli İnce Ayar) kitaplığını kullanarak LoRA (Düşük Sıralı Uyum) ayarını destekler. LoRA ayarlama, LLM'lerin davranışını uygun maliyetli bir eğitim süreciyle özelleştirir. Bu işlem, modelin tamamını yeniden eğitmek yerine yeni eğitim verilerine dayalı küçük bir eğitilebilir ağırlık grubu oluşturur.

LLM Tahmini API'si, Gemma-2 2B, Gemma 2B ve Phi-2 modellerinin dikkat katmanlarına LoRA ağırlıkları eklemeyi destekler. Modeli safetensors biçiminde indirin.

LoRA ağırlıkları oluşturmak için temel model safetensors biçiminde olmalıdır. LoRA eğitimi sonrasında, modelleri MediaPipe'te çalıştırmak için FlatBuffers biçimine dönüştürebilirsiniz.

LoRA ağırlıklarını hazırlama

Kendi veri kümenizde hassas ayarlanmış bir LoRA modeli eğitmek için PEFT'nin LoRA Yöntemleri kılavuzunu kullanın.

LLM Inference API, yalnızca dikkat katmanlarında LoRA'yı destekler. Bu nedenle, LoraConfig içinde yalnızca dikkat katmanlarını belirtin:

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

Hazırlanan veri kümesinde eğitim yapıldıktan ve model kaydedildikten sonra hassas ayarlanmış LoRA model ağırlıkları adapter_model.safetensors içinde kullanılabilir. safetensors dosyası, model dönüşümü sırasında kullanılan LoRA kontrol noktasıdır.

Model dönüşümü

Model ağırlıklarını Flatbuffer biçimine dönüştürmek için MediaPipe Python Paketi'ni kullanın. ConversionConfig, temel model seçeneklerinin yanı sıra ek LoRA seçeneklerini belirtir.

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)

Dönüştürücü, biri temel model, diğeri LoRA modeli için olmak üzere iki Flatbuffer dosyası oluşturur.

LoRA model çıkarım

iOS, ilk kullanıma hazırlama sırasında statik LoRA'yı destekler. LoRA modeli yüklemek için temel LLM'nin yanı sıra LoRA model yolunu da belirtin.

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)

LoRA ile LLM çıkarımlarını çalıştırmak için temel modelle aynı generateResponse() veya generateResponseAsync() yöntemlerini kullanın.