LLM Inference API به شما امکان می دهد مدل های زبان بزرگ (LLM) را به طور کامل در مرورگر برای برنامه های کاربردی وب اجرا کنید، که می توانید از آنها برای انجام طیف گسترده ای از وظایف مانند تولید متن، بازیابی اطلاعات به صورت زبان طبیعی و خلاصه کردن اسناد استفاده کنید. این وظیفه پشتیبانی داخلی از چندین مدل زبان بزرگ متن به متن را ارائه میکند، بنابراین میتوانید آخرین مدلهای هوش مصنوعی تولیدی روی دستگاه را در برنامههای وب خود اعمال کنید.
شما می توانید این کار را با نسخه ی نمایشی MediaPipe Studio مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
نمونه کد
برنامه مثال برای LLM Inference API یک پیاده سازی اساسی از این کار در جاوا اسکریپت را برای مرجع شما ارائه می دهد. می توانید از این نمونه برنامه برای شروع ساخت برنامه تولید متن خود استفاده کنید.
میتوانید به برنامه نمونه API LLM Inference در GitHub دسترسی داشته باشید.
راه اندازی
این بخش مراحل کلیدی را برای راه اندازی محیط توسعه و پروژه های کد به طور خاص برای استفاده از LLM Inference API توضیح می دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از MediaPipe Tasks، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای وب مراجعه کنید.
سازگاری مرورگر
LLM Inference API به یک مرورگر وب با سازگاری WebGPU نیاز دارد. برای فهرست کامل مرورگرهای سازگار، به سازگاری مرورگر GPU مراجعه کنید.
بسته های جاوا اسکریپت
کد API استنتاج LLM از طریق بسته @mediapipe/tasks-genai
در دسترس است. میتوانید این کتابخانهها را از پیوندهای ارائه شده در راهنمای راهاندازی پلتفرم پیدا و دانلود کنید.
بسته های مورد نیاز را برای مرحله بندی محلی نصب کنید:
npm install @mediapipe/tasks-genai
برای استقرار در سرور، از یک سرویس شبکه تحویل محتوا (CDN) مانند jsDelivr استفاده کنید تا کد را مستقیماً به صفحه HTML خود اضافه کنید:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
مدل
MediaPipe LLM Inference API به یک مدل آموزش دیده نیاز دارد که با این کار سازگار باشد. برای برنامه های تحت وب، مدل باید با GPU سازگار باشد.
برای اطلاعات بیشتر در مورد مدلهای آموزشدیده موجود برای LLM Inference API، بخش مدلهای نمای کلی کار را ببینید.
دانلود یک مدل
قبل از راه اندازی API استنتاج LLM، یکی از مدل های پشتیبانی شده را دانلود کنید و فایل را در فهرست پروژه خود ذخیره کنید:
- جما : بخشی از خانواده مدلهای باز سبک وزن و پیشرفته که از همان تحقیقات و فناوری استفاده شده برای ساخت مدلهای جمینی ساخته شدهاند. برای انواع وظایف تولید متن، از جمله پاسخ به سؤال، خلاصهسازی و استدلال مناسب است. مدل Gemma 2B یا Gemma 7B را دانلود کنید.
- Phi-2 : مدل ترانسفورماتور با پارامتر 2.7 میلیاردی، بهترین گزینه برای فرمت پرسش-پاسخ، چت و کد.
- Falcon-RW-1B : مدل 1 میلیارد پارامتری فقط رمزگشای علی که روی 350B توکن RefinedWeb آموزش داده شده است.
- StableLM-3B : مدل زبانی فقط رمزگشای 3 میلیارد پارامتری که از قبل بر روی 1 تریلیون توکن مجموعه داده های انگلیسی و کدهای متنوع آموزش داده شده است.
توصیه می کنیم از Gemma 2B یا Gemma 7B استفاده کنید، که در Kaggle Models موجود هستند و در قالبی هستند که از قبل با LLM Inference API سازگار است. اگر از LLM دیگری استفاده می کنید، باید مدل را به یک قالب مناسب MediaPipe تبدیل کنید . برای اطلاعات بیشتر در مورد Gemma، به سایت 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 را مشخص کنید. | 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 |
اضافه کردن مدل به فهرست پروژه
مدل را در فهرست پروژه خود ذخیره کنید:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
مسیر مدل را با پارامتر شی baseOptions
modelAssetPath
مشخص کنید:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
کار را ایجاد کنید
از یکی از توابع LLM Inference API createFrom...()
برای آماده سازی کار برای اجرای استنتاج ها استفاده کنید. می توانید از تابع createFromModelPath()
با یک مسیر نسبی یا مطلق به فایل مدل آموزش دیده استفاده کنید. مثال کد از تابع createFromOptions()
استفاده می کند. برای اطلاعات بیشتر در مورد گزینه های پیکربندی موجود، به گزینه های پیکربندی مراجعه کنید.
کد زیر نحوه ساخت و پیکربندی این وظیفه را نشان می دهد:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int4.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
گزینه های پیکربندی
این کار دارای گزینه های پیکربندی زیر برای برنامه های وب و جاوا اسکریپت است:
نام گزینه | توضیحات | محدوده ارزش | مقدار پیش فرض |
---|---|---|---|
modelPath | مسیری که مدل در دایرکتوری پروژه ذخیره می شود. | PATH | N/A |
maxTokens | حداکثر تعداد نشانهها (توکنهای ورودی + نشانههای خروجی) که مدل کنترل میکند. | عدد صحیح | 512 |
topK | تعداد نشانه هایی که مدل در هر مرحله از تولید در نظر می گیرد. پیشبینیها را به k توکنهای محتملتر محدود میکند. | عدد صحیح | 40 |
temperature | مقدار تصادفی معرفی شده در طول تولید. دمای بالاتر منجر به خلاقیت بیشتر در متن تولید شده می شود، در حالی که دمای پایین تر تولید قابل پیش بینی بیشتری را تولید می کند. | شناور | 0.8 |
randomSeed | دانه تصادفی مورد استفاده در تولید متن. | عدد صحیح | 0 |
loraRanks | رتبهبندی LoRA برای استفاده توسط مدلهای LoRA در طول زمان اجرا. توجه: این فقط با مدل های GPU سازگار است. | آرایه عدد صحیح | N/A |
داده ها را آماده کنید
LLM Inference API داده های متن ( string
) را می پذیرد. این وظیفه، پیش پردازش ورودی داده، از جمله پیش پردازش توکن و تانسور را انجام می دهد.
تمام پیش پردازش ها در تابع generateResponse()
انجام می شود. نیازی به پیش پردازش اضافی متن ورودی نیست.
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
وظیفه را اجرا کنید
API استنتاج LLM از generateResponse()
برای استنتاج استفاده می کند. برای طبقهبندی متن، این به معنای برگرداندن دستههای ممکن برای متن ورودی است.
کد زیر نحوه اجرای پردازش با مدل وظیفه را نشان می دهد.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
برای پخش جریانی پاسخ، از موارد زیر استفاده کنید:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
کنترل و نمایش نتایج
LLM Inference API رشته ای را برمی گرداند که شامل متن پاسخ تولید شده است.
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 یکسان در طول عمر کار استفاده میکند.
وب از LoRA پویا در طول زمان اجرا پشتیبانی می کند. یعنی، کاربران اعلام میکنند که رتبههای LoRA قرار است در طول مقداردهی اولیه استفاده شوند، و میتوانند مدلهای LoRA مختلف را در طول زمان اجرا عوض کنند.const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
در طول زمان اجرا، پس از مقداردهی اولیه مدل پایه، مدل های LoRA مورد استفاده را بارگذاری کنید. همچنین، مدل LoRA را با عبور از مرجع مدل LoRA در حین ایجاد پاسخ LLM فعال کنید.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});