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

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

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

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

شروع سریع

برای افزودن API استنتاج LLM به برنامه اندروید خود، از مراحل زیر استفاده کنید. API استنتاج LLM برای دستگاه‌های اندروید رده بالا مانند Pixel 8 و Samsung S23 یا بالاتر بهینه شده است و به طور قابل اعتمادی از شبیه‌سازهای دستگاه پشتیبانی نمی‌کند.

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

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

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

دانلود یک مدل

Gemma-3 1B را با فرمت کوانتیزه شده ۴ بیتی از Hugging Face دانلود کنید. برای اطلاعات بیشتر در مورد مدل‌های موجود، به مستندات Models مراجعه کنید.

محتوای پوشه output_path را به دستگاه اندروید منتقل کنید.

$ 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.task

مقداردهی اولیه وظیفه

وظیفه را با گزینه‌های پیکربندی اولیه راه‌اندازی کنید:

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath("/data/local/tmp/llm/model_version.task")
        .setMaxTopK(64)
        .build()

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

اجرای وظیفه

از متد generateResponse() برای تولید یک پاسخ متنی استفاده کنید. این متد یک پاسخ تولید شده‌ی واحد تولید می‌کند.

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)

نمونه درخواست

برای مشاهده‌ی APIهای استنتاج LLM در عمل و بررسی طیف گسترده‌ای از قابلیت‌های هوش مصنوعی مولد روی دستگاه، برنامه‌ی Google AI Edge Gallery را بررسی کنید.

گالری Google AI Edge یک برنامه اندروید متن‌باز است که به عنوان یک زمین بازی تعاملی برای توسعه‌دهندگان عمل می‌کند. این برنامه موارد زیر را به نمایش می‌گذارد:

  • مثال‌های عملی استفاده از API استنتاج LLM برای وظایف مختلف، از جمله:
    • پرسیدن تصویر: یک تصویر آپلود کنید و در مورد آن سوال بپرسید. توضیحات دریافت کنید، مشکلات را حل کنید یا اشیاء را شناسایی کنید.
    • آزمایشگاه دستورالعمل: خلاصه‌سازی، بازنویسی، تولید کد یا استفاده از دستورالعمل‌های آزاد برای بررسی موارد استفاده از LLM تک نوبتی.
    • چت هوش مصنوعی: در مکالمات چند نوبتی شرکت کنید.
  • امکان کشف، دانلود و آزمایش انواع مدل‌های بهینه‌سازی‌شده برای LiteRT از انجمن Hugging Face LiteRT و نسخه‌های رسمی گوگل (مثلاً Gemma 3N).
  • معیارهای عملکرد روی دستگاه به صورت بلادرنگ برای مدل‌های مختلف (زمان اولین توکن، سرعت رمزگشایی و غیره).
  • چگونه مدل‌های .litertlm یا .task سفارشی خود را وارد و آزمایش کنید.

این برنامه منبعی برای درک پیاده‌سازی عملی API استنتاج LLM و پتانسیل هوش مصنوعی مولد روی دستگاه است. کد منبع را بررسی کنید و برنامه را از مخزن گیت‌هاب گالری Google AI Edge دانلود کنید.

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

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

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

راهنمایی چندوجهی

رابط برنامه‌نویسی کاربردی استنتاج LLM، رابط‌های برنامه‌نویسی کاربردی اندروید هستند که از مدل‌هایی که ورودی‌های متن، تصویر و صدا را می‌پذیرند، برای فراخوانی چندوجهی پشتیبانی می‌کنند. با فعال بودن قابلیت چندوجهی، کاربران می‌توانند ترکیبی از تصاویر و متن یا صدا و متن را در فراخوانی‌های خود بگنجانند. سپس LLM یک پاسخ متنی ارائه می‌دهد.

برای شروع، از یک نسخه سازگار با MediaPipe از Gemma 3n استفاده کنید:

  • Gemma-3n E2B : یک مدل 2B مؤثر از خانواده Gemma-3n.
  • Gemma-3n E4B : یک مدل 4B مؤثر از خانواده Gemma-3n.

برای اطلاعات بیشتر، به مستندات Gemma-3n مراجعه کنید.

برای فعال کردن ورودی تصویر یا صدا برای LLM Inference API، مراحل زیر را دنبال کنید.

ورودی تصویر

برای ارائه تصاویر در یک اعلان، تصاویر یا فریم‌های ورودی را قبل از ارسال به API استنتاج LLM به شیء com.google.mediapipe.framework.image.MPImage تبدیل کنید:

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()

برای فعال کردن پشتیبانی از بینایی برای LLM Inference API، گزینه پیکربندی EnableVisionModality را در گزینه‌های Graph روی true تنظیم کنید:

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    ...
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

حداکثر ۱۰ تصویر در هر جلسه را تنظیم کنید.

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(10)
  .build();

در ادامه، نمونه‌ای از پیاده‌سازی API استنتاج LLM که برای مدیریت ورودی‌های بصری و متنی تنظیم شده است، آورده شده است:

MPImage image = getImageFromAsset(BURGER_IMAGE);

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    .setTopK(10)
    .setTemperature(0.4f)
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

try (LlmInference llmInference =
    LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
  LlmInferenceSession session =
    LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
  session.addQueryChunk("Describe the objects in the image.");
  session.addImage(image);
  String result = session.generateResponse();
}

ورودی صدا

فعال کردن پشتیبانی صوتی در LlmInferenceOptions

val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
  ...
  .setAudioModelOptions(AudioModelOptions.builder().build())
  .build()

فعال کردن پشتیبانی صوتی در sessionOptions

    val sessionOptions =  LlmInferenceSessionOptions.builder()
      ...
      .setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
      .build()

ارسال داده‌های صوتی در طول استنتاج. توجه: صدا باید تک کاناله و با فرمت ‎.wav‎ باشد.


val audioData: ByteArray = ...
inferenceEngine.llmInferenceSession.addAudio(audioData)

در ادامه، نمونه‌ای از پیاده‌سازی رابط برنامه‌نویسی کاربردی استنتاج LLM که برای مدیریت ورودی‌های صوتی و متنی تنظیم شده است، آورده شده است:

val audioData: ByteArray = ...
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
  ...
  .setAudioModelOptions(AudioModelOptions.builder().build())
  .build()
val sessionOptions =  LlmInferenceSessionOptions.builder()
  ...
  .setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
  .build()

LlmInference.createFromOptions(context, inferenceOptions).use { llmInference ->
  LlmInferenceSession.createFromOptions(llmInference, sessionOptions).use { session ->
    session.addQueryChunk("Transcribe the following speech segment:")
    session.addAudio(audioData)
    val result = session.generateResponse()
  }
}

سفارشی‌سازی 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

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

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

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

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