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 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 web uygulamalarınıza uygulayabilirsiniz.
LLM Tahmini API'yi web uygulamanıza hızlıca eklemek için Hızlı Başlangıç bölümünü inceleyin. LLM Tahmini API'sini ç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ö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.
Hızlı başlangıç kılavuzu
LLM Tahmini API'sini 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ıklar ekleme
LLM Inference API, @mediapipe/tasks-genai
paketini kullanır.
Yerel hazırlaştırma için gerekli paketleri yükleyin:
npm install @mediapipe/tasks-genai
Bir sunucuya dağıtmak için doğrudan HTML sayfanıza kod 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
Gemma-2 2B'yi Kaggle Models'den 8 bitlik kesirli biçimde indirin. Mevcut modeller hakkında daha fazla bilgi için Modeller dokümanına bakın.
Modeli proje dizininizde depolayın:
<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin
baseOptions
nesnesi modelAssetPath
parametresini kullanarak modelin yolunu belirtin:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}
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-2b-it-gpu-int8.bin'
},
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;
});
Örnek uygulama
Örnek uygulama, LLM Tahmini API'sini 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 referans olarak kullanabilirsiniz. Ö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 iç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ığı 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 oluşturulan metinde daha fazla yaratıcılık elde edilir. 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 tohum. | Tamsayı | 0 |
loraRanks |
Çalışma sırasında LoRA modelleri tarafından kullanılacak LoRA sıralamaları. Not: Bu özellik yalnızca GPU modelleriyle uyumludur. | Tam sayı dizisi | Yok |
Model dönüşümü
LLM Tahmini API'si, bazılarında model dönüşümü gerektiren aşağıdaki model türleriyle 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ü |
---|---|---|---|
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 Üretken 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ştirmesi
LLM Tahmini API'si, PEFT (Parametre Verimli İnce Ayar) kitaplığını kullanarak LoRA (Düşük Sıralı Uyum) ayarını destekler. LoRA ayarlama, LLM'lerin davranışını uygun maliyetli bir eğitim süreciyle özelleştirir. Bu işlem, modelin tamamını yeniden eğitmek yerine yeni eğitim verilerine dayalı küçük bir eğitilebilir ağırlık grubu oluşturur.
LLM Tahmini API'si, 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'te çalıştırmak için FlatBuffers biçimine dönüştürebilirsiniz.
LoRA ağırlıklarını hazırlama
Kendi veri kümenizde hassas ayarlanmış bir LoRA modeli eğitmek için PEFT'nin 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ümesinde eğitim yapıldıktan ve model kaydedildikten sonra hassas ayarlanmış LoRA model ağırlıkları adapter_model.safetensors
içinde kullanılabilir. safetensors
dosyası, model dönüşümü sırasında kullanılan LoRA kontrol noktasıdır.
Model dönüşümü
Model ağırlıklarını Flatbuffer biçimine dönüştürmek için MediaPipe Python Paketi'ni kullanın. ConversionConfig
, temel model seçeneklerinin yanı sıra ek LoRA 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 MediaPipe uyumlu dosya oluşturur.
LoRA model çıkarımı
Web, çalışma zamanında dinamik LoRA'yı destekler. Yani kullanıcılar, LoRA sıralarını başlatma sırasında belirtir. Bu sayede, çalışma sırası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ını oluştururken model referansını ileterek LoRA modelini tetikleyin.
// 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;
});