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