يتطلب نشر نماذج Transformers على الحافة أو من جانب العميل دراسة متأنية للأداء والتوافق. بايثون، على الرغم من قوتها، ليست دائمًا مثالية لمثل هذه عمليات النشر، خاصة في البيئات التي تهيمن عليها لغة C++. سترشدك هذه المدونة خلال تحسين ونشر نماذج Hugging Face Transformers باستخدام Optimum-Intel وOpenVINO™ GenAI، مما يضمن استنتاج الذكاء الاصطناعي الفعال مع الحد الأدنى من التبعيات.
جدول المحتويات
- لماذا نستخدم OpenVINO™ لنشر الحافة
- الخطوة 1: إعداد البيئة
- الخطوة 2: تصدير النماذج إلى OpenVINO IR
- الخطوة 3: تحسين النموذج
- الخطوة 4: النشر باستخدام OpenVINO GenAI API
- خاتمة
لماذا نستخدم OpenVINO™ لنشر الحافة
تم تطوير OpenVINO™ في الأصل كحل استدلال للذكاء الاصطناعي C++، مما يجعله مثاليًا لنشر الحافة والعميل حيث يكون تقليل التبعيات أمرًا بالغ الأهمية. مع تقديم GenAI API، أصبح دمج نماذج اللغات الكبيرة (LLMs) في تطبيقات C++ أو Python أكثر وضوحًا، مع ميزات مصممة لتبسيط النشر وتحسين الأداء.
الخطوة 1: إعداد البيئة
المتطلبات المسبقة
للبدء، تأكد من تكوين بيئتك بشكل صحيح مع كل من Python وC++. قم بتثبيت حزم بايثون الضرورية:
pip install --upgrade --upgrade-strategy eager "optimum[openvino]"
فيما يلي الحزم المحددة المستخدمة في منشور المدونة هذا:
transformers==4.44
openvino==24.3
openvino-tokenizers==24.3
optimum-intel==1.20
lm-eval==0.4.3
لتثبيت مكتبات GenAI C++، اتبع التعليمات هنا.
الخطوة 2: تصدير النماذج إلى OpenVINO IR
أدى تعاون Hugging Face وIntel إلى مشروع Optimum-Intel. إنه مصمم لتحسين نماذج المحولات للاستدلال على Intel HW. تدعم Optimum-Intel OpenVINO كواجهة خلفية للاستدلال وتحتوي واجهة برمجة التطبيقات (API) الخاصة بها على أغلفة لمختلف بنيات النماذج المبنية على واجهة برمجة تطبيقات الاستدلال OpenVINO. كل هذه الأغلفة تبدأ من OV البادئة، على سبيل المثال، OVModelForCausalLM. بخلاف ذلك، فهو مشابه لواجهة برمجة التطبيقات الخاصة بمكتبة Transformers.
لتصدير نماذج المحولات إلى OpenVINO Intermediate Representation (IR) يمكن للمرء استخدام خيارين: يمكن القيام بذلك باستخدام Python .from_pretrained() الطريقة أو واجهة سطر الأوامر الأمثل (CLI). فيما يلي أمثلة باستخدام كلتا الطريقتين:
باستخدام بايثون API
from optimum.intel import OVModelForCausalLM
model_id = "meta-llama/Meta-Llama-3.1-8B"
model = OVModelForCausalLM.from_pretrained(model_id, export=True)
model.save_pretrained("./llama-3.1-8b-ov")
استخدام واجهة سطر الأوامر (CLI)
optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B ./llama-3.1-8b-ov
ال ./llama-3.1-8b-ov سيحتوي المجلد .xml و bin ملفات نموذج IR وملفات التكوين المطلوبة التي تأتي من النموذج المصدر. 🤗 سيتم أيضًا تحويل الرمز المميز إلى تنسيق openvino-tokenizers سيتم إنشاء المكتبة وملفات التكوين المقابلة في نفس المجلد.
الخطوة 3: تحسين النموذج
عند تشغيل LLMs على أجهزة الحافة والأجهزة العميلة ذات الموارد المحدودة، يوصى بشدة بتحسين النموذج كخطوة. يعد تكميم الوزن فقط هو النهج السائد الذي يقلل بشكل كبير من زمن الوصول وبصمة النموذج. تقدم Optimum-Intel تكميمًا للوزن فقط من خلال إطار ضغط الشبكة العصبية (NNCF)، الذي يحتوي على مجموعة متنوعة من تقنيات التحسين المصممة خصيصًا لـ LLMs: بدءًا من تكميم الوزن INT8 وINT4 الخالي من البيانات إلى الأساليب المدركة للبيانات مثل AWQ وGPTQ وتقدير مقياس التكميم والتكميم المختلط الدقة. افتراضيًا، يتم قياس أوزان النماذج التي يزيد حجمها عن مليار معلمة وفقًا لدقة INT8 وهي آمنة من حيث الدقة. وهذا يعني أن خطوات التصدير الموضحة أعلاه تؤدي إلى النموذج بأوزان 8 بت. ومع ذلك، فإن تكميم الوزن الصحيح فقط بمقدار 4 بتات يسمح بتحقيق مقايضة أفضل بين الدقة والأداء.
ل meta-llama/Meta-Llama-3.1-8B نوصي بتكديس AWQ وتقدير مقياس التكميم جنبًا إلى جنب مع تكميم INT4/INT8 المختلط الدقة للأوزان باستخدام مجموعة بيانات المعايرة التي تعكس حالة استخدام النشر. كما هو الحال في حالة التصدير، هناك خياران حول كيفية تطبيق تكميم الوزن 4 بت فقط على نموذج LLM:
باستخدام بايثون API
- تحديد
quantization_configالمعلمة في.from_pretrained()طريقة. في هذه الحالةOVWeightQuantizationConfigيجب إنشاء الكائن وتعيينه على هذه المعلمة كما يلي:
from optimum.intel import OVModelForCausalLM, OVWeightQuantizationConfig
MODEL_ID = "meta-llama/Meta-Llama-3.1-8B"
quantization_config = OVWeightQuantizationConfig(bits=4, awq=True, scale_estimation=True, group_size=64, dataset="c4")
model = OVModelForCausalLM.from_pretrained(MODEL_ID, export=True, quantization_config=quantization_config)
model.save_pretrained("./llama-3.1-8b-ov")
باستخدام واجهة سطر الأوامر (CLI):
optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B --weight-format int4 --awq --scale-estimation --group-size 64 --dataset wikitext2 ./llama-3.1-8b-ov
ملحوظة: يمكن أن تستغرق عملية تحسين النموذج بعض الوقت ويتم تطبيق عدة طرق لاحقًا وتستخدم استدلال النموذج على مجموعة البيانات المحددة.
يعد تحسين النموذج باستخدام واجهة برمجة التطبيقات (API) أكثر مرونة لأنه يسمح باستخدام مجموعات البيانات المخصصة التي يمكن تمريرها ككائن قابل للتكرار، على سبيل المثال، ومثيل Dataset كائن 🤗 المكتبة أو مجرد قائمة من السلاسل.
عادةً ما يؤدي تكميم الوزن إلى بعض التدهور في مقياس الدقة. لمقارنة النماذج المحسنة والمصدر، نقوم بالإبلاغ عن مقياس Word Perplexity الذي تم قياسه على مجموعة بيانات Wikitext باستخدام مشروع lm-evaluation-harness الذي يدعم كلاً من نماذج Transformers وOptimum-Intel الجاهزة.
| نموذج | بي بي إل بايتورتش FP32 | أوبن فينو INT8 | أوبن فينو INT4 |
|---|---|---|---|
| ميتا اللاما/ميتا اللاما-3.1-8B | 7.3366 | 7.3463 | 7.8288 |
الخطوة 4: النشر باستخدام OpenVINO GenAI API
بعد التحويل والتحسين، أصبح نشر النموذج باستخدام OpenVINO GenAI أمرًا مباشرًا. توفر فئة LLMPipeline في OpenVINO GenAI كلاً من واجهات برمجة تطبيقات Python وC++، مما يدعم أساليب إنشاء النص المختلفة مع الحد الأدنى من التبعيات.
مثال بايثون API
import argparse
import openvino_genai
device = "CPU"
pipe = openvino_genai.LLMPipeline(args.model_dir, device)
config = openvino_genai.GenerationConfig()
config.max_new_tokens = 100
print(pipe.generate(args.prompt, config))
لتشغيل هذا المثال، تحتاج إلى تثبيت الحد الأدنى من التبعيات في بيئة Python حيث تم تصميم OpenVINO GenAI لتوفير عملية نشر خفيفة الوزن. يمكنك تثبيت حزمة OpenVINO GenAI على نفس بيئة Python أو إنشاء حزمة منفصلة لمقارنة أثر التطبيق:
pip install openvino-genai==24.3
مثال لواجهة برمجة تطبيقات C++
دعونا نرى كيفية تشغيل نفس المسار باستخدام OpenVINO GenAI C++ API. تم تصميم GenAI API لتكون بديهية وتوفر انتقالًا سلسًا من 🤗 Transformers API.
ملحوظة: في المثال أدناه، يمكن تحديد أي جهاز آخر متاح في بيئتك لمتغير “الجهاز”. على سبيل المثال، إذا كنت تستخدم وحدة معالجة مركزية Intel مع رسومات مدمجة، فإن “GPU” يعد خيارًا جيدًا لتجربته. للتحقق من الأجهزة المتاحة، يمكنك استخدام طريقة ov::Core::get_available_devices (راجع خصائص جهاز الاستعلام).
#include "openvino/genai/llm_pipeline.hpp"
#include <iostream>
int main(int argc, char* argv[]) {
std::string model_path = "./llama-3.1-8b-ov";
std::string device = "CPU"
ov::genai::LLMPipeline pipe(model_path, device);
std::cout << pipe.generate("What is LLM model?", ov::genai::max_new_tokens(256));
}
تخصيص تكوين الجيل
LLMPipeline يسمح أيضًا بتحديد خيارات الإنشاء المخصصة عن طريق ov::genai::GenerationConfig:
ov::genai::GenerationConfig config;
config.max_new_tokens = 256;
std::string result = pipe.generate(prompt, config);
باستخدام LLMPipieline، لا يستطيع المستخدمون الاستفادة بسهولة من خوارزميات فك التشفير المختلفة مثل Beam Search فحسب، بل يمكنهم أيضًا إنشاء سيناريو محادثة تفاعلية باستخدام Streamer كما في المثال أدناه. علاوة على ذلك، يمكن للمرء الاستفادة من التحسينات الداخلية المحسنة باستخدام LLMPipeline، مثل تقليل وقت المعالجة السريعة باستخدام ذاكرة التخزين المؤقت KV لسجل الدردشة السابق باستخدام أساليب الدردشة: start_chat() وfinish_chat() (راجع استخدام genai-in-chat-scenario).
ov::genai::GenerationConfig config;
config.max_new_tokens = 100;
config.do_sample = true;
config.top_p = 0.9;
config.top_k = 30;
auto streamer = [](std::string subword) {
std::cout << subword << std::flush;
return false;
};
pipe.generate(prompt, config, streamer);
وأخيرًا دعونا نرى كيفية استخدام LLMPipeline في سيناريو الدردشة:
pipe.start_chat()
for (size_t i = 0; i < questions.size(); i++) {
std::cout << "question:\n";
std::getline(std::cin, prompt);
std::cout << pipe.generate(prompt) << std::endl;
}
pipe.finish_chat();
خاتمة
يوفر الجمع بين Optimum-Intel وOpenVINO™ GenAI حلاً قويًا ومرنًا لنشر نماذج Hugging Face على الحافة. باتباع هذه الخطوات، يمكنك تحقيق استدلال ذكاء اصطناعي محسّن وعالي الأداء في البيئات التي قد لا تكون فيها Python مثالية، مما يضمن تشغيل تطبيقاتك بسلاسة عبر أجهزة Intel.
موارد إضافية
- يمكنك العثور على مزيد من التفاصيل في هذا البرنامج التعليمي.
- لبناء أمثلة C++ أعلاه، راجع هذه الوثيقة.
- وثائق OpenVINO
- دفاتر جوبيتر
- التوثيق الأمثل
