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

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

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

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

إنّ الرمز البرمجي لمهام MediaPipe هو تنفيذ أساسي لتطبيق 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) مكتبة 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.

تنزيل Gemma 2B

عند إنشاء تطبيقات iOS، استخدِم أحد الخيارات التالية:

  • gemma-2b-it-cpu-int4: نموذج Gemma 4 بت متوافق مع وحدة المعالجة المركزية (CPU).
  • gemma-2b-it-gpu-int4: نموذج Gemma 4 بت متوافق مع وحدة معالجة الرسومات.
  • نماذج ربط AI Edge Torch تتوافق مع متطلبات الذاكرة في نظام التشغيل iOS

لمزيد من المعلومات حول النماذج الأخرى، راجع نظرة عامة على المهام قسم النماذج.

إنشاء المهمة

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

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

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

تعمل واجهة برمجة التطبيقات اللغوية الكبيرة (LLM) مع البيانات النصية. تتعامل المهمة مع المعالجة المسبقة لإدخال البيانات، بما في ذلك إنشاء الرموز المميزة والمعالجة المسبقة للتوتر.

وتتم معالجة كل عمليات المعالجة المسبقة ضمن دالة 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 حقل 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 نفسها طوال مدة المهمة.

يدعم iOS بيانات LoRA الثابتة أثناء التهيئة. لتحميل نموذج LoRA، يحدّد المستخدمون مسار نموذج LoRA بالإضافة إلى النموذج اللغوي الكبير الأساسي (LLM).

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() نفسها المستخدَمة في النموذج الأساسي.