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

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

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

بالإضافة إلى النماذج المتوافقة، يمكن للمستخدمين استخدام AI Edge Torch من Google لتصدير نماذج PyTorch إلى نماذج LiteRT (tflite) متعددة التوقيعات، والتي يتم تجميعها مع مَعلمات أداة تحليل النصوص لإنشاء حِزم مهام متوافقة مع واجهة برمجة التطبيقات LLM Inference API.

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

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

مثال رمز MediaPipe Tasks هو تطبيق أساسي لواجهة برمجة تطبيقات LLM Inference API لنظام التشغيل iOS. يمكنك استخدام التطبيق كنقطة بداية لتطبيقك الخاص على نظام التشغيل iOS، أو الرجوع إليه عند تعديل تطبيق حالي. يتم استضافة مثال رمز واجهة برمجة التطبيقات LLM Inference API على 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/ios/
    

بعد إنشاء نسخة محلية من نموذج الرمز البرمجي، يمكنك تثبيت مكتبة مهام MediaPipe وفتح المشروع باستخدام Xcode وتشغيل التطبيق. للاطّلاع على التعليمات، راجِع دليل الإعداد لنظام التشغيل iOS.

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

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

التبعيات

تستخدِم واجهة برمجة التطبيقات LLM Inference API مكتبة MediaPipeTasksGenai التي يجب تثبيتها باستخدام CocoaPods. تتوافق المكتبة مع تطبيقات Swift وObjective-C، ولا تتطلّب أي إعدادات إضافية خاصة باللغة.

للحصول على تعليمات لتثبيت CocoaPods على نظام التشغيل macOS، يُرجى الرجوع إلى دليل تثبيت CocoaPods. للحصول على تعليمات حول كيفية إنشاء Podfile باستخدام الحِزم اللازمة لتطبيقك، يُرجى الاطّلاع على مقالة استخدام CocoaPods.

أضِف مجموعة MediaPipeTasksGenai في Podfile باستخدام الرمز التالي:

target 'MyLlmInferenceApp' do
  use_frameworks!
  pod 'MediaPipeTasksGenAI'
  pod 'MediaPipeTasksGenAIC'
end

إذا كان تطبيقك يتضمّن أهداف اختبار الوحدات، يمكنك الرجوع إلى دليل الإعداد لنظام التشغيل iOS للحصول على معلومات إضافية عن إعداد Podfile.

الطراز

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

تنزيل نموذج

نزِّل نموذجًا وأضِفه إلى دليل مشروعك باستخدام Xcode. للحصول على تعليمات حول كيفية إضافة ملفات إلى مشروع Xcode، يُرجى الاطّلاع على مقالة إدارة الملفات والمجلدات في مشروع Xcode.

قبل بدء واجهة برمجة التطبيقات Inference API لنموذج اللغة الكبيرة، نزِّل أحد النماذج المتوافقة واخزِّن الملف ضمن دليل مشروعك:

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

بالإضافة إلى النماذج المتوافقة، يمكنك استخدام AI Edge Torch من Google لتصدير نماذج PyTorch إلى نماذج LiteRT (tflite) متعددة التوقيعات. لمزيد من المعلومات، يُرجى الاطّلاع على محوِّل Torch التوليدي لنماذج PyTorch.

ننصحك باستخدام Gemma-2 2B، وهي متاحة على Kaggle Models. لمزيد من المعلومات عن النماذج الأخرى المتاحة، يمكنك الاطّلاع على النظرة العامة على المهمة قسم "النماذج".

تحويل النموذج إلى تنسيق MediaPipe

تتوافق واجهة برمجة التطبيقات LLM Inference API مع نوعَين من الفئات، ويتطلّب بعض هذه الأنواع تحويل النموذج. استخدِم الجدول لتحديد الخطوات المطلوبة الطريقة المناسبة لنموذجك.

النماذج طريقة الإحالة الناجحة الأنظمة الأساسية المتوافقة نوع الملف
الطُرز المتوافقة Gemma 2B وGemma 7B وGemma-2 2B وPhi-2 وStableLM وFalcon MediaPipe Android وiOS والويب ‎.bin
نماذج PyTorch الأخرى جميع نماذج PyTorch LLM مكتبة AI Edge Torch التوليدية Android وiOS ‎.task

