راهنمای استنتاج LLM برای اندروید

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

این وظیفه از Gemma 2B پشتیبانی می‌کند، بخشی از خانواده مدل‌های باز سبک وزن و پیشرفته که از همان تحقیقات و فناوری استفاده شده برای ایجاد مدل‌های Gemini ساخته شده‌اند. همچنین از مدل‌های خارجی زیر پشتیبانی می‌کند: Phi-2 ، Falcon-RW-1B و StableLM-3B ، به همراه تمام مدل‌های صادر شده از طریق AI Edge.

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

نمونه کد

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

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

برپایی

این بخش مراحل کلیدی را برای راه اندازی محیط توسعه و پروژه های کد به طور خاص برای استفاده از LLM Inference API توضیح می دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای Android مراجعه کنید.

وابستگی ها

LLM Inference API از کتابخانه com.google.mediapipe:tasks-genai استفاده می کند. این وابستگی را به فایل build.gradle برنامه اندروید خود اضافه کنید:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}

مدل

MediaPipe LLM Inference API به یک مدل زبان متن به متن آموزش دیده نیاز دارد که با این کار سازگار باشد. پس از دانلود یک مدل، وابستگی های مورد نیاز را نصب کرده و مدل را به دستگاه اندرویدی فشار دهید. اگر از مدلی غیر از Gemma استفاده می کنید، باید مدل را به فرمت سازگار با MediaPipe تبدیل کنید.

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

دانلود یک مدل

قبل از راه اندازی API استنتاج LLM، یکی از مدل های پشتیبانی شده را دانلود کنید و فایل را در فهرست پروژه خود ذخیره کنید:

  • Gemma 2B : بخشی از خانواده مدل‌های باز سبک وزن و پیشرفته که از همان تحقیقات و فناوری استفاده شده برای ساخت مدل‌های Gemini ساخته شده‌اند. برای انواع وظایف تولید متن، از جمله پاسخ به سؤال، خلاصه‌سازی و استدلال مناسب است.
  • Phi-2 : مدل ترانسفورماتور با پارامتر 2.7 میلیاردی، بهترین گزینه برای فرمت پرسش-پاسخ، چت و کد.
  • Falcon-RW-1B : مدل 1 میلیارد پارامتری فقط رمزگشای علی که روی 350B توکن RefinedWeb آموزش داده شده است.
  • StableLM-3B : مدل زبانی فقط رمزگشای 3 میلیارد پارامتری که از قبل بر روی 1 تریلیون توکن مجموعه داده های انگلیسی و کدهای متنوع آموزش داده شده است.

همچنین، می‌توانید از مدل‌هایی استفاده کنید که از طریق AI Edge Troch نگاشت و صادر شده‌اند.

توصیه می کنیم از Gemma 2B استفاده کنید، که در Kaggle Models موجود است و در قالبی ارائه می شود که از قبل با API استنتاج LLM سازگار است. اگر از LLM دیگری استفاده می کنید، باید مدل را به یک قالب مناسب MediaPipe تبدیل کنید . برای اطلاعات بیشتر در مورد Gemma 2B، به سایت Gemma مراجعه کنید. برای اطلاعات بیشتر در مورد سایر مدل‌های موجود، به بخش مدل‌های نمای کلی کار مراجعه کنید.

تبدیل مدل به فرمت MediaPipe

تبدیل مدل بومی

اگر از LLM خارجی (Phi-2، Falcon، یا StableLM) یا نسخه غیر Kaggle Gemma استفاده می‌کنید، از اسکریپت‌های تبدیل ما برای قالب‌بندی مدل برای سازگاری با MediaPipe استفاده کنید.

فرآیند تبدیل مدل به بسته MediaPipe PyPI نیاز دارد. اسکریپت تبدیل در تمام بسته های MediaPipe بعد از 0.10.11 در دسترس است.

وابستگی ها را با موارد زیر نصب و وارد کنید:

$ python3 -m pip install mediapipe

برای تبدیل مدل از کتابخانه genai.converter استفاده کنید:

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  input_ckpt=INPUT_CKPT,
  ckpt_format=CKPT_FORMAT,
  model_type=MODEL_TYPE,
  backend=BACKEND,
  output_dir=OUTPUT_DIR,
  combine_file_only=False,
  vocab_model_file=VOCAB_MODEL_FILE,
  output_tflite_file=OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

برای تبدیل مدل LoRA، 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.

پارامتر شرح ارزش های پذیرفته شده
input_ckpt مسیر فایل model.safetensors یا pytorch.bin . توجه داشته باشید که گاهی اوقات قالب مدل safetensors به ​​چندین فایل تقسیم می شود، به عنوان مثال model-00001-of-00003.safetensors ، model-00001-of-00003.safetensors . می توانید یک الگوی فایل مانند model*.safetensors را مشخص کنید. مسیر
ckpt_format فرمت فایل مدل {"Safetensors"، "pytorch"}
model_type LLM در حال تبدیل است. {"PHI_2"، "FALCON_RW_1B"، "STABLELM_4E1T_3B"، "GEMMA_2B"}
backend پردازنده (Delegate) مورد استفاده برای اجرای مدل. {"cpu"، "gpu"}
output_dir مسیر دایرکتوری خروجی که میزبان فایل های وزن هر لایه است. مسیر
output_tflite_file مسیر فایل خروجی به عنوان مثال، "model_cpu.bin" یا "model_gpu.bin". این فایل فقط با LLM Inference API سازگار است و نمی‌تواند به عنوان یک فایل «tflite» عمومی استفاده شود. مسیر
vocab_model_file مسیر دایرکتوری که فایل‌های tokenizer.json و tokenizer_config.json را ذخیره می‌کند. برای Gemma، به فایل single tokenizer.model اشاره کنید. مسیر
lora_ckpt مسیر فایل LoRA ckpt of safetensors که وزن آداپتور LoRA را ذخیره می کند. مسیر
lora_rank یک عدد صحیح نشان دهنده رتبه LoRA ckpt. برای تبدیل وزنه های لور مورد نیاز است. اگر ارائه نشده باشد، مبدل فرض می کند که وزن LoRA وجود ندارد. توجه: فقط باطن GPU از LoRA پشتیبانی می کند. عدد صحیح
lora_output_tflite_file خروجی نام فایل tflite برای وزن های LoRA. مسیر

