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

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

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

نمونه کد

کد مثال MediaPipe Tasks یک پیاده سازی اساسی از یک برنامه API استنتاج LLM برای iOS است. می‌توانید از برنامه به‌عنوان نقطه شروع برای برنامه iOS خودتان استفاده کنید، یا هنگام تغییر یک برنامه موجود به آن مراجعه کنید. کد نمونه API LLM Inference در GitHub میزبانی می شود.

کد را دانلود کنید

دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.

برای دانلود کد نمونه:

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

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. به صورت اختیاری، نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایل‌های برنامه نمونه API LLM Inference را داشته باشید:

    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 pod را در Podfile اضافه کنید:

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

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

مدل

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

دانلود یک مدل

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

Gemma 2B را دانلود کنید

هنگام ساخت برنامه های iOS، از یکی از انواع زیر استفاده کنید:

  • gemma-2b-it-cpu-int4 : مدل 4 بیتی Gemma با سازگاری با CPU.
  • gemma-2b-it-gpu-int4 : مدل 4 بیتی Gemma با سازگاری GPU.
  • AI Edge Torch مدل هایی را ترسیم کرد که با نیازهای حافظه iOS مطابقت دارند.

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

کار را ایجاد کنید

می توانید با فراخوانی یکی از اولیه سازهای آن، وظیفه LLM Inference API را ایجاد کنید. مقداردهی اولیه را برای گزینه های پیکربندی LlmInference(options:) تنظیم می کند.

اگر به یک API استنتاج LLM که با گزینه های پیکربندی سفارشی راه اندازی شده است نیاز ندارید، می توانید از مقداردهی اولیه LlmInference(modelPath:) برای ایجاد یک API استنتاج 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 مسیری که مدل در دایرکتوری پروژه ذخیره می شود. مسیر N/A
maxTokens حداکثر تعداد نشانه‌ها (توکن‌های ورودی + نشانه‌های خروجی) که مدل کنترل می‌کند. عدد صحیح 512
topk تعداد نشانه هایی که مدل در هر مرحله از تولید در نظر می گیرد. پیش‌بینی‌ها را به k توکن‌های محتمل‌تر محدود می‌کند. هنگام تنظیم topk ، باید یک مقدار برای randomSeed نیز تعیین کنید. عدد صحیح 40
temperature مقدار تصادفی معرفی شده در طول تولید. دمای بالاتر منجر به خلاقیت بیشتر در متن تولید شده می شود، در حالی که دمای پایین تر تولید قابل پیش بینی بیشتری را تولید می کند. هنگام تنظیم temperature ، باید مقداری برای randomSeed نیز تعیین کنید. شناور 0.8
randomSeed دانه تصادفی مورد استفاده در تولید متن. عدد صحیح 0
loraPath مسیر مطلق به مدل LoRA به صورت محلی در دستگاه. توجه: این فقط با مدل های GPU سازگار است. مسیر N/A

داده ها را آماده کنید

LLM Inference API با داده های متنی کار می کند. این وظیفه، پیش پردازش ورودی داده، از جمله پیش پردازش توکن و تانسور را انجام می دهد.

تمام پیش پردازش ها در تابع 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

Mediapipe LLM inference API را می توان برای پشتیبانی از سازگاری با رتبه پایین (LoRA) برای مدل های زبان بزرگ پیکربندی کرد. توسعه دهندگان با استفاده از مدل های LoRA دقیق تنظیم شده می توانند رفتار LLM ها را از طریق یک فرآیند آموزشی مقرون به صرفه سفارشی کنند.

پشتیبانی LoRA از LLM Inference API برای مدل‌های Gemma-2B و Phi-2 برای باطن GPU کار می‌کند، با وزن‌های LoRA فقط برای لایه‌های توجه قابل اعمال است. این پیاده‌سازی اولیه به‌عنوان یک API آزمایشی برای پیشرفت‌های آینده با برنامه‌هایی برای پشتیبانی از مدل‌های بیشتر و انواع لایه‌های مختلف در به‌روزرسانی‌های آتی عمل می‌کند.

مدل های 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 تنظیم شده به دست می آورید. فایل Safetensors نقطه بازرسی LoRA است که در تبدیل مدل استفاده می شود.

به عنوان گام بعدی، باید وزن های مدل را با استفاده از بسته MediaPipe Python به یک Flatbuffer Flatbuffer TensorFlow Lite تبدیل کنید. ConversionConfig باید گزینه های مدل پایه و همچنین گزینه های LoRA اضافی را مشخص کند. توجه داشته باشید که از آنجایی که API فقط از استنتاج LoRA با GPU پشتیبانی می کند، backend باید روی '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 را خروجی می دهد، یکی برای مدل پایه و دیگری برای مدل LoRA.

استنتاج مدل LoRA

Web، Android و iOS LLM Inference API برای پشتیبانی از استنتاج مدل LoRA به روز شده است. وب از LoRA پویا پشتیبانی می کند، که می تواند مدل های مختلف LoRA را در طول زمان اجرا تغییر دهد. اندروید و 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() به عنوان مدل پایه استفاده کنید.