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

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

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

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

البدء السريع

اتّبِع الخطوات التالية لإضافة واجهة برمجة التطبيقات LLM Inference API إلى تطبيق Android. تم تحسين واجهة برمجة التطبيقات LLM Inference API لأجهزة Android المتطوّرة، مثل Pixel 8 و Samsung S23 أو الإصدارات الأحدث، ولا تتوافق بشكل موثوق مع محاكيات الأجهزة.

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

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

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

تنزيل نموذج

نزِّل Gemma-3 1B بتنسيق كمية 4 بت من Hugging Face. لمزيد من المعلومات عن النماذج المتاحة، اطّلِع على مستندات النماذج.

أرسِل محتوى مجلد 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.task

إعداد المهمة

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

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath('/data/local/tmp/llm/model_version.task')
        .setMaxTopK(64)
        .build()

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

تنفيذ المهمة

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

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)

نموذج طلب

للاطّلاع على واجهات برمجة التطبيقات الخاصة باستنتاج النماذج اللغوية الكبيرة واستكشاف مجموعة شاملة من إمكانات الذكاء الاصطناعي التوليدي على الجهاز فقط، يمكنك الاطّلاع على تطبيق Google AI Edge Gallery.

"معرض Google AI Edge" هو تطبيق مفتوح المصدر لنظام التشغيل Android يُعدّ ساحة تفاعلية للمطوّرين. ويعرض ما يلي:

  • أمثلة عملية لاستخدام واجهة برمجة التطبيقات لإجراء الاستنتاجات من النماذج اللغوية الكبيرة (LLM) في مهام مختلفة، بما في ذلك:
    • طرح أسئلة حول صورة: حمِّل صورة واطرح أسئلة بشأنها. الحصول على أوصاف أو حلّ المشاكل أو تحديد الأجسام
    • أداة إنشاء الطلبات: يمكنك تلخيص الطلبات أو إعادة كتابتها أو إنشاء رمز لها أو استخدام طلبات التنسيق الحر لاستكشاف حالات استخدام النماذج اللغوية الكبيرة ذات الردّ الواحد.
    • الدردشة مع الذكاء الاصطناعي: يمكنك التفاعل في محادثات متعددة الأدوار.
  • إمكانية اكتشاف مجموعة متنوعة من نماذج LiteRT المحسّنة وتنزيلها وتجربتها من "مجتمع Hugging Face LiteRT" وإصدارات Google الرسمية (مثل Gemma 3N)
  • مقاييس الأداء على الجهاز في الوقت الفعلي لطُرز مختلفة (وقت التحميل للرمز الأول وسرعة فك التشفير وما إلى ذلك)
  • كيفية استيراد نماذج .task المخصّصة واختبارها

يُعدّ هذا التطبيق مرجعًا لفهم التنفيذ العملي لواجهة برمجة التطبيقات LLM Inference API وإمكانيات الذكاء الاصطناعي التوليدي على الجهاز فقط. يمكنك الاطّلاع على رمز المصدر وتنزيل التطبيق من مستودع GitHub في "معرض الذكاء الاصطناعي من Google للأجهزة الطرفية".

خيارات الضبط

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

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

طلب المعلومات باستخدام وسائط متعددة

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

للبدء، استخدِم إصدارًا متوافقًا مع MediaPipe من Gemma 3n:

لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Gemma-3n.

لتقديم صور ضمن طلب، عليك تحويل الصور أو اللقطات المُدخلة إلى عنصر com.google.mediapipe.framework.image.MPImage قبل تمريرها إلى واجهة برمجة التطبيقات LLM Inference API:

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()

لتفعيل ميزة الرؤية لواجهة برمجة التطبيقات LLM Inference API، اضبط خيار الضبط EnableVisionModality على true ضمن خيارات الرسم البياني:

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    ...
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

يمكن لـ Gemma-3n قبول صورة واحدة كحد أقصى في كل جلسة، لذا اضبط MaxNumImages على 1.

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(1)
  .build();

في ما يلي مثال على تنفيذ واجهة برمجة التطبيقات LLM Inference API التي تم إعدادها للتعامل مع إدخالات الرؤية والنصوص:

MPImage image = getImageFromAsset(BURGER_IMAGE);

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    .setTopK(10)
    .setTemperature(0.4f)
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

try (LlmInference llmInference =
    LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
  LlmInferenceSession session =
    LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
  session.addQueryChunk("Describe the objects in the image.");
  session.addImage(image);
  String result = session.generateResponse();
}

تخصيص 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)

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

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

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

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

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

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