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

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

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

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

البدء السريع

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

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

إضافة حِزم تابعة

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

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

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

تنزيل نموذج

يمكنك تنزيل Gemma-2 2B بتنسيق كمّي 8 بت من نماذج Kaggle. لمزيد من المعلومات عن النماذج المتاحة، يُرجى الاطّلاع على مستندات النماذج.

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

إعداد المهمة

ابدأ المهمة باستخدام خيارات الإعداد الأساسية:

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)

تنفيذ المهمة

استخدِم طريقة generateResponse(inputText:) لإنشاء ردّ نصي. يؤدي ذلك إلى إنشاء ردّ واحد.

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)")
}

تطبيق نموذجي

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

استنسِخ مستودع git باستخدام الأمر التالي:

git clone https://github.com/google-ai-edge/mediapipe-samples

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

خيارات الإعداد

استخدِم خيارات الإعداد التالية لإعداد تطبيق iOS:

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

تحويل النماذج

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

النماذج طريقة الإحالة الناجحة الأنظمة الأساسية المتوافقة نوع الملف
Gemma-3 1B لا يلزم إجراء أي تحويل ‫Android، الويب .task
‫Gemma 2B وGemma 7B وGemma-2 2B لا يلزم إجراء أي تحويل ‫Android وiOS والويب ‎.bin
Phi-2 وStableLM وFalcon نص الإحالة الناجحة في MediaPipe ‫Android وiOS والويب ‎.bin
جميع نماذج LLM في PyTorch مكتبة LiteRT Torch Generative Android وiOS .task

للتعرّف على كيفية تحويل نماذج أخرى، راجِع قسم تحويل النماذج.

تخصيص LoRA

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

تتيح واجهة LLM Inference API إضافة أوزان LoRA إلى طبقات الانتباه في نماذج Gemma-2 2B وGemma 2B وPhi-2. نزِّل النموذج بتنسيق safetensors.

يجب أن يكون النموذج الأساسي بالتنسيق safetensors لإنشاء أوزان LoRA. بعد التدريب باستخدام LoRA، يمكنك تحويل النماذج إلى تنسيق FlatBuffers لتشغيلها على MediaPipe.

إعداد أوزان LoRA

استخدِم دليل طُرق LoRA من PEFT لتدريب نموذج LoRA تم تحسينه على مجموعة البيانات الخاصة بك.

لا تتيح واجهة برمجة التطبيقات 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 المعدَّل بدقة في adapter_model.safetensors. ملف safetensors هو نقطة التحقّق من LoRA المستخدَمة أثناء تحويل النموذج.

تحويل النماذج

استخدِم حزمة MediaPipe Python لتحويل أوزان النموذج إلى تنسيق Flatbuffer. تحدّد ConversionConfig خيارات النموذج الأساسي بالإضافة إلى خيارات 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_FILE,
)

converter.convert_checkpoint(config)

سينتج المحوّل ملفَّي Flatbuffer، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.

استنتاج نموذج 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)

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