شعار زيفيرنت

قم بضبط Llama 2 باستخدام QLoRA ونشره على Amazon SageMaker باستخدام AWS Inferentia2 | خدمات الويب الأمازون

التاريخ:

في هذا المنشور، نعرض الضبط الدقيق لنموذج Llama 2 باستخدام طريقة الضبط الدقيق الفعال للمعلمات (PEFT) ونشر النموذج المضبوط بدقة على AWS الاستدلال 2. نحن نستخدم ال AWS نيورون مجموعة تطوير البرامج (SDK) للوصول إلى جهاز AWS Inferentia2 والاستفادة من أدائه العالي. نستخدم بعد ذلك حاوية استدلال نموذجية كبيرة مدعومة بـ مكتبة جافا العميقة (DJLServing) كحل تقديم نموذجي لدينا.

حل نظرة عامة

ضبط Llama2 بكفاءة باستخدام QLoRa

عائلة Llama 2 من نماذج اللغات الكبيرة (LLMs) عبارة عن مجموعة من نماذج النصوص التوليدية المدربة مسبقًا والمضبوطة بدقة والتي يتراوح حجمها من 7 مليارات إلى 70 مليار معلمة. تم تدريب Llama 2 مسبقًا على 2 تريليون رمز من البيانات من المصادر المتاحة للعامة. يختار عملاء AWS أحيانًا ضبط نماذج Llama 2 باستخدام بيانات العملاء الخاصة لتحقيق أداء أفضل للمهام النهائية. ومع ذلك، نظرًا للعدد الكبير من المعلمات في طراز Llama 2، قد يكون الضبط الدقيق الكامل مكلفًا للغاية ويستغرق وقتًا طويلاً. يمكن لنهج الضبط الدقيق ذو كفاءة المعلمات (PEFT) معالجة هذه المشكلة عن طريق ضبط عدد صغير فقط من معلمات النموذج الإضافية أثناء تجميد معظم معلمات النموذج المُدرب مسبقًا. لمزيد من المعلومات حول PEFT، يمكن للمرء قراءة هذا بريد.. اعلاني. في هذه التدوينة نستخدم كلورا لضبط نموذج Llama 2 7B.

انشر نموذجًا مضبوطًا على Inf2 باستخدام Amazon SageMaker

AWS Inferentia2 عبارة عن مسرع التعلم الآلي (ML) المصمم خصيصًا لأحمال عمل الاستدلال ويقدم أداءً عاليًا بتكلفة أقل بنسبة تصل إلى 40% لأعباء عمل الذكاء الاصطناعي وLLM التوليدية مقارنة بمثيلات الاستدلال المحسنة الأخرى على AWS. في هذا المنشور، نستخدم Amazon Elastic Compute Cloud (Amazon EC2) مثيل Inf2، الذي يتميز بـ AWS Inferentia2، الجيل الثاني من مسرعات Inferentia2، يحتوي كل منها على اثنين NeuronCores- v2 تحديث. كل NeuronCore-v2 عبارة عن وحدة حسابية مستقلة وغير متجانسة، مع أربعة محركات رئيسية: محركات Tensor وVector وScalar وGPSIMD. وهو يشتمل على ذاكرة SRAM مُدارة بواسطة برنامج على الشريحة لزيادة موضع البيانات إلى الحد الأقصى. وبما أنه تم نشر العديد من المدونات على Inf2، فيمكن للقارئ الرجوع إلى هذا بريد.. اعلاني ولنا توثيق لمزيد من المعلومات حول Inf2.

لنشر النماذج على Inf2، نحتاج إلى AWS Neuron SDK كطبقة برمجية تعمل فوق أجهزة Inf2. AWS Neuron هي حزمة SDK المستخدمة لتشغيل أعباء عمل التعلم العميق على AWS Inferentia و تدريب AWS الأمثلة القائمة. إنه يمكّن دورة حياة تطوير ML من طرف إلى طرف لبناء نماذج جديدة ، وتدريب هذه النماذج وتحسينها ، ونشرها للإنتاج. تتضمن AWS Neuron تعلمًا عميقًا مترجم, وقت التشغيلو أدوات التي تم دمجها أصلاً مع أطر العمل الشائعة مثل TensorFlow وPyTorch. في هذه المدونة سوف نستخدم transformers-neuronx، وهو جزء من AWS Neuron SDK لسير عمل استنتاج وحدة فك ترميز المحولات. هو - هي وتدعم مجموعة من النماذج المشهورة، بما في ذلك Llama 2.

