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.

Görev, Gemma'nın şu varyantlarını destekler: Gemma-2 2B, Gemma 2B ve Gemma 7B. Gemma, Gemini modellerini oluşturmak için kullanılan aynı araştırma ve teknolojiden oluşturulmuş, hafif ve son teknoloji açık modellerden oluşan bir ailedir. Ayrıca Phi-2, Falcon-RW-1B ve StableLM-3B harici modellerini de destekler.

Kullanıcılar, desteklenen modellere ek olarak Google'ın AI Edge Torch'unu kullanarak PyTorch modellerini çok imzalı LiteRT (tflite) modellerine aktarabilir. Bu modeller, LLM Tahmin API'si ile uyumlu Görev Paketleri oluşturmak için tokenizör parametreleriyle birlikte gruplandırılır.

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.

Kod örneği

MediaPipe Tasks örnek kodu, iOS için LLM Inference API uygulamasının temel bir uygulamasıdır. Uygulamayı kendi iOS uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken bu uygulamaya referans verebilirsiniz. LLM Inference API örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı gösterilmektedir.

Örnek kodu indirmek için:

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

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İsteğe bağlı olarak, git örneğinizi seyrek kontrol kullanacak şekilde yapılandırın. Böylece yalnızca LLM Inference API örnek uygulamasının dosyalarına sahip olursunuz:

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

Örnek kodun yerel bir sürümünü oluşturduktan sonra MediaPipe görev kitaplığını yükleyebilir, Xcode'u kullanarak projeyi açabilir ve uygulamayı çalıştırabilirsiniz. Talimatlar için iOS için Kurulum Kılavuzu'na bakın.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi LLM Inference API'yi kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, MediaPipe görevlerini kullanmak için geliştirme ortamınızı ayarlama hakkında genel bilgi için iOS için kurulum kılavuzuna bakın.

Bağımlılıklar

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.

Aşağıdaki kodu kullanarak MediaPipeTasksGenai kapsülünü Podfile içine 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

MediaPipe LLM Tahmini API görevi, bu görevle uyumlu bir eğitimli model gerektirir. LLM Inference API için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi için göreve genel bakıştaki Modeller bölümüne bakın.

Model indirme

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

LLM Inference API'yi başlatmadan önce, desteklenen modellerden birini indirin ve dosyayı proje dizininizde depolayın:

  • Gemma-2 2B: Gemma model ailesinin en son sürümü. Gemini modellerini oluşturmak için kullanılan aynı araştırma ve teknolojiden oluşturulan hafif, son teknoloji açık model ailesinin bir parçasıdır.
  • Gemma 2B: Gemini modellerini oluşturmak için kullanılan aynı araştırma ve teknolojiden oluşturulan hafif, son teknoloji açık model ailesinin bir parçasıdır. Soru yanıtlama, özetleme ve akıl yürütme dahil olmak üzere çeşitli metin oluşturma görevleri için uygundur.
  • Phi-2: Soru-cevap, sohbet ve kod biçimi için en uygun 2,7 milyar parametre içeren Dönüştürücü modeli.
  • Falcon-RW-1B: 350 milyar RefinedWeb jetonu üzerinde eğitilmiş, 1 milyar parametreli nedensel kod çözücü model.
  • StableLM-3B: 1 trilyon farklı İngilizce ve kod veri kümesi jetonunda önceden eğitilmiş, 3 milyar parametre içeren yalnızca kod çözücü dil modeli.

Desteklenen modellere ek olarak, PyTorch modellerini çok imzalı LiteRT (tflite) modellerine aktarmak için Google'ın AI Edge Torch'unu kullanabilirsiniz. Daha fazla bilgi için PyTorch modelleri için Torch Üretken Dönüştürücü başlıklı makaleyi inceleyin.

KaggleModels'de bulunan Gemma-2 2B modelini kullanmanızı öneririz. Kullanılabilir diğer modeller hakkında daha fazla bilgi için göreve genel bakıştaki Modeller bölümüne bakın.

Modeli MediaPipe biçimine dönüştürme

LLM Tahmini API'si, bazılarında model dönüşümü gerektiren iki kategori model türüyle 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ü
Desteklenen modeller Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon MediaPipe Android, iOS, web .bin
Diğer PyTorch modelleri Tüm PyTorch LLM modelleri AI Edge Torch Üretken kitaplığı Android, iOS .task

