LLM Inference API به شما امکان میدهد مدلهای زبان بزرگ (LLM) را بهطور کامل روی دستگاه برای برنامههای Android اجرا کنید، که میتوانید از آنها برای انجام طیف گستردهای از وظایف، مانند تولید متن، بازیابی اطلاعات به زبان طبیعی و خلاصهسازی اسناد استفاده کنید. این وظیفه پشتیبانی داخلی از چندین مدل زبان بزرگ متن به متن را ارائه میکند، بنابراین میتوانید آخرین مدلهای هوش مصنوعی تولیدی روی دستگاه را در برنامههای اندروید خود اعمال کنید.
این وظیفه از Gemma-2 2B ، جدیدترین مدل از خانواده سبک وزن و پیشرفته ترین مدل های باز که از همان تحقیقات و فناوری استفاده شده برای ایجاد مدل های جمینی ساخته شده است، پشتیبانی می کند. همچنین از مدلهای اضافی زیر پشتیبانی میکند: Gemma ، Phi-2 ، Falcon-RW-1B و StableLM-3B ، به همراه همه مدلهای صادر شده از طریق AI Edge.
برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
نمونه کد
این راهنما به مثالی از یک برنامه تولید متن اولیه برای اندروید اشاره دارد. میتوانید از برنامه بهعنوان نقطه شروع برای برنامه اندرویدی خود استفاده کنید یا هنگام تغییر برنامه موجود به آن مراجعه کنید. کد نمونه در GitHub میزبانی می شود.
کد را دانلود کنید
دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.
برای دانلود کد نمونه:
- با استفاده از دستور زیر مخزن git را کلون کنید:
git clone https://github.com/google-ai-edge/mediapipe-samples
- به صورت اختیاری، نمونه 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-2 2B : آخرین نسخه از خانواده مدل های Gemma. این مدل با تبدیل نسخه در AI Edge Torch قابل استفاده است.
- Gemma 2B : بخشی از خانواده مدلهای باز سبک وزن و پیشرفته که از همان تحقیقات و فناوری استفاده شده برای ساخت مدلهای Gemini ساخته شدهاند. برای انواع وظایف تولید متن، از جمله پاسخ به سؤال، خلاصهسازی و استدلال مناسب است.
- Phi-2 : مدل ترانسفورماتور با پارامتر 2.7 میلیاردی، بهترین گزینه برای فرمت پرسش-پاسخ، چت و کد.
- Falcon-RW-1B : مدل 1 میلیارد پارامتری فقط رمزگشای علی که روی 350B توکن RefinedWeb آموزش داده شده است.
- StableLM-3B : مدل زبانی فقط رمزگشای 3 میلیارد پارامتری که از قبل بر روی 1 تریلیون توکن مجموعه داده های انگلیسی و کدهای متنوع آموزش داده شده است.
توصیه می کنیم از Gemma-2 2B استفاده کنید که در Kaggle Models موجود است. برای Gemma-2 2B، باید مدل را (شروع از Hugging Face PyTorch checkpoint) به یک قالب مناسب MediaPipe تبدیل کنید . مدل اصلی Gemma در قالب قابل دانلود مستقیم موجود است. مدل های دیگر نیز با LLM Inference API سازگار هستند. برای اطلاعات بیشتر در مورد سایر مدلهای موجود، به بخش مدلهای نمای کلی کار مراجعه کنید.
تبدیل مدل به فرمت 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 را مشخص کنید. | PATH |
ckpt_format | فرمت فایل مدل | {"Safetensors"، "pytorch"} |
model_type | LLM در حال تبدیل است. | {"PHI_2"، "FALCON_RW_1B"، "STABLELM_4E1T_3B"، "GEMMA_2B"} |
backend | پردازنده (Delegate) مورد استفاده برای اجرای مدل. | {"cpu"، "gpu"} |
output_dir | مسیر دایرکتوری خروجی که میزبان فایل های وزن هر لایه است. | PATH |
output_tflite_file | مسیر فایل خروجی به عنوان مثال، "model_cpu.bin" یا "model_gpu.bin". این فایل فقط با LLM Inference API سازگار است و نمیتواند به عنوان یک فایل «tflite» عمومی استفاده شود. | PATH |
vocab_model_file | مسیر دایرکتوری که فایلهای tokenizer.json و tokenizer_config.json را ذخیره میکند. برای Gemma، به فایل single tokenizer.model اشاره کنید. | PATH |
lora_ckpt | مسیر فایل LoRA ckpt of safetensors که وزن آداپتور LoRA را ذخیره می کند. | PATH |
lora_rank | یک عدد صحیح نشان دهنده رتبه LoRA ckpt. برای تبدیل وزنه های لور مورد نیاز است. اگر ارائه نشده باشد، مبدل فرض می کند که وزن LoRA وجود ندارد. توجه: فقط باطن GPU از LoRA پشتیبانی می کند. | عدد صحیح |
lora_output_tflite_file | خروجی نام فایل tflite برای وزن های LoRA. | PATH |
تبدیل مدل 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. | PATH |
tokenizer_model | مسیر رسیدن به مدل توکنایزر SentencePiece. | PATH |
start_token | نشانه شروع خاص مدل توکن شروع باید در مدل توکنایزر ارائه شده وجود داشته باشد. | STRING |
stop_tokens | نشانه های توقف خاص را مدل کنید. توکن های توقف باید در مدل توکنایزر ارائه شده وجود داشته باشد. | LIST[STRING] |
output_filename | نام فایل بسته کار خروجی. | PATH |
مدل را به دستگاه فشار دهید
محتوای پوشه 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 | مسیری که مدل در دایرکتوری پروژه ذخیره می شود. | 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 ورودی های زیر را می پذیرد:
- 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()
به عنوان مدل پایه استفاده کنید.