LLM Inference API به شما امکان میدهد مدلهای زبان بزرگ (LLM) را بهطور کامل روی دستگاه برای برنامههای Android اجرا کنید، که میتوانید از آنها برای انجام طیف گستردهای از وظایف، مانند تولید متن، بازیابی اطلاعات به زبان طبیعی و خلاصهسازی اسناد استفاده کنید. این وظیفه پشتیبانی داخلی از چندین مدل زبان بزرگ متن به متن را ارائه میکند، بنابراین میتوانید آخرین مدلهای هوش مصنوعی تولیدی روی دستگاه را در برنامههای اندروید خود اعمال کنید.
برای افزودن سریع API LLM Inference به برنامه Android خود، Quickstart را دنبال کنید. برای مثالی اساسی از یک برنامه Android که دارای API استنتاج LLM است، به برنامه نمونه مراجعه کنید. برای درک عمیقتر نحوه عملکرد API استنتاج LLM، به بخشهای تنظیمات ، تبدیل مدل و تنظیم LoRA مراجعه کنید.
شما می توانید این کار را با نسخه ی نمایشی MediaPipe Studio مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
شروع سریع
از مراحل زیر برای افزودن API LLM Inference به برنامه اندروید خود استفاده کنید. LLM Inference API برای دستگاههای Android سطح بالا، مانند Pixel 8 و Samsung S23 یا جدیدتر، بهینهسازی شده است و از شبیهسازهای دستگاه پشتیبانی نمیکند.
وابستگی ها را اضافه کنید
LLM Inference API از کتابخانه com.google.mediapipe:tasks-genai
استفاده می کند. این وابستگی را به فایل build.gradle
برنامه اندروید خود اضافه کنید:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.24'
}
دانلود یک مدل
Gemma-3 1B را با فرمت کوانتیزه ۴ بیتی از Hugging Face دانلود کنید. برای اطلاعات بیشتر در مورد مدلهای موجود، به مستندات مدلها مراجعه کنید.
محتوای پوشه 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.task
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
llmInference = LlmInference.createFromOptions(context, taskOptions)
Task را اجرا کنید
از متد 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 Gallery یک برنامه اندروید منبع باز است که به عنوان یک زمین بازی تعاملی برای توسعه دهندگان عمل می کند. به نمایش می گذارد:
- مثال های عملی استفاده از LLM Inference API برای کارهای مختلف، از جمله:
- Ask Image: تصویری را آپلود کنید و در مورد آن سؤال بپرسید. توضیحات را دریافت کنید، مشکلات را حل کنید یا اشیاء را شناسایی کنید.
- Prompt Lab: خلاصه، بازنویسی، تولید کد، یا استفاده از دستورات فرم آزاد برای بررسی موارد استفاده از LLM تک نوبتی.
- چت هوش مصنوعی: در مکالمات چند نوبتی شرکت کنید.
- توانایی کشف، دانلود، و آزمایش انواع مدلهای بهینهشده با LiteRT از انجمن Hugging Face LiteRT و نسخههای رسمی Google (مانند Gemma 3N).
- معیارهای عملکرد بیدرنگ روی دستگاه برای مدلهای مختلف (زمان به اولین توکن، سرعت رمزگشایی و غیره).
- چگونه مدلهای
.task
سفارشی خود را وارد و آزمایش کنید.
این برنامه منبعی برای درک اجرای عملی API استنتاج LLM و پتانسیل هوش مصنوعی مولد روی دستگاه است. کد منبع را کاوش کنید و برنامه را از مخزن گالری Google AI Edge GitHub دانلود کنید.
گزینه های پیکربندی
برای راه اندازی یک برنامه اندروید از گزینه های پیکربندی زیر استفاده کنید:
نام گزینه | توضیحات | محدوده ارزش | مقدار پیش فرض |
---|---|---|---|
modelPath | مسیری که مدل در دایرکتوری پروژه ذخیره می شود. | PATH | N/A |
maxTokens | حداکثر تعداد نشانهها (توکنهای ورودی + نشانههای خروجی) که مدل کنترل میکند. | عدد صحیح | 512 |
topK | تعداد نشانه هایی که مدل در هر مرحله از تولید در نظر می گیرد. پیشبینیها را به k توکنهای محتملتر محدود میکند. | عدد صحیح | 40 |
temperature | مقدار تصادفی معرفی شده در طول تولید. دمای بالاتر منجر به خلاقیت بیشتر در متن تولید شده می شود، در حالی که دمای پایین تر تولید قابل پیش بینی بیشتری را تولید می کند. | شناور | 0.8 |
randomSeed | دانه تصادفی مورد استفاده در تولید متن. | عدد صحیح | 0 |
loraPath | مسیر مطلق به مدل LoRA به صورت محلی در دستگاه. توجه: این فقط با مدل های GPU سازگار است. | PATH | N/A |
resultListener | شنونده نتیجه را طوری تنظیم می کند که نتایج را به صورت ناهمزمان دریافت کند. فقط هنگام استفاده از روش تولید غیر همگام قابل استفاده است. | N/A | N/A |
errorListener | یک شنونده خطای اختیاری را تنظیم می کند. | N/A | N/A |
تحریک چندوجهی
LLM Inference API Android APIهای چندوجهی با مدلهایی که ورودیهای متن و تصویر را میپذیرند، پشتیبانی میکنند. با فعال بودن چند وجهی، کاربران می توانند ترکیبی از تصاویر و متن را در دستورات خود بگنجانند و LLM پاسخ متنی را ارائه می دهد.
برای شروع، از یک نوع سازگار با MediaPipe از Gemma 3n استفاده کنید:
- Gemma-3n E2B : یک مدل 2B از خانواده Gemma-3n.
- Gemma-3n E4B : یک مدل 4B از خانواده Gemma-3n.
برای اطلاعات بیشتر، به مستندات Gemma-3n مراجعه کنید.
برای ارائه تصاویر در یک اعلان، تصاویر یا فریم های ورودی را قبل از ارسال به LLM Inference API به یک شی 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();
Gemma-3n حداکثر یک تصویر را در هر جلسه می پذیرد، بنابراین MaxNumImages
را روی 1 تنظیم کنید.
LlmInferenceOptions options = LlmInferenceOptions.builder()
...
.setMaxNumImages(1)
.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();
}
سفارشی سازی LoRA
API استنتاج LLM از تنظیم LoRA (انطباق با رتبه پایین) با استفاده از کتابخانه PEFT (Parameter-Efficient Fine-Tuning) پشتیبانی می کند. تنظیم LoRA رفتار LLM ها را از طریق یک فرآیند آموزشی مقرون به صرفه سفارشی می کند و مجموعه کوچکی از وزنه های قابل آموزش را بر اساس داده های آموزشی جدید به جای آموزش مجدد کل مدل ایجاد می کند.
LLM Inference API از افزودن وزنهای LoRA به لایههای توجه مدلهای Gemma-2 2B ، Gemma 2B و Phi-2 پشتیبانی میکند. مدل را با فرمت safetensors
دانلود کنید.
برای ایجاد وزنه های LoRA، مدل پایه باید در قالب safetensors
باشد. بعد از آموزش 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 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
Android از 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()
به عنوان مدل پایه استفاده کنید.