Gemma 2B, Gemma 7B ve Gemma-2 2B için dönüştürülmüş .bin dosyalarını Kaggle'da barındırıyoruz. Bu modeller, LLM Tahmini API'miz kullanılarak doğrudan dağıtılabilir. Diğer modelleri nasıl dönüştürebileceğinizi öğrenmek için Model Dönüşüm bölümüne bakın.

Görevi oluşturun

LLM Inference API görevini, başlatıcılarından birini çağırarak oluşturabilirsiniz. LlmInference(options:) başlatıcısı, yapılandırma seçenekleri için değerleri ayarlar.

Özelleştirilmiş yapılandırma seçenekleriyle başlatılmış bir LLM Tahmini API'ye ihtiyacınız yoksa varsayılan seçeneklerle bir LLM Tahmini API oluşturmak için LlmInference(modelPath:) başlatıcıyı kullanabilirsiniz. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış başlıklı makaleyi inceleyin.

Aşağıdaki kodda, bu görevin nasıl oluşturulacağı ve yapılandırılacağı gösterilmektedir.

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)

Yapılandırma seçenekleri

Bu görevde, iOS uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

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 üretilen metinde daha fazla yaratıcılık elde edilir. Sıcaklık düştükçe ise daha tahmin edilebilir bir üretim elde edilir. 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

Verileri hazırlama

LLM Inference API, metin verileriyle çalışır. Görev, dize oluşturma ve tenör ön işleme dahil olmak üzere veri girişi ön işleme işlemlerini yönetir.

Tüm ön işleme işlemleri generateResponse(inputText:) işlevi içinde gerçekleştirilir. Giriş metninin önceden ek olarak işlenmesi gerekmez.

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

Görevi çalıştırma

LLM Tahmini API'sini çalıştırmak için generateResponse(inputText:) yöntemini kullanın. LLM Tahmini API'si, giriş metni için olası kategorileri döndürür.

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)")
}

Sonuçları işleme ve görüntüleme

LLM Tahmini API'si, oluşturulan yanıt metnini döndürür.

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]

LoRA modeli özelleştirme

Mediapipe LLM çıkarım API'si, büyük dil modelleri için düşük rütbeli uyarlamayı (LoRA) destekleyecek şekilde yapılandırılabilir. Geliştiriciler, hassas ayarlanmış LoRA modellerini kullanarak LLM'lerin davranışını uygun maliyetli bir eğitim süreciyle özelleştirebilir.

LLM Çıkarma API'sinin LoRA desteği, GPU arka ucu için tüm Gemma varyantları ve Phi-2 modellerinde çalışır. LoRA ağırlıkları yalnızca dikkat katmanlarına uygulanır. Bu ilk uygulama, gelecekteki geliştirmeler için deneysel bir API görevi görür. Önümüzdeki güncellemelerde daha fazla model ve çeşitli katman türlerini destekleme planları vardır.

LoRA modelleri hazırlama

Gemma veya Phi-2 gibi desteklenen model türleriyle kendi veri kümenizde hassas ayarlanmış bir LoRA modeli eğitmek için HuggingFace'taki talimatları uygulayın. Gemma-2 2B, Gemma 2B ve Phi-2 modelleri, HuggingFace'ta safetensors biçiminde kullanılabilir. LLM Inference API yalnızca dikkat katmanlarında LoRA'yı desteklediğinden, LoraConfig'ü oluştururken yalnızca dikkat katmanlarını aşağıdaki gibi 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"],
)

Test için, HuggingFace'ta bulunan LLM Inference API'ye uygun, herkese açık ince ayarlanmış LoRA modelleri vardır. Örneğin, Gemma-2B için monsterapi/gemma-2b-lora-maths-orca-200k ve Phi-2 için lole25/phi-2-sft-ultrachat-lora.

Hazırlanan veri kümesinde eğitim yaptıktan ve modeli kaydettikten sonra, ince ayarlanmış LoRA model ağırlıklarını içeren bir adapter_model.safetensors dosyası elde edersiniz. safetensors dosyası, model dönüştürme işleminde kullanılan LoRA kontrol noktasıdır.

Bir sonraki adımda, MediaPipe Python paketini kullanarak model ağırlıklarını TensorFlow Lite Flatbuffer'a dönüştürmeniz gerekir. ConversionConfig, temel model seçeneklerinin yanı sıra ek LoRA seçeneklerini belirtmelidir. API yalnızca GPU ile LoRA çıkarımlarını desteklediğinden arka uç 'gpu' olarak ayarlanmalıdır.

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)

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

LoRA model çıkarımı

Web, Android ve iOS LLM Tahmini API'si, LoRA model çıkarımlarını desteklemek için güncellendi.

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

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.