لنشر النماذج على الأمازون SageMaker، نستخدم عادةً حاوية تحتوي على المكتبات المطلوبة، مثل Neuron SDK و transformers-neuronx وكذلك عنصر تقديم النموذج. يؤكد أمازون SageMaker حاويات التعلم العميق (DLCs) مع مكتبات شعبية مفتوحة المصدر لاستضافة النماذج الكبيرة. في هذه التدوينة نستخدم حاوية استدلال نموذجية كبيرة للخلايا العصبية. تحتوي هذه الحاوية على كل ما تحتاجه لنشر نموذج Llama 2 الخاص بك على Inf2. للحصول على موارد لبدء استخدام LMI على Amazon SageMaker، يرجى الرجوع إلى العديد من منشوراتنا الحالية (بلوق 1, بلوق 2, بلوق 3) في هذا الموضوع. باختصار، يمكنك تشغيل الحاوية دون كتابة أي كود إضافي. يمكنك استخدام ال المعالج الافتراضي للحصول على تجربة مستخدم سلسة وتمرير أحد أسماء النماذج المدعومة وأي معلمات قابلة للتكوين لوقت التحميل. يقوم هذا بتجميع وتقديم LLM على مثيل Inf2. على سبيل المثال، للنشر OpenAssistant/llama2-13b-orca-8k-3319، يمكنك توفير تكوين المتابعة (مثل serving.properties ملف). في serving.properties، نحدد نوع النموذج كـ llama2-13b-orca-8k-3319، حجم الدفعة هو 4، ودرجة الموازية الموتر هي 2، وهذا كل شيء. للحصول على القائمة الكاملة للمعلمات القابلة للتكوين، راجع جميع خيارات تكوين DJL.

# Engine to use: MXNet, PyTorch, TensorFlow, ONNX, PaddlePaddle, DeepSpeed, etc.
engine = Python 
# default handler for model serving
option.entryPoint = djl_python.transformers_neuronx
# The Hugging Face ID of a model or the s3 url of the model artifacts. 
option.model_id = meta-llama/Llama-2-7b-chat-hf
#the dynamic batch size, default is 1.
option.batch_size=4
# This option specifies number of tensor parallel partitions performed on the model.
option.tensor_parallel_degree=2
# The input sequence length
option.n_positions=512
#Enable iteration level batching using one of "auto", "scheduler", "lmi-dist"
option.rolling_batch=auto
# The data type to which you plan to cast the model default
option.dtype=fp16
# worker load model timeout
option.model_loading_timeout=1500

وبدلاً من ذلك، يمكنك كتابة ملف معالج النموذج الخاص بك كما هو موضح في هذا مثال، ولكن هذا يتطلب تنفيذ أساليب تحميل النموذج والاستدلال لتكون بمثابة جسر بين واجهات برمجة تطبيقات DJLServing.

المتطلبات الأساسية المسبقة

توضح القائمة التالية المتطلبات الأساسية لنشر النموذج الموضح في منشور المدونة هذا. يمكنك تنفيذ أي منهما من وحدة تحكم إدارة AWS أو باستخدام أحدث إصدار من واجهة سطر الأوامر AWS (AWS CLI).

تجول

في القسم التالي، سنتعرف على الكود في جزأين:

  1. الضبط الدقيق لنموذج Llama2-7b، وتحميل عناصر النموذج إلى موقع حاوية Amazon S3 المحدد.
  2. انشر النموذج في Inferentia2 باستخدام حاوية تقديم DJL المستضافة في Amazon SageMaker.

يمكن العثور على نماذج التعليمات البرمجية الكاملة مع التعليمات في هذا GitHub جيثب: مستودع.

الجزء 1: ضبط نموذج Llama2-7b باستخدام PEFT

سنستخدم الطريقة التي تم تقديمها مؤخرًا في المقالة QLoRA: ضبط محول منخفض الرتبة مدرك للتكميم لتوليد اللغة بواسطة تيم ديتميرز وآخرون. QLoRA هي تقنية جديدة لتقليل أثر الذاكرة لنماذج اللغات الكبيرة أثناء الضبط الدقيق، دون التضحية بالأداء.

