Android için LLM Çıkarım rehberi

LLM Inference API, Android uygulamaları için büyük dil modellerini (LLM) tamamen cihaz üzerinde çalıştırmanızı sağlar. Bu modelleri metin oluşturma, doğal dil biçiminde bilgi alma ve dokümanları özetleme gibi çeşitli görevleri gerçekleştirmek için kullanabilirsiniz. Görev, birden fazla metin okuma büyük dil modeli için yerleşik destek sağlar. Böylece, cihazdaki en yeni üretken yapay zeka modellerini Android uygulamalarınıza uygulayabilirsiniz.

Görev, Gemini modellerini oluşturmak için kullanılan aynı araştırma ve teknolojiyle oluşturulan hafif, son teknoloji ürünü açık model ailesinin bir parçası olan Gemma 2B'i destekler. Ayrıca şu harici modelleri destekler: AI Edge üzerinden dışa aktarılan tüm modellerle birlikte Phi-2, Falcon-RW-1B ve StableLM-3B.

Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.

Kod örneği

Bu kılavuzda, Android için temel bir metin oluşturma uygulaması örneğine yer verilmektedir. Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken başvuruda bulunabilirsiniz. Örnek kod GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.

Ö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, yalnızca LLM Inference API örnek uygulamasına ait dosyalara sahip olmak için git örneğinizi nadir ödeme kullanılacak şekilde yapılandırın:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/android
    

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

Kurulum

Bu bölümde geliştirme ortamınızı kurmanın temel adımları açıklanmaktadır. Projelerinizi özel olarak LLM Inference API'yi kullanacak şekilde kodlayın. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

LLM Inference API, com.google.mediapipe:tasks-genai kitaplığını kullanır. Bu bağımlılığı Android uygulamanızın build.gradle dosyasına ekleyin:

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

Model

MediaPipe LLM Inference API, bu görevle uyumlu olan eğitilmiş bir metinden metne dil modeli gerektirir. Bir modeli indirdikten sonra gerekli bağımlılıkları yükleyin ve modeli Android cihaza aktarın. Gemma dışında bir model kullanıyorsanız modeli MediaPipe ile uyumlu bir biçime dönüştürmeniz gerekir.

LLM Inference API için eğitilmiş modeller hakkında daha fazla bilgi almak isterseniz göreve genel bakış Modeller bölümüne göz atın.

Model indirme

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

  • Gemma 2B: Gemini modellerini oluşturmak için kullanılan aynı araştırma ve teknolojiyle oluşturulan, hafif ve son teknoloji ürünü açık model ailesinin bir parçasıdır. Soru yanıtlama, özetleme ve akıl yürütme gibi çeşitli metin oluşturma görevleri için uygundur.
  • Phi-2: 2,7 milyar parametreden oluşan Dönüştürücü modeli; soru-cevap, sohbet ve kod biçimleri için idealdir.
  • Falcon-RW-1B: 350 milyar RefinedWeb jetonu üzerinde eğitilmiş 1 milyar parametre nedensel kod çözücü yalnızca kod çözücü modeli.
  • StableLM-3B: Çeşitli İngilizce ve kod veri kümelerinde 1 trilyon jeton üzerinde önceden eğitilmiş, 3 milyar parametreye sahip yalnızca kod çözücü dil modeli.

Alternatif olarak, AI Edge Troch üzerinden eşlenen ve dışa aktarılan modelleri kullanabilirsiniz.

Kaggle Modellerinde bulunan ve LLM Inference API ile uyumlu olan bir biçimde sunulan Gemma 2B'yi kullanmanızı öneririz. Başka bir LLM kullanıyorsanız modeli MediaPipe uyumlu bir biçime dönüştürmeniz gerekir. Gemma 2B hakkında daha fazla bilgi için Gemma sitesine bakın. Kullanılabilen diğer modeller hakkında daha fazla bilgi için göreve genel bakış Modeller bölümüne bakın.

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

Yerel model dönüşümü

Harici bir LLM (Phi-2, Falcon veya StableLM) veya Gemma'nın Kaggle olmayan bir sürümünü kullanıyorsanız modeli MediaPipe ile uyumlu olacak şekilde biçimlendirmek için dönüştürme komut dosyalarımızı kullanın.

Model dönüştürme işlemi MediaPipe PyPI paketini gerektirir. Dönüşüm komut dosyası, 0.10.11 tarihinden itibaren tüm MediaPipe paketlerinde kullanılabilir.

