Web için LLM Çıkarım rehberi

LLM Inference API, web 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 çok ç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 web uygulamalarınıza uygulayabilirsiniz. En yeni Gemma-3n modellerini kullanıyorsanız resim ve ses girişleri de desteklenir.

LLM Inference API'yi web uygulamanıza hızlıca eklemek için Hızlı Başlangıç kılavuzunu uygulayın. LLM Inference API'yi çalıştıran bir web 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 web uygulamanıza eklemek için aşağıdaki adımları uygulayın. LLM Inference API için WebGPU uyumlu bir web tarayıcısı gerekir. Uyumlu tarayıcıların tam listesi için GPU tarayıcı uyumluluğu başlıklı makaleyi inceleyin.

Bağımlılık ekleme

LLM Inference API, @mediapipe/tasks-genai paketini kullanır.

Yerel hazırlama için gerekli paketleri yükleyin:

npm install @mediapipe/tasks-genai

Bir sunucuya dağıtım yapmak için kodu doğrudan HTML sayfanıza eklemek üzere jsDelivr gibi bir içerik yayınlama ağı (CDN) hizmeti kullanın:

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
    crossorigin="anonymous"></script>
</head>

Model indirme

HuggingFace'ten Gemma-3n E4B veya E2B'yi indirin. Adında "-Web" bulunan modeller özellikle web'de kullanılmak üzere dönüştürülür. Bu nedenle, her zaman bu modellerden birini kullanmanız önemle tavsiye edilir.

Kullanılabilir modeller hakkında daha fazla bilgi için Modeller dokümanlarına göz atın veya HuggingFace Community sayfamıza göz atın. Bu sayfada, dokümanlarda yer almayan ancak web için özel olarak dönüştürülmüş 270M, 4B, 12B, 27B ve MedGemma-27B-Text gibi birkaç ek Gemma 3 varyantı sunulmaktadır.

Modeli proje dizininizde saklayın:

<dev-project-root>/assets/gemma-3n-E4B-it-int4-Web.litertlm

baseOptions nesnesi modelAssetPath parametresiyle modelin yolunu belirtin:

baseOptions: { modelAssetPath: `/assets/gemma-3n-E4B-it-int4-Web.litertlm`}

Görevi başlatma

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

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

Görevi Çalıştırma

Çıkarımları tetiklemek için generateResponse() işlevini kullanın.

const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;

Yanıtı yayınlamak için aşağıdakileri kullanın:

llmInference.generateResponse(
  inputPrompt,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});

Çok formatlı istemler

Gemma-3n modellerinde, LLM Inference API Web API'leri çok formatlı istemleri destekler. Çok formatlılık etkinleştirildiğinde kullanıcılar istemlerine resim, ses ve metinlerin sıralı bir kombinasyonunu ekleyebilir. LLM, ardından bir metin yanıtı sağlar.

Başlamak için MediaPipe ve web ile uyumlu biçimde Gemma-3n E4B veya Gemma-3n E2B'yi kullanın. Daha fazla bilgi için Gemma-3n belgelerine bakın.

Görsel destek özelliğini etkinleştirmek için maxNumImages değerinin pozitif bir değere ayarlandığından emin olun. Bu parametre, LLM'nin tek bir istemde işleyebileceği maksimum resim parçası sayısını belirler.

Ses desteğini etkinleştirmek için supportAudio seçeneğinin true olarak ayarlandığından emin olun.

llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101,
    maxNumImages: 5,
    supportAudio: true,
});

Yanıtlar artık eskisi gibi oluşturulabilir ancak sıralı bir dizideki dizeler, resimler ve ses verileri kullanılarak oluşturulur:

const response = await llmInference.generateResponse([
  '<ctrl99>user\nDescribe ',
  {imageSource: '/assets/test_image.png'},
  ' and then transcribe ',
  {audioSource: '/assets/test_audio.wav'},
  '<ctrl100>\n<ctrl99>model\n',
]);

Görsel için resim URL'leri ve en yaygın resim, video veya tuval nesneleri desteklenir. Ses için yalnızca tek kanallı AudioBuffer ve mono kanallı ses dosyası URL'leri desteklenir. Daha fazla bilgi için kaynak koduna göz atabilirsiniz.

Örnek uygulama

Örnek uygulama, LLM Inference API'yi kullanan, web için temel bir metin oluşturma uygulaması örneğidir. Uygulamayı kendi web 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

Daha fazla bilgi için Web İçin Kurulum Kılavuzu'na bakın.

Yapılandırma seçenekleri

Web 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ığı 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 eklenen rastgelelik miktarı. Sıcaklık yükseldikçe oluşturulan metin daha yaratıcı olur. 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 başlangıç değeri. Tamsayı 0
loraRanks Çalışma zamanında LoRA modelleri tarafından kullanılacak LoRA sıralamaları. Not: Bu yalnızca GPU modelleriyle uyumludur. Tam sayı dizisi 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 AI Edge 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ı eklenmesini destekler. Modeli safetensors biçiminde indirin.

LoRA ağırlıkları oluşturmak için temel model safetensors biçiminde olmalıdır. LoRA eğitiminden sonra, 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 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, 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ümesi üzerinde eğitim yapılıp model kaydedildikten sonra, ince ayar yapılmış 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 MediaPipe ile uyumlu iki dosya oluşturur.

LoRA modeli çıkarımı

Web, çalışma zamanında dinamik LoRA'yı destekler. Bu nedenle kullanıcılar, başlatma sırasında LoRA sıralarını bildirir. Bu sayede, çalışma zamanında farklı LoRA modellerini değiştirebilirsiniz.

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
    // options for the base model
    ...
    // LoRA ranks to be used by the LoRA models during runtime
    loraRanks: [4, 8, 16]
});

Temel modeli başlattıktan sonra, çalışma zamanında LoRA modellerini yükleyin. LLM yanıtı oluşturulurken model referansı iletilerek LoRA modeli tetiklenir.

// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);

// Specify LoRA model to be used during inference
llmInference.generateResponse(
  inputPrompt,
  loraModelRank4,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});