تتيح لك واجهة برمجة التطبيقات اللغوية الكبيرة (LLM) تشغيل النماذج اللغوية الكبيرة (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 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()
نفسها المستخدَمة في النموذج الأساسي.