Bağımlılıkları yüklemek ve içe aktarmak için aşağıdaki adımları uygulayın:

$ python3 -m pip install mediapipe

Modeli dönüştürmek için genai.converter kitaplığını kullanın:

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

LoRA modelini dönüştürmek için ConversionConfig, temel model seçeneklerini ve ek LoRA seçeneklerini belirtmelidir. API yalnızca GPU ile LoRA çıkarımı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 düz arabellek dosyası oluşturur.

Parametre Açıklama Kabul Edilen Değerler
input_ckpt model.safetensors veya pytorch.bin dosyasının yolu. Bazen model güvenlik koruyucularının biçiminin birden fazla dosyaya kırıldığını (ör. model-00001-of-00003.safetensors, model-00001-of-00003.safetensors) unutmayın. model*.safetensors gibi bir dosya kalıbı belirtebilirsiniz. PATH
ckpt_format Model dosyasının biçimi. {"safetensors", "pytorch"}
model_type Dönüştürülen LLM. {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend Modeli çalıştırmak için kullanılan işlemci (yetki verilmiş kullanıcı). {"cpu", "gpu"}
output_dir Katman başına ağırlık dosyalarını barındıran çıkış dizinine giden yol. PATH
output_tflite_file Çıkış dosyasının yolu. Örneğin, "model_cpu.bin" veya "model_gpu.bin". Bu dosya yalnızca LLM Inference API ile uyumludur ve genel bir "tflite" dosyası olarak kullanılamaz. PATH
vocab_model_file tokenizer.json ve tokenizer_config.json dosyalarını depolayan dizinin yolu. Gemma için, fare imlecini tek tokenizer.model dosyasının üzerine getirin. PATH
lora_ckpt LoRA bağdaştırıcı ağırlığını depolayan safetytensors dosyasının LoRA ckpt'sinin yolu. PATH
lora_rank LoRA kpt derecesini temsil eden bir tam sayı. Lora ağırlıklarını dönüştürmek için gereklidir. Sağlanmazsa dönüştürücü, LoRA ağırlığının olmadığını varsayar. Not: LoRA'yı yalnızca GPU arka ucu destekler. Tamsayı
lora_output_tflite_file LoRA ağırlıkları için çıkış tflite dosya adı. PATH

AI Edge model dönüşümü

AI Edge üzerinden TFLite modeline eşlenmiş bir LLM kullanıyorsanız paket komut dosyamızı kullanarak bir Görev Paketi oluşturun. Paketleme işlemi, eşlenen modeli ek meta verilerle (ör. Tokenizer Parametreleri) gerekir.

Model paketleme işlemi için MediaPipe PyPI paketi gerekir. Dönüşüm komut dosyası, 0.10.14 tarihinden itibaren tüm MediaPipe paketlerinde kullanılabilir.

Bağımlılıkları yüklemek ve içe aktarmak için aşağıdaki adımları uygulayın:

$ python3 -m pip install mediapipe

Modeli gruplandırmak için genai.bundler kitaplığını kullanın:

import mediapipe as mp
from mediapipe.tasks.python.genai import bundler

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
Parametre Açıklama Kabul Edilen Değerler
tflite_model AI Edge'den dışa aktarılan TFLite modelinin yolu. PATH
tokenizer_model SentencePiece belirteç oluşturucu modeline giden yol. PATH
start_token Modele özel başlangıç jetonu. Başlangıç jetonu, sağlanan jeton oluşturucu modelinde bulunmalıdır. Dize
stop_tokens Modele özel durak jetonları. Durdurma jetonları, sağlanan jeton oluşturucu modelinde mevcut olmalıdır. LİSTE[STRING]
output_filename Çıkış görev paketi dosyasının adı. PATH

Modeli cihaza aktarın

output_path klasörünün içeriğini Android cihaza aktarın.

$ 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.bin

Görevi oluşturma

MediaPipe LLM Inference API, görevi ayarlamak için createFromOptions() işlevini kullanır. createFromOptions() işlevi, yapılandırma seçenekleri için değerleri kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri bölümüne bakın.

Aşağıdaki kod, temel yapılandırma seçeneklerini kullanarak görevi başlatır:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

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

Yapılandırma seçenekleri

Bir Android uygulaması 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ığı yol. 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 simge ile sınırlar. topK ayarlarken randomSeed için de bir değer belirlemeniz gerekir. Tamsayı 40
temperature Oluşturma sırasında sunulan rastgelelik miktarı. Sıcaklık ne kadar yüksek olursa üretilen metin daha fazla yaratıcılık gerektirir, düşük sıcaklık ise daha tahmin edilebilir üretim sağlar. temperature ayarlarken randomSeed için de bir değer belirlemeniz gerekir. Kayan 0,8
randomSeed Metin oluşturma sırasında kullanılan rastgele çekirdek. Tamsayı 0
loraPath Cihazda yerel olarak LoRA modeline giden mutlak yol. Not: Bu yalnızca GPU modelleriyle uyumludur. PATH Yok
resultListener Sonuç işleyiciyi, sonuçları eşzamansız olarak alacak şekilde ayarlar. Yalnızca eşzamansız oluşturma yöntemi kullanılırken geçerlidir. Yok Yok
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Yok

Verileri hazırlama

LLM Inference API aşağıdaki girişleri kabul eder:

  • prompt (dize): Bir soru veya istem.
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

Görevi çalıştırma

Önceki bölümde (inputPrompt) sağlanan giriş metnine bir metin yanıtı oluşturmak için generateResponse() yöntemini kullanın. Bu, tek bir oluşturulmuş yanıt üretir.

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

Yanıtı canlı yayınlamak için generateResponseAsync() yöntemini kullanın.

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

llmInference.generateResponseAsync(inputPrompt)

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

LLM Inference API, oluşturulan yanıt metnini içeren bir LlmInferenceResult 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 Sıralama Uyarlaması'nı (LoRA) destekleyecek şekilde yapılandırılabilir. Geliştiriciler, ince ayarlı LoRA modelleri kullanan uygun maliyetli bir eğitim süreciyle LLM'lerin davranışını özelleştirebilir.

LLM Inference API'nin LoRA desteği, yalnızca dikkat katmanları için geçerli olan LoRA ağırlıkları ile GPU arka ucu için Gemma-2B ve Phi-2 modellerinde kullanılabilir. Bu ilk uygulama, gelecekteki geliştirmeler için deneysel bir API işlevi görmektedir. Gelecek güncellemelerde daha fazla model ve çeşitli katman türlerini desteklemesi planlanmaktadır.

LoRA modelleri hazırlama

Desteklenen model türleri (Gemma-2B veya Phi-2) ile kendi veri kümenizde hassas ayarlar yapılmış bir LoRA modeli eğitmek için HuggingFace talimatlarını uygulayın. Gemma-2B ve Phi-2 modellerinin her ikisi de HuggingFace'te koruyucu biçimde mevcuttur. LLM Inference API yalnızca dikkat katmanlarında LoRA'yı desteklediğinden, sadece aşağıdaki gibi LoraConfig oluştururken dikkat katmanlarını belirtin:

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

Test için HuggingFace'te LLM Inference API'ye uyan, herkesin erişebileceği ve hassas ayarları yapılmış LoRA modelleri mevcuttur. Ö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ümesiyle ilgili eğitim verip modeli kaydettikten sonra, hassas ayarlar yapılmış LoRA model ağırlıklarını içeren bir adapter_model.safetensors dosyası elde ediyorsunuz. Safetensors dosyası, model dönüştürme işleminde kullanılan LoRA kontrol noktasıdır.

Sonraki adım olarak, MediaPipe Python Paketini kullanarak model ağırlıklarını TensorFlow Lite Flatbuffer ürününe dönüştürmeniz gerekir. ConversionConfig alanında temel model seçeneklerinin yanı sıra ek LoRA seçenekleri de belirtilmelidir. API yalnızca GPU ile LoRA çıkarımı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 düz arabellek dosyası oluşturur.

LoRA modeli çıkarımı

Web, Android ve iOS LLM Inference API, LoRA modeli çıkarımını destekleyecek şekilde güncellendi. Web, çalışma zamanında farklı LoRA modellerini değiştirebilen dinamik LoRA'yı destekler. Android ve iOS, görevin ömrü boyunca aynı LoRA ağırlıklarını kullanan statik LoRA'yı destekler.

Android, başlatma sırasında statik LoRA'yı destekler. Bir LoRA modelini yüklemek için kullanıcılar temel LLM'nin yanı sıra LoRA model yolunu da belirtir.

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

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

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