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

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

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

مثال الرمز البرمجي

يوفّر نموذج تطبيق LLM Inference API إمكانية تنفيذ أساسية لهذه المهمة في JavaScript. يمكنك استخدام نموذج التطبيق هذا للبدء في إنشاء تطبيق إنشاء النص الخاص بك.

يمكنك الوصول إلى مثال على تطبيق LLM Inference API على GitHub.

ضبط إعدادات الجهاز

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

توافُق المتصفح

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

حِزم JavaScript

يتوفّر رمز واجهة برمجة التطبيقات 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>

الطراز

تتطلّب واجهة برمجة التطبيقات MediaPipe LLM Inference API نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. بالنسبة إلى تطبيقات الويب، يجب أن يكون الطراز متوافقًا مع وحدة معالجة الرسومات.

للمزيد من المعلومات حول النماذج المدرَّبة المتاحة لاستخدام واجهة برمجة التطبيقات LLM Inference API، يمكنك الاطّلاع على قسم "نظرة عامة على المهام" في قسم النماذج.

تنزيل نموذج

قبل إعداد LLM Inference API، يُرجى تنزيل أحد النماذج المتوافقة وتخزين الملف في دليل مشروعك:

  • Gemma: جزء من عائلة من النماذج المفتوحة والخفيفة والمتطوّرة التي تم إنشاؤها من خلال الأبحاث والتكنولوجيا نفسها المستخدَمة في إنشاء نماذج Gemini. مناسب تمامًا لمجموعة متنوعة من مهام إنشاء النص، بما في ذلك الإجابة على الأسئلة والتلخيص والتفكير. يمكنك تنزيل إما صيغة Gemma 2B أو Gemma 7B.
  • Phi-2: 2.7 مليار معلَمة. نموذج محوّل، وهو الأنسب لتنسيق Question-Answer والمحادثة والرمز.
  • Falcon-RW-1B: تم تدريب مليار نموذج واحد لفك الترميز سببيًا معلَمة على معلَمات على 350 مليار رمز مميّز من RefinedWeb.
  • StableLM-3B: تم تدريب 3 مليار مَعلمة لفك الترميز فقط مسبقًا على 1 تريليون رمز مميّز لمجموعات بيانات مختلفة باللغة الإنجليزية والرموز.

ننصحك باستخدام Gemma 2B أو Gemma 7B، واللذين يتوفران على طُرز Kaggle والمتوفرَين بتنسيق متوافق مع واجهة برمجة التطبيقات للاستنتج اللغوي الكبير (LLM). إذا كنت تستخدم نموذج لغوي كبير (LLM) آخر، عليك تحويل النموذج إلى تنسيق متوافق مع MediaPipe. لمزيد من المعلومات عن "جيما"، يُرجى الاطّلاع على موقع "جيما" الإلكتروني. لمزيد من المعلومات حول النماذج الأخرى المتاحة، راجع نظرة عامة على المهام قسم النماذج.

تحويل النموذج إلى تنسيق MediaPipe

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

إذا كنت تستخدِم نموذج لغوي كبير (LLM) (Phi-2 أو Falcon أو StableLM) أو إصدار غير Kaggle من Gemma، استخدِم النصوص البرمجية للإحالات الناجحة لتنسيق النموذج ليكون متوافقًا مع MediaPipe.

تتطلب عملية تحويل النموذج توفُّر حزمة MediaPipe PyPI. يتوفر النص البرمجي للإحالة الناجحة في جميع حِزم MediaPipe بعد 0.10.11.

قم بتثبيت التبعيات واستيرادها مع ما يلي:

$ python3 -m pip install mediapipe

استخدِم مكتبة "genai.converter" لتحويل النموذج:

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

لتحويل نموذج LoRA، يجب أن تحدّد السمة ConversionConfig خيارات النموذج الأساسي بالإضافة إلى خيارات LoRA الإضافية. يُرجى ملاحظة أنّه يجب ضبط الخلفية على 'gpu' بما أنّ واجهة برمجة التطبيقات لا تتيح سوى استنتاج 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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

سيخرج المحوِّل ملفين للمخزن المؤقت TFLite، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.

