دليل استنتاج النموذج اللغوي الكبير للويب

تتيح لك واجهة برمجة التطبيقات LLM Inference API تشغيل النماذج اللغوية الكبيرة (LLM) بالكامل على الجهاز لتطبيقات الويب، والتي يمكنك استخدامها لتنفيذ مجموعة كبيرة من المهام، مثل إنشاء النصوص واسترداد المعلومات بتنسيق لغة طبيعية وملخّص للمستندات. توفّر المهمة دعمًا مضمّنًا لعدة نماذج لغوية كبيرة لتحويل النص إلى نص، ما يتيح لك تطبيق أحدث نماذج الذكاء الاصطناعي التوليدي على الأجهزة فقط على تطبيقات الويب.

لإضافة واجهة برمجة التطبيقات LLM Inference API بسرعة إلى تطبيق الويب، اتّبِع الخطوات السريعة. للحصول على مثال أساسي لتطبيق ويب يستخدم واجهة برمجة التطبيقات LLM Inference API، اطّلِع على نموذج التطبيق. لفهمٍ عميقٍ أكثر لطريقة عمل واجهة برمجة التطبيقات LLM Inference API، يُرجى الرجوع إلى أقسام خيارات الضبط وتحويل النماذج وضبط LoRA.

يمكنك الاطّلاع على هذه المهمة في العرض التمهيدي لتطبيق MediaPipe Studio. لمزيد من المعلومات عن الإمكانات والنماذج وخيارات الضبط لهذه المهمة، اطّلِع على نظرة عامة.

البدء السريع

اتّبِع الخطوات التالية لإضافة واجهة برمجة التطبيقات LLM Inference API إلى تطبيق الويب. تتطلّب واجهة برمجة التطبيقات LLM Inference API متصفح ويب متوافقًا مع WebGPU. للحصول على قائمة كاملة بالمتصفّحات المتوافقة، يُرجى الاطّلاع على توافق المتصفّحات مع وحدة معالجة الرسومات.

إضافة التبعيات

تستخدم واجهة برمجة التطبيقات LLM Inference API الحزمة @mediapipe/tasks-genai.

ثبِّت الحِزم المطلوبة للنشر على الجهاز المحلي:

npm install @mediapipe/tasks-genai

للنشر على خادم، استخدِم خدمة شبكة توصيل المحتوى (CDN) مثل jsDelivr لإضافة الرمز مباشرةً إلى صفحة HTML:

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

تنزيل نموذج

نزِّل Gemma-2 2B بتنسيق كمية 8 بت من نماذج Kaggle. لمزيد من المعلومات عن النماذج المتاحة، اطّلِع على مستندات نماذج تحديد المصدر.

احفظ النموذج في دليل مشروعك:

<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin

حدِّد مسار النموذج باستخدام مَعلمة baseOptions كائن modelAssetPath:

baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}

بدء المهمة

ابدأ المهمة باستخدام خيارات الإعداد الأساسية:

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

تنفيذ المهمة

استخدِم الدالة generateResponse() لبدء الاستنتاجات.

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

لبث الردّ، استخدِم ما يلي:

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

نموذج طلب

نموذج التطبيق هو مثال على تطبيق أساسي لإنشاء النصوص على الويب، ويستخدم واجهة برمجة التطبيقات LLM Inference API. يمكنك استخدام التطبيق كنقطة بداية لتطبيقك المكوّن من صفحات ويب، أو الرجوع إليه عند تعديل تطبيق حالي. يتم استضافة مثال الرمز على GitHub.

استنسِخ مستودع git باستخدام الأمر التالي:

git clone https://github.com/google-ai-edge/mediapipe-samples

لمزيد من المعلومات، يُرجى الاطّلاع على دليل الإعداد لتطبيق Web.

خيارات الضبط

استخدِم خيارات الضبط التالية لإعداد تطبيق ويب:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
modelPath مسار مكان تخزين النموذج ضمن دليل المشروع PATH لا ينطبق
maxTokens الحد الأقصى لعدد الرموز المميّزة (رموز الإدخال + رموز الإخراج) التي يعالجها النموذج عدد صحيح 512
topK عدد الرموز التي يأخذها النموذج في الاعتبار في كل خطوة من خطوات الإنشاء حصر التوقّعات بأكبر عدد من الرموز الاحتمالية عدد صحيح 40
temperature مقدار العشوائية التي تمّ إدخالها أثناء الإنشاء تؤدّي درجة الحرارة المرتفعة إلى زيادة الإبداع في النص الذي يتم إنشاؤه، في حين تؤدّي درجة الحرارة المنخفضة إلى إنشاء نصوص يمكن توقّعها بشكل أكبر. عدد عائم 0.8
randomSeed البذرة العشوائية المستخدَمة أثناء إنشاء النص عدد صحيح 0
loraRanks ترتيبات LoRA التي ستستخدمها نماذج LoRA أثناء التشغيل ملاحظة: لا يتوافق هذا الإجراء إلا مع طُرز وحدة معالجة الرسومات. صفيف الأعداد الصحيحة لا ينطبق

