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

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

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

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

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

تنزيل نموذج

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

تنزيل Gemma 2B

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

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

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

إنشاء المهمة

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

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

يوضح الرمز التالي كيفية إنشاء هذه المهمة وإعدادها.

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

تجهيز البيانات

تعمل LLM Inference API مع البيانات النصية. تتعامل المهمة مع إدخال البيانات المعالجة المسبقة، بما في ذلك الترميز والمعالجة المسبقة لـ Tenor.

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

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

تنفيذ المهمة

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

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

يمكن ضبط واجهة برمجة تطبيقات استدلال الوسائط اللغوية الكبيرة (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 نفسها خلال مدة المهمة.

يتوافق 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)

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