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

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

لإضافة 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-3n E4B أو E2B من HuggingFace. يتم تحويل النماذج التي تتضمّن "-Web" في الاسم خصيصًا للاستخدام على الويب، لذا يُنصح بشدة باستخدام أحد هذه النماذج دائمًا.

لمزيد من المعلومات حول النماذج المتاحة، يُرجى الاطّلاع على مستندات النماذج أو تصفُّح صفحة "منتدى HuggingFace" التي تقدّم العديد من صيغ Gemma 3 الإضافية غير المذكورة في المستندات، ولكن تم تحويلها خصيصًا للويب، مثل 270M و4B و12B و27B وMedGemma-27B-Text.

خزِّن النموذج في دليل مشروعك:

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

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

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

إعداد المهمة

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

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

تنفيذ المهمة

استخدِم الدالة generateResponse() لتفعيل الاستنتاجات.

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

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

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

التلقين بعدّة وسائط

بالنسبة إلى نماذج Gemma-3n، تتيح واجهات LLM Inference API Web API استخدام الطلبات المتعددة الوسائط. عند تفعيل ميزة "الوسائط المتعددة"، يمكن للمستخدمين تضمين مجموعة منظَّمة من الصور والصوت والنصوص في طلباتهم. بعد ذلك، يقدّم النموذج اللغوي الكبير ردًا نصيًا.

للبدء، استخدِم إما Gemma-3n E4B أو Gemma-3n E2B بتنسيق متوافق مع MediaPipe والويب. لمزيد من المعلومات، راجِع مستندات Gemma-3n.

لتفعيل ميزة دعم الرؤية، تأكَّد من ضبط maxNumImages على قيمة موجبة. يحدّد هذا الحد الأقصى لعدد أجزاء الصور التي يمكن للنموذج اللغوي الكبير معالجتها في طلب واحد.

لتفعيل دعم الصوت، تأكَّد من ضبط supportAudio على true.

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

يمكن الآن إنشاء الردود كما كان من قبل، ولكن باستخدام مصفوفة مرتّبة من السلاسل والصور وبيانات الصوت:

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

بالنسبة إلى الصور، تتوفّر عناوين URL الخاصة بالصور ومعظم عناصر الصور أو الفيديوهات أو اللوحات الشائعة. بالنسبة إلى الصوت، لا يمكن استخدام سوى عناوين URL لملفات AudioBuffer أحادية القناة وملفات الصوت أحادية القناة. يمكنك الاطّلاع على مزيد من التفاصيل من خلال تصفُّح رمز المصدر.

تطبيق نموذجي

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

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

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

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

خيارات الإعداد

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

اسم الخيار الوصف نطاق القيم القيمة التلقائية
modelPath مسار مكان تخزين النموذج داخل دليل المشروع المسار لا ينطبق
maxTokens الحد الأقصى لعدد الرموز المميزة (رموز الإدخال + رموز الإخراج) التي يمكن للنموذج التعامل معها عدد صحيح 512
topK عدد الرموز المميزة التي يأخذها النموذج في الاعتبار في كل خطوة من خطوات الإنشاء يقتصر التوقّع على أهم k رموز مميّزة محتملة. عدد صحيح 40
temperature مقدار العشوائية التي تم إدخالها أثناء الإنشاء يؤدي رفع &quot;درجة العشوائية&quot; إلى أن يكون النص الذي يتم إنشاؤه أكثر إبداعًا، فيما يؤدي خفضها إلى أن يكون النص الذي يتم إنشاؤه أكثر قابلية للتوقُّع. عدد عائم 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
جميع نماذج LLM في PyTorch مكتبة LiteRT Torch Generative 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 من 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;
});