ملحوظة: تم اختبار الضبط الدقيق لنموذج llama2-7b الموضح في ما يلي على موقع أمازون دفتر الملاحظات ستوديو SageMaker مع Python 2.0 GPU Optimized Kernel باستخدام ml.g5.2xlarge نوع الطلب. كأفضل الممارسات، نوصي باستخدام أمازون ساجميكر ستوديو بيئة التطوير المتكاملة (IDE) تم إطلاقها بنفسك سحابة أمازون الافتراضية الخاصة (أمازون VPC). يتيح لك ذلك التحكم في حركة مرور الشبكة ومراقبتها وفحصها داخل وخارج VPC الخاص بك باستخدام شبكة AWS القياسية وإمكانيات الأمان. لمزيد من المعلومات، راجع تأمين اتصال Amazon SageMaker Studio باستخدام VPC خاص.

تكميم النموذج الأساسي

نقوم أولاً بتحميل نموذج كمي باستخدام تكميم 4 بت محولات الوجه المعانقة المكتبة على النحو التالي:

# The base pretrained model for fine-tuning
model_name = "NousResearch/Llama-2-7b-chat-hf"

# The instruction dataset to use
dataset_name = "mlabonne/guanaco-llama2-1k"

#Activate 4-bit precision base model loading
use_4bit = True
bnb_4bit_compute_dtype = "float16"
bnb_4bit_quant_type = "nf4"
use_nested_quant = False

compute_dtype = getattr(torch, bnb_4bit_compute_dtype)

bnb_config = BitsAndBytesConfig(
load_in_4bit=use_4bit,
bnb_4bit_quant_type=bnb_4bit_quant_type,
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=use_nested_quant,
)

# Load base model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map=device_map
)
model.config.pretraining_tp = 1

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

تحميل مجموعة بيانات التدريب

بعد ذلك، نقوم بتحميل مجموعة البيانات لتغذية النموذج لخطوة الضبط الموضحة على النحو التالي:

# Load dataset (you can process it here)
dataset = load_dataset(dataset_name, split="train")

إرفاق طبقة محول

نحن هنا نعلق طبقة محول صغيرة قابلة للتدريب، تم تكوينها كـ لوراالتكوين المحددة في الوجه المعانق com.peft مكتبة.

# include linear layers to apply LoRA to.
modules = find_all_linear_names(model)

## Setting up LoRA configuration
lora_r = 64

# Alpha parameter for LoRA scaling
lora_alpha = 16

# Dropout probability for LoRA layers
lora_dropout = 0.1

peft_config = LoraConfig(
lora_alpha=lora_alpha,
lora_dropout=lora_dropout,
r=lora_r,
bias="none",
task_type="CAUSAL_LM",
target_modules=modules)

تدريب نموذج

باستخدام تكوين LoRA الموضح أعلاه، سنقوم بضبط نموذج Llama2 جنبًا إلى جنب مع المعلمات الفائقة. يظهر مقتطف التعليمات البرمجية لتدريب النموذج في ما يلي:

# Set training parameters
training_arguments = TrainingArguments(...)

trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_config, # LoRA config
dataset_text_field="text",
max_seq_length=max_seq_length,
tokenizer=tokenizer,
args=training_arguments,
packing=packing,
)

# Train model
trainer.train()

# Save trained model
trainer.model.save_pretrained(new_model)

دمج وزن النموذج

أنشأ النموذج المضبوط أعلاه نموذجًا جديدًا يحتوي على أوزان محول LoRA المدربة. في مقتطف التعليمات البرمجية التالي، سنقوم بدمج المحول مع النموذج الأساسي حتى نتمكن من استخدام النموذج المضبوط بدقة للاستدلال.

# Reload model in FP16 and merge it with LoRA weights
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
low_cpu_mem_usage=True,
return_dict=True,
torch_dtype=torch.float16,
device_map=device_map,
)
model = PeftModel.from_pretrained(base_model, new_model)
model = model.merge_and_unload()

save_dir = "merged_model"
model.save_pretrained(save_dir, safe_serialization=True, max_shard_size="2GB")

