iOS için LLM Çıkarım rehberi

LLM Inference API, iOS uygulamaları için büyük dil modellerini (LLM'ler) tamamen cihaz üzerinde çalıştırmanıza olanak tanır. Bu API'yi kullanarak metin oluşturma, doğal dil biçiminde bilgi alma ve belgeleri özetleme gibi çeşitli görevleri gerçekleştirebilirsiniz. Bu görev, metinden metne büyük dil modelleri için yerleşik destek sunar. Böylece, en yeni cihaz üzerinde üretken yapay zeka modellerini iOS uygulamalarınıza uygulayabilirsiniz.

LLM Inference API'yi iOS uygulamanıza hızlıca eklemek için Hızlı Başlangıç kılavuzunu inceleyin. LLM Inference 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örevin nasıl çalıştığını 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 Inference API'yi iOS uygulamanıza eklemek için aşağıdaki adımları uygulayın. LLM Inference API, 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 pod'ları içeren bir Podfile oluşturma talimatları için CocoaPods'u kullanma başlıklı makaleye bakın.

Bağımlılık ekleme

Aşağıdaki kodu kullanarak MediaPipeTasksGenai pod'unu Podfile içine ekleyin:

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

Uygulamanızda birim testi hedefleri varsa Set Up Guide for iOS (iOS için Kurulum Kılavuzu) başlıklı makaleyi inceleyerek Podfile kurulumu hakkında daha fazla bilgi edinin.

Model indirme

Kaggle Models'dan 8 bit nicemlenmiş biçimde Gemma-2 2B'yi indirin. Kullanılabilir modeller hakkında daha fazla bilgi için Modeller dokümanlarına bakın.

Xcode'u kullanarak modeli proje dizininize ekleyin. Xcode projenize dosya ekleme talimatları için Xcode projenizdeki dosya 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, tek bir oluşturulmuş yanıt üretir.

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

Yanıtı yayınlamak 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'yi kullanan 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 bu uygulamadan yararlanabilirsiniz. Ö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 aktarıp uygulamayı çalıştırabilirsiniz. Daha fazla bilgi için iOS Kurulum Kılavuzu'na bakın.

Yapılandırma seçenekleri

Bir iOS uygulamasını ayarlamak 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ığı yerin yolu. 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ırlar. Tamsayı 40
temperature Oluşturma sırasında kullanılan rastgelelik miktarı. Daha yüksek bir sıcaklık, oluşturulan metinde daha fazla yaratıcılıkla sonuçlanır. Daha düşük bir sıcaklık ise daha tahmin edilebilir bir üretim sağlar. Kayan 0,8
randomSeed Metin oluşturma sırasında kullanılan rastgele başlangıç değeri. Tamsayı 0
loraPath LoRA modelinin cihazdaki yerel mutlak yolu. Not: Bu yalnızca GPU modelleriyle uyumludur. PATH Yok

Model dönüştürme

LLM Inference API, aşağıdaki model türleriyle uyumludur. Bu modellerden bazıları model dönüştürme gerektirir. Modeliniz için gerekli adımları/yöntemi 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 LiteRT Torch Generative 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ştirme

LLM Inference API, PEFT (Parameter-Efficient Fine-Tuning) kitaplığı kullanılarak LoRA (Low-Rank Adaptation) ince ayarını destekler. LoRA ayarlama, LLM'lerin davranışını uygun maliyetli bir eğitim süreciyle özelleştirir. Bu süreçte, modelin tamamı yeniden eğitilmek yerine yeni eğitim verilerine dayalı olarak eğitilebilir ağırlıklardan oluşan küçük bir küme oluşturulur.

LLM Inference API, 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'ta çalıştırmak için FlatBuffers biçimine dönüştürebilirsiniz.

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

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

LLM Inference API yalnızca dikkat katmanlarında LoRA'yı destekler. Bu nedenle, yalnızca LoraConfig içinde 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ümesi üzerinde eğitim yapılıp model kaydedildikten sonra, ince ayarlı LoRA model ağırlıkları adapter_model.safetensors içinde kullanılabilir. safetensors dosyası, model dönüştürme sırasında kullanılan LoRA kontrol noktasıdır.

Model dönüştürme

Model ağırlıklarını Flatbuffer biçimine dönüştürmek için MediaPipe Python paketini kullanın. ConversionConfig, ek LoRA seçenekleriyle birlikte temel model 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 modeli çıkarımı

iOS, ilk kullanıma hazırlama sırasında statik LoRA'yı destekler. LoRA modelini yüklemek için LoRA modeli yolunu ve temel LLM'yi 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ımı çalıştırmak için temel modelle aynı generateResponse() veya generateResponseAsync() yöntemlerini kullanın.