راهنمای استنتاج LLM برای iOS

رابط برنامه‌نویسی کاربردی استنتاج LLM به شما امکان می‌دهد مدل‌های زبان بزرگ (LLM) را به‌طور کامل روی دستگاه برای برنامه‌های iOS اجرا کنید، که می‌توانید از آن‌ها برای انجام طیف گسترده‌ای از وظایف، مانند تولید متن، بازیابی اطلاعات به شکل زبان طبیعی و خلاصه‌سازی اسناد، استفاده کنید. این وظیفه پشتیبانی داخلی برای چندین مدل زبان بزرگ متن به متن را فراهم می‌کند، بنابراین می‌توانید جدیدترین مدل‌های هوش مصنوعی مولد روی دستگاه را روی برنامه‌های iOS خود اعمال کنید.

برای افزودن سریع LLM Inference API به برنامه iOS خود، از راهنمای شروع سریع (Quickstart) استفاده کنید. برای مثال ساده‌ای از یک برنامه iOS که LLM Inference API را اجرا می‌کند، به برنامه نمونه مراجعه کنید. برای درک عمیق‌تر نحوه عملکرد LLM Inference API، به بخش‌های گزینه‌های پیکربندی ، تبدیل مدل و تنظیم LoRA مراجعه کنید.

شما می‌توانید این وظیفه را در عمل با نسخه آزمایشی MediaPipe Studio مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این وظیفه، به نمای کلی مراجعه کنید.

شروع سریع

برای افزودن API استنتاج LLM به برنامه iOS خود، مراحل زیر را دنبال کنید. API استنتاج LLM از کتابخانه MediaPipeTasksGenai استفاده می‌کند که باید با استفاده از CocoaPods نصب شود. این کتابخانه با برنامه‌های Swift و Objective-C سازگار است و نیازی به تنظیمات اضافی مربوط به زبان ندارد.

برای دستورالعمل‌های نصب CocoaPods در macOS، به راهنمای نصب CocoaPods مراجعه کنید. برای دستورالعمل‌های مربوط به نحوه ایجاد یک Podfile با podهای لازم برای برنامه خود، به استفاده از CocoaPods مراجعه کنید.

اضافه کردن وابستگی‌ها

با استفاده از کد زیر، پاد MediaPipeTasksGenai را به Podfile اضافه کنید:

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

اگر برنامه شما شامل اهداف تست واحد است، برای اطلاعات بیشتر در مورد تنظیم Podfile خود به راهنمای تنظیم برای iOS مراجعه کنید.

دانلود یک مدل

Gemma-2 2B را با فرمت کوانتیزه ۸ بیتی از Kaggle Models دانلود کنید. برای اطلاعات بیشتر در مورد مدل‌های موجود، به مستندات Models مراجعه کنید.

مدل را با استفاده از 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 است که از API استنتاج LLM استفاده می‌کند. می‌توانید از این برنامه به عنوان نقطه شروع برای برنامه iOS خود استفاده کنید یا هنگام تغییر یک برنامه موجود به آن مراجعه کنید. کد نمونه در GitHub میزبانی می‌شود.

مخزن git را با استفاده از دستور زیر کلون کنید:

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

پس از ایجاد یک نسخه محلی از کد نمونه، می‌توانید پروژه را به iOS Studio وارد کرده و برنامه را اجرا کنید. برای اطلاعات بیشتر، به راهنمای راه‌اندازی برای iOS مراجعه کنید.

گزینه‌های پیکربندی

برای تنظیم یک برنامه iOS از گزینه‌های پیکربندی زیر استفاده کنید:

نام گزینه توضیحات محدوده ارزش مقدار پیش‌فرض
modelPath مسیر جایی که مدل در دایرکتوری پروژه ذخیره می‌شود. مسیر ناموجود
maxTokens حداکثر تعداد توکن‌ها (توکن‌های ورودی + توکن‌های خروجی) که مدل مدیریت می‌کند. عدد صحیح ۵۱۲
topk تعداد توکن‌هایی که مدل در هر مرحله از تولید در نظر می‌گیرد. پیش‌بینی‌ها را به k توکن برتر با بیشترین احتمال تولید محدود می‌کند. عدد صحیح ۴۰
temperature میزان تصادفی بودنِ ایجاد شده در طول تولید. دمای بالاتر منجر به خلاقیت بیشتر در متن تولید شده می‌شود، در حالی که دمای پایین‌تر تولید قابل پیش‌بینی‌تری را ایجاد می‌کند. شناور ۰.۸
randomSeed بذر تصادفی مورد استفاده در طول تولید متن. عدد صحیح 0
loraPath مسیر مطلق به مدل LoRA به صورت محلی روی دستگاه. توجه: این فقط با مدل‌های GPU سازگار است. مسیر ناموجود

تبدیل مدل

رابط برنامه‌نویسی کاربردی استنتاج LLM با انواع مدل‌های زیر سازگار است که برخی از آنها نیاز به تبدیل مدل دارند. از جدول برای شناسایی روش مراحل مورد نیاز برای مدل خود استفاده کنید.

مدل‌ها روش تبدیل پلتفرم‌های سازگار نوع فایل
جما-۳ ۱ب تبدیل لازم نیست اندروید، وب .وظیفه
Gemma 2B، Gemma 7B، Gemma-2 2B تبدیل لازم نیست اندروید، آی‌او‌اس، وب .bin
فی-۲، استیبل ال‌ام، فالکون اسکریپت تبدیل MediaPipe اندروید، آی‌او‌اس، وب .bin
تمام مدل‌های PyTorch LLM کتابخانه مولد LiteRT Torch اندروید، آی‌او‌اس .وظیفه

برای یادگیری نحوه تبدیل مدل‌های دیگر، به بخش تبدیل مدل مراجعه کنید.

سفارشی‌سازی LoRA

رابط برنامه‌نویسی کاربردی استنتاج LLM از تنظیم LoRA (انطباق با رتبه پایین) با استفاده از کتابخانه PEFT (تنظیم دقیق پارامتر-کارآمد) پشتیبانی می‌کند. تنظیم LoRA رفتار LLMها را از طریق یک فرآیند آموزش مقرون‌به‌صرفه سفارشی می‌کند و به جای آموزش مجدد کل مدل، مجموعه کوچکی از وزن‌های قابل آموزش را بر اساس داده‌های آموزشی جدید ایجاد می‌کند.

رابط برنامه‌نویسی کاربردی استنتاج LLM از افزودن وزن‌های LoRA به لایه‌های توجه مدل‌های Gemma-2 2B ، Gemma 2B و Phi-2 پشتیبانی می‌کند. مدل را با فرمت safetensors دانلود کنید.

مدل پایه باید در قالب safetensors باشد تا بتوان وزن‌های LoRA را ایجاد کرد. پس از آموزش LoRA، می‌توانید مدل‌ها را به قالب FlatBuffers تبدیل کنید تا روی MediaPipe اجرا شوند.

وزن‌های LoRA را آماده کنید

از راهنمای روش‌های LoRA از PEFT برای آموزش یک مدل LoRA تنظیم‌شده روی مجموعه داده خودتان استفاده کنید.

API استنتاج LLM فقط از 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 برای تبدیل وزن‌های مدل به فرمت 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 و همچنین 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() مدل پایه استفاده کنید.