تبدیل مدل AI Edge

اگر از LLM نگاشت شده به مدل TFLite از طریق AI Edge استفاده می‌کنید، از اسکریپت بسته‌بندی ما برای ایجاد Task Bundle استفاده کنید. فرآیند بسته‌بندی، مدل نگاشت‌شده را با ابرداده‌های اضافی (مثلاً پارامترهای Tokenizer) مورد نیاز برای اجرای استنتاج سرتاسر بسته بندی می‌کند.

فرآیند بسته‌بندی مدل به بسته MediaPipe PyPI نیاز دارد. اسکریپت تبدیل در تمام بسته های MediaPipe بعد از 0.10.14 در دسترس است.

وابستگی ها را با موارد زیر نصب و وارد کنید:

$ python3 -m pip install mediapipe

از کتابخانه genai.bundler برای بسته بندی مدل استفاده کنید:

import mediapipe as mp
from mediapipe.tasks.python.genai import bundler

config = bundler.BundleConfig(
    tflite_model=TFLITE_MODEL,
    tokenizer_model=TOKENIZER_MODEL,
    start_token=START_TOKEN,
    stop_tokens=STOP_TOKENS,
    output_filename=OUTPUT_FILENAME,
    enable_bytes_to_unicode_mapping=ENABLE_BYTES_TO_UNICODE_MAPPING,
)
bundler.create_bundle(config)
پارامتر شرح ارزش های پذیرفته شده
tflite_model مسیر به مدل TFLite صادر شده توسط AI Edge. مسیر
tokenizer_model مسیر رسیدن به مدل توکنایزر SentencePiece. مسیر
start_token نشانه شروع خاص مدل توکن شروع باید در مدل توکنایزر ارائه شده وجود داشته باشد. STRING
stop_tokens نشانه های توقف خاص را مدل کنید. توکن های توقف باید در مدل توکنایزر ارائه شده وجود داشته باشد. LIST[STRING]
output_filename نام فایل بسته کار خروجی. مسیر

مدل را به دستگاه فشار دهید

محتوای پوشه output_path را به دستگاه Android فشار دهید.

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.bin

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

MediaPipe LLM Inference API از تابع createFromOptions() برای تنظیم کار استفاده می کند. تابع createFromOptions() مقادیری را برای گزینه های پیکربندی می پذیرد. برای اطلاعات بیشتر در مورد گزینه های پیکربندی، گزینه های پیکربندی را ببینید.

کد زیر با استفاده از گزینه های پیکربندی اولیه کار را مقداردهی اولیه می کند:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

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

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

نام گزینه شرح محدوده ارزش مقدار پیش فرض
modelPath مسیری که مدل در دایرکتوری پروژه ذخیره می شود. مسیر N/A
maxTokens حداکثر تعداد نشانه‌ها (توکن‌های ورودی + نشانه‌های خروجی) که مدل کنترل می‌کند. عدد صحیح 512
topK تعداد نشانه هایی که مدل در هر مرحله از تولید در نظر می گیرد. پیش‌بینی‌ها را به k توکن‌های محتمل‌تر محدود می‌کند. هنگام تنظیم topK ، باید یک مقدار برای randomSeed نیز تعیین کنید. عدد صحیح 40
temperature مقدار تصادفی معرفی شده در طول تولید. دمای بالاتر منجر به خلاقیت بیشتر در متن تولید شده می شود، در حالی که دمای پایین تر تولید قابل پیش بینی بیشتری را تولید می کند. هنگام تنظیم temperature ، باید مقداری برای randomSeed نیز تعیین کنید. شناور 0.8
randomSeed دانه تصادفی مورد استفاده در تولید متن. عدد صحیح 0
loraPath مسیر مطلق به مدل LoRA به صورت محلی در دستگاه. توجه: این فقط با مدل های GPU سازگار است. مسیر N/A
resultListener شنونده نتیجه را طوری تنظیم می کند که نتایج را به صورت ناهمزمان دریافت کند. فقط هنگام استفاده از روش تولید غیر همگام قابل استفاده است. N/A N/A
errorListener یک شنونده خطای اختیاری را تنظیم می کند. N/A N/A

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

LLM Inference API ورودی های زیر را می پذیرد:

  • prompt (string): یک سوال یا درخواست.
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

وظیفه را اجرا کنید

از متد generateResponse() برای ایجاد پاسخ متنی به متن ورودی ارائه شده در بخش قبلی ( inputPrompt ) استفاده کنید. این یک پاسخ تولید شده را ایجاد می کند.

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

برای استریم پاسخ، از متد generateResponseAsync() استفاده کنید.

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

کنترل و نمایش نتایج

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 یکسان در طول عمر کار استفاده می‌کند.

Android از LoRA ایستا در هنگام شروع اولیه پشتیبانی می کند. برای بارگذاری یک مدل LoRA، کاربران مسیر مدل LoRA و همچنین LLM پایه را مشخص می کنند.

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

برای اجرای استنتاج LLM با LoRA، از همان generateResponse() یا generateResponseAsync() به عنوان مدل پایه استفاده کنید.