# Reload tokenizer to save it
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
tokenizer.save_pretrained(save_dir)

قم بتحميل وزن النموذج إلى Amazon S3

في الخطوة الأخيرة من الجزء الأول، سنقوم بحفظ أوزان النموذج المدمج في موقع Amazon S1 محدد. سيتم استخدام وزن النموذج بواسطة حاوية تقديم النموذج في Amazon SageMaker لاستضافة النموذج باستخدام مثيل Inferentia3.

model_data_s3_location = "s3://<bucket_name>/<prefix>/"
!cd {save_dir} && aws s3 cp —recursive . {model_data_s3_location}

الجزء 2: استضافة نموذج QLoRA للاستدلال باستخدام AWS Inf2 باستخدام حاوية SageMaker LMI

في هذا القسم، سنتعرف على خطوات نشر نموذج QLoRA المضبوط بدقة في بيئة استضافة Amazon SageMaker. سوف نستخدم أ خدمة دي جي إل حاوية من SageMaker DLC، والذي يتكامل مع محولات الخلايا العصبية مكتبة لاستضافة هذا النموذج. يسهل الإعداد تحميل النماذج على مسرعات AWS Inferentia2، ويوازن النموذج عبر العديد من NeuronCores، ويتيح الخدمة عبر نقاط نهاية HTTP.

تحضير التحف النموذجية

يدعم DJL العديد من مكتبات تحسين التعلم العميق، بما في ذلك السرعة العميقة, أسرع محول و اكثر. بالنسبة للتكوينات الخاصة بالطراز، فإننا نقدم أ serving.properties مع المعلمات الرئيسية، مثل tensor_parallel_degree و model_id لتحديد خيارات تحميل النموذج. ال model_id يمكن أن يكون معرف نموذج Hugging Face، أو مسار Amazon S3 حيث يتم تخزين أوزان النموذج. في مثالنا، نوفر موقع Amazon S3 لنموذجنا المضبوط بدقة. يعرض مقتطف الكود التالي الخصائص المستخدمة لعرض النموذج:

%%writefile serving.properties
engine=Python
option.entryPoint=djl_python.transformers_neuronx
option.model_id=<model data s3 location>
option.batch_size=4
option.neuron_optimize_level=2
option.tensor_parallel_degree=8
option.n_positions=512
option.rolling_batch=auto
option.dtype=fp16
option.model_loading_timeout=1500

يرجى الرجوع إلى هذا توثيق لمزيد من المعلومات حول الخيارات القابلة للتكوين المتاحة عبر serving.properties. يرجى ملاحظة أننا نستخدم option.n_position=512 في هذه المدونة لتجميع AWS Neuron بشكل أسرع. إذا كنت ترغب في تجربة طول أكبر لرمز الإدخال، فإننا نوصي القارئ بتجميع النموذج مسبقًا مسبقًا (راجع نموذج الترجمة المسبقة AOT على EC2). وإلا، فقد تواجه خطأ المهلة إذا كان وقت الترجمة أكثر من اللازم.

بعد serving.properties تم تعريف الملف، سنقوم بتجميع الملف في ملف tar.gz التنسيق، على النحو التالي:

%%sh
mkdir mymodel
mv serving.properties mymodel/
tar czvf mymodel.tar.gz mymodel/
rm -rf mymodel

بعد ذلك، سنقوم بتحميل tar.gz إلى موقع حاوية Amazon S3:

s3_code_prefix = "large-model-lmi/code"
bucket = sess.default_bucket()  # bucket to house artifacts
code_artifact = sess.upload_data("mymodel.tar.gz", bucket, s3_code_prefix)
print(f"S3 Code or Model tar ball uploaded to --- > {code_artifact}")

قم بإنشاء نقطة نهاية لنموذج Amazon SageMaker

لاستخدام مثيل Inf2 للعرض، نستخدم Amazon حاوية SageMaker LMI مع دعم DJL neuronX. يرجى الرجوع إلى هذا بريد.. اعلاني لمزيد من المعلومات حول استخدام حاوية DJL NeuronX للاستدلال. يوضح التعليمة البرمجية التالية كيفية نشر نموذج باستخدام Amazon SageMaker Python SDK:

