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

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

وتدعم هذه المهمّة Gemma 2B، وهي جزء من مجموعة من النماذج المفتوحة والخفيفة والمتطوّرة التي تم إنشاؤها من البحث والتكنولوجيا نفسها المستخدَمة في إنشاء نماذج Gemini. وهي تدعم أيضًا النماذج الخارجية التالية: Phi-2 وFalcon-RW-1B وStableLM-3B، بالإضافة إلى جميع النماذج التي يتم تصديرها من خلال AI Edge.

للحصول على مزيد من المعلومات حول الإمكانيات والنماذج وخيارات الإعداد لهذه المهمة، يُرجى الاطّلاع على نظرة عامة.

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

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

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من رمز المثال باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز:

  1. استنسِخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام عمليات الدفع المتفرقة، بحيث لا يكون لديك سوى ملفات نموذج واجهة برمجة التطبيقات LLM Inference API:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/android
    

بعد إنشاء نسخة محلية من الرمز النموذجي، يمكنك استيراد المشروع إلى "استوديو Android" وتشغيل التطبيق. للحصول على التعليمات، يمكنك مراجعة دليل الإعداد لنظام التشغيل Android.

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

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

التبعيات

تستخدِم واجهة برمجة التطبيقات LLM Inference API مكتبة com.google.mediapipe:tasks-genai. أضف هذه التبعية إلى ملف build.gradle لتطبيق Android لديك:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}

الطراز

تتطلّب واجهة برمجة التطبيقات MediaPipe LLM Inference API نموذج لغة "تحويل النص إلى نص" مدرَّبًا ومتوافقًا مع هذه المهمّة. بعد تنزيل نموذج، قم بتثبيت التبعيات المطلوبة وادفع النموذج إلى جهاز Android. إذا كنت تستخدم نموذجًا آخر غير Gemma، فعليك تحويل النموذج إلى تنسيق متوافق مع MediaPipe.

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

تنزيل نموذج

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

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

يمكنك بدلاً من ذلك استخدام النماذج التي تم ربطها وتصديرها من خلال AI Edge Troch.

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

تحويل النموذج إلى تنسيق 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

دفع النموذج إلى الجهاز

دفع محتوى مجلد output_path إلى جهاز Android.

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.bin

إنشاء المهمة

تستخدم واجهة برمجة التطبيقات MediaPipe LLM Inference API الدالة createFromOptions() لإعداد المهمة. تقبل الدالة createFromOptions() قيمًا لخيارات الضبط. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الضبط.

يؤدي الرمز التالي إلى تهيئة المهمة باستخدام خيارات التهيئة الأساسية:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

خيارات الضبط

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

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

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

تقبل واجهة برمجة التطبيقات LLM Inference API الإدخالات التالية:

  • الطلب (سلسلة): سؤال أو طلب
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

تنفيذ المهمة

استخدِم الطريقة generateResponse() لإنشاء ردّ نصي على نص الإدخال الذي تم تقديمه في القسم السابق (inputPrompt). ويؤدي ذلك إلى إنشاء ردّ واحد.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

لبدء بث الرد، استخدِم الطريقة generateResponseAsync().

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

التعامل مع النتائج وعرضها

تعرض واجهة برمجة التطبيقات LLM Inference API حقل LlmInferenceResult الذي يتضمّن نص الردّ الذي تم إنشاؤه.

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 نفسها طوال مدة المهمة.

يتيح Android استخدام LoRA الثابتة أثناء الإعداد. لتحميل نموذج LoRA، يحدّد المستخدمون مسار نموذج LoRA بالإضافة إلى النموذج اللغوي الكبير الأساسي (LLM).

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

لتنفيذ استنتاج النموذج اللغوي الكبير باستخدام LoRA، استخدِم طريقة generateResponse() أو generateResponseAsync() نفسها المستخدَمة في النموذج الأساسي.