تتيح لك واجهة LLM Inference API تشغيل النماذج اللغوية الكبيرة (LLM) على الجهاز فقط. لتطبيقات Android، التي يمكنك استخدامها لأداء مجموعة واسعة من المهام، مثل إنشاء النصوص واسترجاع المعلومات بصيغة لغة طبيعية وتلخيص الوثائق. توفر المهمة دعمًا مدمجًا لعدة تحويل النص إلى نص نماذج لغوية كبيرة، كي تتمكّن من تطبيق أحدث نسخة من تلك النماذج على الجهاز فقط نماذج الذكاء الاصطناعي التوليدي على تطبيقات Android الخاصة بك.
تتوافق المهمة مع Gemma 2B، جزء من مجموعة من النماذج الخفيفة والعصرية المفتوحة التي تم إنشاؤها من نفس البحث والتكنولوجيا المستخدمة لإنشاء نماذج Gemini. كما أنّها تتيح استخدام النماذج الخارجية التالية: Phi-2، Falcon-RW-1B StableLM-3B، مع جميع النماذج التي يتم تصديرها من خلال AI Edge
مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط هذه المهمة، راجع نظرة عامة.
مثال على الرمز البرمجي
يشير هذا الدليل إلى مثال على تطبيق أساسي لإنشاء النص لنظام التشغيل Android. إِنْتَ يمكنك استخدام التطبيق كنقطة بداية لتطبيق Android الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز على GitHub.
تنزيل الرمز
توضّح لك التعليمات التالية كيفية إنشاء نسخة على الجهاز من هذا المثال. باستخدام أداة سطر الأوامر git.
لتنزيل نموذج الرمز:
- استنساخ مستودع git باستخدام الأمر التالي:
git clone https://github.com/google-ai-edge/mediapipe-samples
- يمكنك اختياريًا ضبط مثيل 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()
نفسها المستخدَمة في النموذج الأساسي.