المَعلمة الوصف القيم المقبولة
input_ckpt المسار إلى الملف model.safetensors أو pytorch.bin تجدر الإشارة إلى أنّه في بعض الأحيان يتم تقسيم تنسيق أدوات أمان النموذج إلى ملفات متعدّدة، مثل model-00001-of-00003.safetensors وmodel-00001-of-00003.safetensors. يمكنك تحديد نمط ملف، مثل model*.safetensors. PATH
ckpt_format تمثّل هذه السمة تنسيق ملف النموذج. {"safethenors", "pytorch"}
model_type جارٍ تحويل النموذج اللغوي الكبير. {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend تمثّل هذه السمة المعالج (المفوَّض) المستخدَم لتشغيل النموذج. {"cpu", "gpu"}
output_dir المسار إلى دليل الإخراج الذي يستضيف ملفات الوزن لكل طبقة. PATH
output_tflite_file المسار إلى ملف الإخراج. على سبيل المثال، "model_cpu.bin" أو "model_gpu.bin". هذا الملف متوافق فقط مع واجهة برمجة التطبيقات LLM Inference API ولا يمكن استخدامه كملف "tflite" عام. PATH
vocab_model_file المسار إلى الدليل الذي يخزِّن ملفَي tokenizer.json وtokenizer_config.json. بالنسبة إلى "جيما"، أشِر إلى ملف tokenizer.model الفردي. PATH
lora_ckpt المسار إلى ملف LoRA ckpt لملفوحدة الأمان الذي يخزِّن وزن محوّل LoRA. PATH
lora_rank عدد صحيح يمثّل ترتيب LoRA ckpt. مطلوب لتحويل أوزان لورا. إذا لم يتم تقديمها، يفترض المحول عدم وجود ترجيحات LoRA. ملاحظة: لا تتوافق الخلفية مع LoRA إلا مع الواجهة الخلفية لوحدة معالجة الرسومات. عدد صحيح
lora_output_tflite_file إخراج اسم ملف tflite لأوزان LoRA. PATH

تحويل نموذج AI Edge

في حال استخدام نموذج لغوي كبير (LLM) تم ربطه بنموذج TFLite من خلال AI Edge، استخدِم نص التجميع لإنشاء مجموعة مهام. تقوم عملية التجميع بتعبئة النموذج المعين ببيانات وصفية إضافية (مثل معلمات Tokenizer) اللازمة لإجراء استنتاج شامل.

تتطلب عملية تجميع النموذج حزمة MediaPipe PyPI. يتوفر النص البرمجي للإحالة الناجحة في جميع حِزم MediaPipe بعد 0.10.14.

قم بتثبيت التبعيات واستيرادها مع ما يلي:

$ python3 -m pip install mediapipe

استخدِم مكتبة genai.bundler لتجميع النموذج:

import mediapipe as mp
from mediapipe.tasks.python.genai import bundler

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
المَعلمة الوصف القيم المقبولة
tflite_model المسار إلى نموذج TFLite الذي تم تصديره من خلال AI Edge PATH
tokenizer_model المسار إلى نموذج برنامج إنشاء الرموز المميّزة لـ CentencePiece. PATH
start_token الرمز المميّز للبدء الخاص بالنموذج. يجب أن يكون رمز البدء متوفرًا في نموذج أداة إنشاء الرموز المميّزة الذي تم تقديمه. سلسلة
stop_tokens رموز محطة توقف خاصة بالنموذج. يجب أن تكون رموز التوقف مضمَّنة في نموذج أداة إنشاء الرموز المميّزة الذي تمّ توفيره. القائمة[STRING]
output_filename اسم ملف حزمة مهام المخرجات PATH

إضافة نموذج إلى دليل المشروع

قم بتخزين النموذج في دليل مشروعك:

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

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

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

إنشاء المهمة

استخدِم إحدى وظائف createFrom...() في واجهة برمجة التطبيقات LLM Inference API لإعداد المهمة لتشغيل الاستنتاجات. يمكنك استخدام الدالة createFromModelPath() مع مسار نسبي أو مطلق إلى ملف النموذج المدرَّب. يستخدم مثال الرمز الدالة createFromOptions(). لمزيد من المعلومات حول خيارات الضبط المتاحة، يُرجى الاطّلاع على خيارات الضبط.

يوضح الرمز البرمجي التالي كيفية إنشاء هذه المهمة وتكوينها:

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-int4.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

خيارات الضبط

تشمل هذه المهمة خيارات الضبط التالية لتطبيقات الويب وJavaScript:

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

إعداد البيانات

تقبل واجهة برمجة التطبيقات LLM Inference API البيانات النصية (string). تتعامل المهمة مع المعالجة المسبقة لإدخال البيانات، بما في ذلك إنشاء الرموز المميزة والمعالجة المسبقة للتوتر.

وتتم معالجة كل عمليات المعالجة المسبقة ضمن دالة generateResponse(). ليست هناك حاجة إلى إجراء المزيد من المعالجة المسبقة للنص الذي يتم إدخاله.

const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";

تنفيذ المهمة

تستخدم واجهة برمجة التطبيقات LLM Inference API الدالة 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 سلسلة تتضمّن نص الاستجابة الذي تم إنشاؤه.

Here's a draft you can use:

Subject: Lunch on Saturday Reminder

Hi Brett,

Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.

Looking forward to it!

Best,
[Your Name]

تخصيص نموذج LoRA

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

تتوافق LoRA مع واجهة برمجة التطبيقات LLM Inference API مع طرازَي Gemma-2B وPhi-2 للخلفية الخلفية لوحدة معالجة الرسومات، مع توفُّر ترجيحات LoRA على طبقات الانتباه فقط. ويعمل هذا التنفيذ الأولي بمثابة واجهة برمجة تطبيقات تجريبية للتطويرات المستقبلية التي تتضمّن خططًا لإتاحة المزيد من النماذج وأنواعًا مختلفة من الطبقات في التحديثات القادمة.

إعداد نماذج LoRA

اتّبِع التعليمات الواردة على HuggingFace لتدريب نموذج LoRA الذي تم ضبطه بدقة على مجموعة البيانات الخاصة بك باستخدام أنواع النماذج المتوافقة، مثل Gemma-2B أو Phi-2. يتوفّر كلٌّ من طرازَي Gemma-2B وPhi-2 على HuggingFace بتنسيق آمن للمَهمّة. بما أنّ واجهة برمجة التطبيقات LLM Inference API لا تتيح استخدام LoRA إلا على طبقات الانتباه، يمكنك تحديد طبقات الانتباه فقط أثناء إنشاء LoraConfig على النحو التالي:

# For Gemma-2B
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 المحسَّنة والمحسَّنة للجميع والتي تناسب واجهة برمجة التطبيقات LLM Inference API على HuggingFace. على سبيل المثال، monsterapi/gemma-2b-lora-maths-orca-200k لـ Gemma-2B وlole25/phi-2-sft-ultrachat-lora لـ Phi-2.

بعد التدريب على مجموعة البيانات المعدة وحفظ النموذج، تحصل على ملف adapter_model.safetensors يحتوي على ترجيح نموذج LoRA الدقيق. ملف Safetenors هو نقطة مراجعة LoRA المستخدمة في تحويل النموذج.

الخطوة التالية هي تحويل أوزان النموذج إلى TensorFlow Lite Flatbuffer باستخدام حزمة MediaPipe Python. يجب أن تحدد السمة ConversionConfig خيارات الطراز الأساسي بالإضافة إلى خيارات نموذج RAID الإضافية. يُرجى ملاحظة أنّه يجب ضبط الخلفية على 'gpu' بما أنّ واجهة برمجة التطبيقات لا تتيح سوى استنتاج 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_TFLITE_FILE,
)

converter.convert_checkpoint(config)

سيخرج المحوِّل ملفين للمخزن المؤقت TFLite، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.

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

تم تعديل واجهة برمجة التطبيقات Web, Android وiOS لاستنتاج النموذج اللغوي الكبير (LLM) لإتاحة استنتاج نموذج LoRA. تتيح الويب إمكانية استخدام LoRA الديناميكي، والتي يمكنها تبديل نماذج LoRA المختلفة أثناء وقت التشغيل. يدعم Android وiOS بيانات 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 من خلال تمرير مرجع نموذج LoRA أثناء إنشاء استجابة "النموذج اللغوي الكبير" (LLM).

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