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

تتيح لك واجهة LLM Inference API تشغيل النماذج اللغوية الكبيرة (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). للحصول على معلومات عامة عن إعداد بيئة التطوير الخاصة بك لاستخدام مهام 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)، يجب تنزيل أحد النماذج المتوافقة تخزين الملف داخل دليل المشروع الخاص بك:

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

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

ننصح باستخدام Gemma 2B، المتاحة على Kaggle الطُرُز والميزات المتوفّرة بتنسيق متوافق مع واجهة LLM Inference API. في حال استخدام نموذج لغوي كبير آخر، عليك تحويل النموذج إلى نموذج لغوي كبير. تنسيق متوافق مع 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 إضافية. لاحظ أنه نظرًا لأن واجهة برمجة التطبيقات يدعم استنتاج LoRA باستخدام وحدة معالجة الرسومات، يجب ضبط الواجهة الخلفية على 'gpu'.

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. المسار
ckpt_format تمثّل هذه السمة تنسيق ملف النموذج. {"safetensors", "pytorch"}
model_type جارٍ تحويل النموذج اللغوي الكبير. {"PHI_2", "FALCON_RW_1B", "STABLELM_4E1T_3B", "GEMMA_2B"}
backend المعالج (المُفوَّض) المستخدَم لتشغيل النموذج. {"cpu", "gpu"}
output_dir المسار إلى دليل الإخراج الذي يستضيف ملفات الوزن لكل طبقة. المسار
output_tflite_file المسار إلى ملف الإخراج. على سبيل المثال، "model_cpu.bin" أو "model_gpu.bin". هذا الملف متوافق فقط مع واجهة برمجة التطبيقات للاستنتاج اللغوي الكبير (LLM)، ولا يمكن استخدامه كملف "tflite" عام. المسار
vocab_model_file المسار إلى الدليل الذي يخزن tokenizer.json tokenizer_config.json ملفًا. بالنسبة إلى Gemma، أشِر إلى ملف tokenizer.model واحد. المسار
lora_ckpt المسار إلى ملف LoRA ckpt الخاص بأدوات السلامة التي تخزن وزن محوّل LoRA. المسار
lora_rank عدد صحيح يمثّل رتبة LoRA ckpt. مطلوبة لتحويل ترجيحات lora. إذا لم يتم تقديمها، يفترض المُحول أنه ليست هناك ترجيحات LoRA. ملاحظة: لا تدعم خلفية وحدة معالجة الرسومات فقط LoRA. عدد صحيح
lora_output_tflite_file إخراج اسم ملف tflite لأوزان LoRA. المسار

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

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

تتطلب عملية تجميع النموذج توفر حزمة 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 المسار إلى AI Edge الذي تم تصدير نموذج TFLite المسار
tokenizer_model المسار إلى نموذج أداة إنشاء الرموز المميّزة لـ SentencePiece المسار
start_token الرمز المميّز للبدء الخاص بالنموذج. يجب أن يكون رمز البدء موجودًا في نموذج أداة إنشاء الرموز المميزة. سلسلة
stop_tokens رموز محطات التوقف الخاصة بالنموذج. يجب أن تكون رموز التوقف موجودة في نموذج أداة إنشاء الرموز المميزة. القائمة[STRING]
output_filename اسم ملف حزمة مهام الإخراج. المسار

إرسال الطراز إلى الجهاز

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

تجهيز البيانات

تقبل واجهة برمجة تطبيقات الاستنتاج اللغوي الكبير (LLM) البيانات التالية:

  • الطلب (سلسلة): سؤال أو طلب
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

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

يتوافق استخدام LoRA مع واجهة برمجة تطبيقات الاستنتاج اللغوي الكبير (LLM) لنماذج Gemma-2B وPhi-2 الواجهة الخلفية لوحدة GPU، مع تطبيق ترجيحات LoRA على طبقات الانتباه فقط. هذا النمط يعمل التنفيذ الأولي بمثابة واجهة برمجة تطبيقات تجريبية للتطويرات المستقبلية مع خطط لدعم المزيد من النماذج وأنواع الطبقات المختلفة في المستقبل التحديثات.

إعداد نماذج LoRA

اتّبِع التعليمات المتعلقة بتطبيق HuggingFace لتدريب نموذج LoRA مضبوط بشكلٍ دقيق على مجموعة بياناتك باستخدام أنواع النماذج المتوافقة، مثل Gemma-2B أو Phi-2. يتوفّر كل من نموذجَي Gemma-2B وPhi-2 على HuggingFace بتنسيق أدوات السلامة. بما أنّ واجهة برمجة تطبيقات الاستنتاج اللغوي الكبير (LLM) لا تتوافق إلا مع 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"],
)

لأغراض الاختبار، تتوفّر على HuggingFace نماذج LoRA محسّنة ومتاحة للجميع تتناسب مع واجهة LLM Inference API. على سبيل المثال، monsterapi/gemma-2b-lora-maths-orca-200k لـ Gemma-2B وlole25/phi-2-sft-ultrachat-lora لـ Phi-2.

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

كخطوة تالية، ستحتاج إلى تحويل ترجيحات النموذج إلى مخزن مؤقت مسطح TensorFlow Lite باستخدام حزمة MediaPipe Python. يجب أن تحدِّد 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.

استنتاج نموذج لوRA

تم تعديل واجهة برمجة التطبيقات LLM للنماذج اللغوية الكبيرة على الويب وAndroid وiOS لإتاحة استنتاج نموذج 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)

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