وضع نماذج للإحالات الناجحة

تتوافق واجهة برمجة التطبيقات LLM Inference API مع الأنواع التالية من النماذج، ويتطلّب بعض هذه الأنواع تحويل النموذج. استخدِم الجدول لتحديد الخطوات المطلوبة الطريقة المناسبة لنموذجك.

النماذج طريقة الإحالة الناجحة الأنظمة الأساسية المتوافقة نوع الملف
Gemma-3 1B ما مِن إحالة ناجحة مطلوبة Android والويب ‎.task
Gemma 2B وGemma 7B وGemma-2 2B ما مِن إحالة ناجحة مطلوبة Android وiOS والويب ‎.bin
Phi-2 وStableLM وFalcon نص تحويل MediaPipe Android وiOS والويب ‎.bin
جميع نماذج PyTorch LLM مكتبة AI Edge Torch التوليدية Android وiOS ‎.task

لمعرفة كيفية تحويل نماذج أخرى، اطّلِع على القسم تحويل النموذج.

تخصيص LoRA

تتيح واجهة برمجة التطبيقات LLM Inference API ضبط LoRA (التكيّف منخفض الترتيب) باستخدام مكتبة PEFT (الضبط الدقيق الفعال للمعلَمات). تعمل ميزة LoRA على تخصيص سلوك النماذج اللغوية الكبيرة من خلال عملية تدريب ملفتة للتكلفة، ما يؤدي إلى إنشاء مجموعة صغيرة من الأوزان القابلة للتدريب استنادًا إلى بيانات التدريب الجديدة بدلاً من إعادة تدريب النموذج بالكامل.

تتيح واجهة برمجة التطبيقات LLM Inference API إضافة أوزان LoRA إلى طبقات الانتباه في نماذج Gemma-2 2B وGemma 2B و Phi-2. نزِّل النموذج بتنسيق safetensors.

يجب أن يكون النموذج الأساسي بتنسيق safetensors لإنشاء معاملات LoRA. بعد تدريب LoRA، يمكنك تحويل النماذج إلى تنسيق FlatBuffers لتشغيلها على MediaPipe.

إعداد قيم ترجيح LoRA

استخدِم دليل LoRA Methods من PEFT لتدريب نموذج LoRA محسّن على مجموعة البيانات الخاصة بك.

لا تتوافق واجهة برمجة التطبيقات LLM Inference API إلا مع LoRA في طبقات الانتباه، لذا حدِّد فقط طبقات الانتباه في LoraConfig:

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

بعد التدريب على مجموعة البيانات المعدّة وحفظ النموذج، تتوفّر أوزان نموذج LoRA المحسَّنة في adapter_model.safetensors. ملف safetensors هو نقطة تفتيش LoRA المستخدَمة أثناء تحويل النموذج.

وضع نماذج للإحالات الناجحة

استخدِم حزمة MediaPipe Python لتحويل أوزان النموذج إلى ملف برمجي بتنسيق Flatbuffer. تحدّد السمة ConversionConfig خيارات النموذج الأساسي بالإضافة إلى خيارات LoRA الإضافية.

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)

سيُنشئ المحوِّل ملفين متوافقَين مع MediaPipe، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.

استنتاج نموذج LoRA

يتيح الويب استخدام بروتوكول LoRA الديناميكي أثناء التشغيل، ما يعني أنّ المستخدمين يُعلنون عن ترتيبات LoRA أثناء الإعداد. وهذا يعني أنّه يمكنك تبديل نماذج LoRA المختلفة أثناء وقت التشغيل.

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

تحميل نماذج LoRA أثناء التشغيل، بعد إعداد النموذج الأساسي شغِّل نموذج LoRA من خلال تمرير مرجع النموذج عند إنشاء ردّ النموذج اللغوي الكبير.

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