نحن نستضيف ملفات .bin المحوَّلة لبيانات Gemma 2B وGemma 7B وGemma-2 2B على Kaggle. ويمكن نشر هذه النماذج مباشرةً باستخدام واجهة برمجة التطبيقات LLM Inference API. للاطّلاع على كيفية تحويل نماذج أخرى، اطّلِع على قسم تحويل النماذج.

أنشئ المهمة.

يمكنك إنشاء مهمة واجهة برمجة التطبيقات لإجراء الاستنتاجات من النصوص الطويلة من خلال استدعاء أحد مُنشئِيها. يحدِّد مُنشئ LlmInference(options:) قيمًا لخيارات الضبط.

إذا لم تكن بحاجة إلى واجهة برمجة تطبيقات LLM Inference API تم إعدادها باستخدام خيارات إعداد مخصّصة، يمكنك استخدام أداة الإعداد LlmInference(modelPath:) لإنشاء واجهة برمجة تطبيقات LLM Inference API باستخدام الخيارات التلقائية. لمزيد من المعلومات عن خيارات الإعداد، يُرجى الاطّلاع على نظرة عامة على الإعداد.

يوضّح الرمز البرمجي التالي كيفية إنشاء هذه المهمة وضبطها.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")

let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101

let llmInference = try LlmInference(options: options)

خيارات الضبط

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات iOS:

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

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

تعمل واجهة برمجة التطبيقات LLM Inference API مع البيانات النصية. تعالج المهمة معالجة مقدمات البيانات ، بما في ذلك تقسيم المحتوى إلى وحدات ومعالجة مقدمات مصفوفات Tensor.

تتم معالجة جميع عمليات المعالجة المُسبَقة ضمن دالة generateResponse(inputText:). ولا حاجة إلى إجراء معالجة مسبقة إضافية للنص الذي يتم إدخاله مسبقًا.

let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

تنفيذ المهمة

لتنفيذ واجهة برمجة التطبيقات LLM Inference API، استخدِم الطريقة generateResponse(inputText:). تعرض واجهة برمجة التطبيقات LLM Inference API الفئات المحتمَلة للنص الذي تم إدخاله.

let result = try LlmInference.generateResponse(inputText: inputPrompt)

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

let resultStream =  LlmInference.generateResponseAsync(inputText: inputPrompt)

do {
  for try await partialResult in resultStream {
    print("\(partialResult)")
  }
  print("Done")
}
catch {
  print("Response error: '\(error)")
}

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

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

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

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

إنّ توافق LoRA مع واجهة برمجة التطبيقات LLM Inference API يعمل مع جميع أنواع Gemma ونماذج Phi-2 لنظام التشغيل الخلفي لوحدة معالجة الرسومات، مع تطبيق أوزان LoRA على طبقات الانتباه فقط. يُعدّ هذا التنفيذ الأولي واجهة برمجة تطبيقات تجريبية للتطويرات القادمة، مع خطط لإتاحة المزيد من النماذج وأنواع مختلفة من الطبقات في التحديثات القادمة.

إعداد نماذج LoRA

اتّبِع التعليمات الواردة في HuggingFace لتدريب نموذج LoRA محسّن على مجموعة البيانات الخاصة بك باستخدام أنواع النماذج المتوافقة، Gemma أو Phi-2. يتوفّر كل من نماذج Gemma-2 2B وGemma 2B وPhi-2 على منصّة HuggingFace بتنسيق safetensors. بما أنّ واجهة برمجة التطبيقات 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 محسّنة متاحة للجميع تتوافق مع واجهة برمجة التطبيقات 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 المحسّنة. ملف safetensors هو نقطة تفتيش LoRA المستخدَمة في تحويل النموذج.

في الخطوة التالية، عليك تحويل أوزان النموذج إلى تنسيق TensorFlow Lite Flatbuffer باستخدام حزمة MediaPipe Python. يجب أن يحدد 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 flatbuffer، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.

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

تم تعديل واجهة برمجة التطبيقات الخاصة بعملية الاستنتاج في نموذج اللغة الضخمة (LLM) على الويب وAndroid وiOS لتتيح الاستنتاج في نموذج LoRA.

يتوافق نظام التشغيل iOS مع بروتوكول LoRA الثابت أثناء الإعداد. لتحميل نموذج LoRA، يحدّد المستخدمون مسار نموذج LoRA بالإضافة إلى النموذج اللغوي الكبير الأساسي.

import MediaPipeTasksGenai

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
                                      ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath

let llmInference = try LlmInference(options: options)

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