# Retrieves the DJL-neuronx docker image URI
image_uri = image_uris.retrieve(
framework="djl-neuronx",
region=sess.boto_session.region_name,
version="0.24.0"
)

# Define inf2 instance type to use for serving
instance_type = "ml.inf2.48xlarge"

endpoint_name = sagemaker.utils.name_from_base("lmi-model")

# Deploy the model for inference
model.deploy(initial_instance_count=1,
instance_type=instance_type,
container_startup_health_check_timeout=1500,
volume_size=256,
endpoint_name=endpoint_name)

# our requests and responses will be in json format so we specify the serializer and the deserializer
predictor = sagemaker.Predictor(
endpoint_name=endpoint_name,
sagemaker_session=sess,
serializer=serializers.JSONSerializer(),
)

نقطة نهاية نموذج الاختبار

بعد نشر النموذج بنجاح، يمكننا التحقق من صحة نقطة النهاية عن طريق إرسال نموذج طلب إلى المتنبئ:

prompt="What is machine learning?"
input_data = f"<s>[INST] <<SYS>>nAs a data scientistn<</SYS>>n{prompt} [/INST]"

response = predictor.predict(
{"inputs": input_data, "parameters": {"max_new_tokens":300, "do_sample":"True"}}
)

print(json.loads(response)['generated_text'])

يظهر إخراج العينة على النحو التالي:

في سياق تحليل البيانات، يشير التعلم الآلي (ML) إلى تقنية إحصائية قادرة على استخلاص القدرة التنبؤية من مجموعة بيانات ذات تعقيد ودقة متزايدة من خلال تضييق نطاق الإحصائية بشكل متكرر.

التعلم الآلي ليس تقنية إحصائية جديدة، بل هو مزيج من التقنيات الموجودة. علاوة على ذلك، لم يتم تصميمه ليتم استخدامه مع مجموعة بيانات محددة أو لإنتاج نتيجة محددة. بل تم تصميمه ليكون مرنًا بما يكفي للتكيف مع أي مجموعة بيانات والتنبؤ بأي نتيجة.

تنظيف

إذا قررت أنك لم تعد ترغب في استمرار تشغيل نقطة نهاية SageMaker، فيمكنك حذفها باستخدام AWS SDK لـ Python (boto3) أو AWS CLI أو Amazon SageMaker Console. بالإضافة إلى ذلك ، يمكنك أيضًا قم بإيقاف تشغيل موارد Amazon SageMaker Studio التي لم تعد مطلوبة.

وفي الختام

في هذا المنشور، أوضحنا لك كيفية ضبط نموذج Llama2-7b باستخدام محول LoRA مع تكميم 4 بت باستخدام مثيل GPU واحد. ثم قمنا بنشر النموذج على مثيل Inf2 المستضاف في Amazon SageMaker باستخدام حاوية تقديم DJL. أخيرًا، قمنا بالتحقق من صحة نقطة نهاية نموذج Amazon SageMaker من خلال التنبؤ بإنشاء النص باستخدام SageMaker Python SDK. تفضل وجربها، نحن نحب أن نسمع تعليقاتك. ترقب التحديثات حول المزيد من الإمكانات والابتكارات الجديدة مع AWS Inferentia.

لمزيد من الأمثلة حول AWS Neuron، راجع عينات الخلايا العصبية AWS.


حول المؤلف

وي تيه هو أحد كبار مهندسي الحلول المتخصصة في الذكاء الاصطناعي/تعلم الآلة في AWS. إنه متحمس لمساعدة العملاء على تطوير رحلة AWS الخاصة بهم، مع التركيز على خدمات Amazon Machine Learning والحلول القائمة على التعلم الآلي. خارج العمل، يستمتع بالأنشطة الخارجية مثل التخييم وصيد الأسماك والمشي لمسافات طويلة مع عائلته.

تشينغويأنا لي هو متخصص في التعلم الآلي في Amazon Web Services. حصل على الدكتوراه. في بحوث العمليات بعد أن كسر حساب منحة مستشاره البحثي وفشل في تسليم جائزة نوبل التي وعد بها. يقوم حاليًا بمساعدة العملاء في مجال الخدمات المالية وصناعة التأمين في بناء حلول التعلم الآلي على AWS. في أوقات فراغه يحب القراءة والتعليم.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة