Accelerate documentation
أضِف Accelerate إلى كودك
أضِف Accelerate إلى كودك
لكل إطار عمل للتدريب الموزّع أسلوبه الخاص في العمل، مما قد يتطلب كتابة الكثير من الأكواد المخصصة لتكييفه مع كود التدريب الخاص بك في PyTorch وبيئة التدريب. يقدّم Accelerate طريقة سهلة للتفاعل مع هذه أطر العمل للتدريب الموزّع دون الحاجة إلى تعلّق التفاصيل المحددة لكل إطار منها. يتكفّل Accelerate بتلك التفاصيل نيابةً عنك، مما يتيح لك التركيز على كود التدريب وتوسيع نطاقه إلى أي بيئة تدريب موزّع.
في هذا الشرح التعليمي، ستتعلم كيفية تكييف كود PyTorch الخاص بك باستخدام Accelerate لتسهيل تدريبك على الأنظمة الموزعة! ستبدأ بحلقة تدريب أساسية في PyTorch (على افتراض أن جميع كائنات التدريب مثل model وoptimizer تم إعدادها بالفعل) ثم تدمج Accelerate فيها تدريجيًا.
device = "cuda"
model.to(device)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
inputs = inputs.to(device)
targets = targets.to(device)
outputs = model(inputs)
loss = loss_function(outputs, targets)
loss.backward()
optimizer.step()
scheduler.step()مُسرِّع
يُعدّ Accelerator الفئة الرئيسية لتكييف كودك للعمل مع Accelerate. فهي على دراية بإعداد التوزيع الذي تستخدمه، مثل عدد العمليات المختلفة ونوع العتاد لديك. كما توفر هذه الفئة الوصول إلى العديد من الطرق اللازمة لتمكين كود PyTorch الخاص بك من العمل في أي بيئة تدريب موزعة، ولإدارة العمليات وتنفيذها عبر الأجهزة.
لهذا السبب يجب أن تبدأ دائمًا باستيراد وإنشاء كائن Accelerator في سكربت الخاص بك.
from accelerate import Accelerator
accelerator = Accelerator()يعرف Accelerator أيضاً الجهاز الذي يجب نقل كائنات PyTorch الخاصة بك إليه، لذا يُوصى بترك الأمر لـ Accelerate للتعامل مع ذلك نيابةً عنك.
- device = "cuda"
+ device = accelerator.device
model.to(device)تجهيز كائنات PyTorch
في الخطوة التالية، تحتاج إلى تجهيز كائنات PyTorch الخاصة بك (النموذج، المُحسِّن، المُجدوِل، إلخ) للتدريب الموزَّع. يتكفّل prepare() بوضع النموذج في الحاوية المناسبة (مثل GPU واحد أو عدة GPUs) وفقاً لإعداد التدريب لديك، وتكييف المُحسِّن والمُجدوِل لاستخدام AcceleratedOptimizer وAcceleratedScheduler من Accelerate، وإنشاء مُحمِّل بيانات جديد يمكن تقسيمه عبر العمليات.
يُعدّ Accelerate فقط الكائنات التي ترث من فئات PyTorch المقابلة لها مثل
torch.optim.Optimizer.
تُعاد كائنات PyTorch بنفس الترتيب الذي أُرسلت به.
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)حلقة التدريب
أخيرًا، احذف استدعاءات to(device) للمدخلات والأهداف في حلقة التدريب لأن فئات DataLoader الخاصة بـ Accelerate تضعها تلقائيًا على الجهاز الصحيح. كما يجب أن تستبدل مسار backward() المعتاد بطريقة backward() الخاصة بـ Accelerate التي تقوم بتحديد مقياس التدرجات نيابةً عنك وتستخدم طريقة backward() المناسبة اعتمادًا على إعدادك الموزع (على سبيل المثال، DeepSpeed أو Megatron).
- inputs = inputs.to(device)
- targets = targets.to(device)
outputs = model(inputs)
loss = loss_function(outputs, targets)
- loss.backward()
+ accelerator.backward(loss)اجمع كل شيء معًا، وستبدو حلقة تدريب Accelerate الجديدة لديك على النحو التالي!
from accelerate import Accelerator
accelerator = Accelerator()
device = accelerator.device
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = loss_function(outputs, targets)
accelerator.backward(loss)
optimizer.step()
scheduler.step()ميزات التدريب
توفر مكتبة Accelerate ميزات إضافية - مثل تراكم التدرجات، وقص التدرجات، والتدريب بدقة مختلطة وغيرها - يمكنك إضافتها إلى سكربتك لتحسين عملية التدريب. دعونا نستكشف هذه الميزات الثلاث.
تراكم التدرجات
يتيح لك تراكم التدرّجات (Gradient accumulation) التدريب على أحجام دفعات (batch sizes) أكبر من خلال تراكم التدرّجات عبر دفعات متعددة قبل تحديث الأوزان. وقد يكون ذلك مفيدًا للتغلب على قيود الذاكرة. لتفعيل هذه الميزة في Accelerate، حدّد معامل gradient_accumulation_steps في فئة Accelerator وأضف مدير السياق accumulate() إلى سكربتك.
+ accelerator = Accelerator(gradient_accumulation_steps=2)
model, optimizer, training_dataloader = accelerator.prepare(model, optimizer, training_dataloader)
for input, label in training_dataloader:
+ with accelerator.accumulate(model):
predictions = model(input)
loss = loss_function(predictions, label)
accelerator.backward(loss)
optimizer.step()
scheduler.step()
optimizer.zero_grad()قص التدرجات
تُعدّ تقليم التدرّجات تقنيةً للوقاية من "انفجار التدرّجات"، ويوفّر Accelerate:
- clipgrad_value() لقص التدرجات إلى قيمة دنيا وقيمة قصوى
- clipgrad_norm() لتطبيع التدرجات إلى قيمة معينة
الدقة المختلطة
يعمل الدقة المختلطة على تسريع التدريب من خلال استخدام نوع بيانات بدقة أقل مثل fp16 (دقة نصفية) لحساب التدرجات. للحصول على أفضل أداء مع Accelerate، يجب حساب الخسارة داخل نموذجك (كما هو الحال في نماذج Transformers) لأن الحسابات خارج النموذج تُحسب بالدقة الكاملة.
اضبط نوع الدقة المختلطة للاستخدام في Accelerator، ثم استخدم مدير السياق autocast() لتحويل القيم تلقائيًا إلى نوع البيانات المحدد.
يتيح Accelerate دقة مختلطة تلقائية، لذا لا يكون autocast() مطلوباً إلا إذا كانت هناك عمليات دقة مختلطة أخرى بخلاف تلك التي تُنفَّذ على الخسارة بواسطة backward() والتي تتعامل بالفعل مع التوسيع.
+ accelerator = Accelerator(mixed_precision="fp16")
+ with accelerator.autocast():
loss = complex_loss_function(outputs, target)الحفظ والتحميل
يمكن لـ Accelerate أيضًا حفظ النموذج وتحميله بعد اكتمال التدريب، أو يمكنك حفظ الحالة للنموذج والمُحسِّن، وهو ما قد يكون مفيدًا لاستئناف التدريب.
النموذج
بمجرد اكتمال جميع العمليات، افكك تغليف النموذج باستخدام طريقة unwrap_model() قبل حفظه، لأن طريقة prepare() قامت بتغليف نموذجك في الواجهة المناسبة للتدريب الموزع. إذا لم تفكك تغليف النموذج، فإن حفظ قاموس حالة النموذج سيؤدي أيضاً إلى حفظ أي طبقات إضافية محتملة من النموذج الأكبر، ولن تتمكن من تحميل الأوزان مرة أخرى إلى نموذجك الأساسي.
يجب عليك استخدام طريقة save_model() لفك تغليف النموذج وحفظ قاموس حالة النموذج. كما يمكن لهذه الطريقة حفظ النموذج في نقاط تحقق مجزأة أو في صيغة safetensors.
accelerator.wait_for_everyone() accelerator.save_model(model, save_directory)
بالنسبة إلى النماذج من مكتبة Transformers، احفظ النموذج باستخدام الطريقة save_pretrained بحيث يمكن إعادة تحميله باستخدام الطريقة from_pretrained.
from transformers import AutoModel unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained( "path/to/my_model_directory", is_main_process=accelerator.is_main_process, save_function=accelerator.save, ) model = AutoModel.from_pretrained("path/to/my_model_directory")
لتحميل أوزانك، استخدم طريقة unwrap_model() لفك تغليف النموذج أولاً قبل تحميل الأوزان. جميع معاملات النموذج هي مراجع إلى المصفوفات (tensors)، لذا يتم تحميل أوزانك داخل model.
unwrapped_model = accelerator.unwrap_model(model)
path_to_checkpoint = os.path.join(save_directory,"pytorch_model.bin")
unwrapped_model.load_state_dict(torch.load(path_to_checkpoint))اضبط safe_serialization=True لحفظ النموذج بتنسيق safetensor.
accelerator.wait_for_everyone()
accelerator.save_model(model, save_directory, max_shard_size="1GB", safe_serialization=True)لتحميل نقطة تحقق مجزأة أو نقطة تحقق بتنسيق safetensor، استخدم طريقة load_checkpoint_in_model(). تتيح لك هذه الطريقة تحميل نقطة تحقق على جهاز محدد.
load_checkpoint_in_model(unwrapped_model, save_directory, device_map={"":device})الحالة
أثناء التدريب، قد ترغب في حفظ الحالة الحالية للنموذج والمُحسِّن ومولّدات الأعداد العشوائية، وربما مجدولات معدل التعلم، بحيث يمكن استعادتها في النفس السكربت. يجب عليك إضافة طريقتي save_state() وload_state() إلى سكربتك لحفظ الحالات وتحميلها.
لتخصيص مكان وحالة حفظ الحالات بشكل أكبر عبر save_state()، استخدم فئة ProjectConfiguration. على سبيل المثال، إذا كان automatic_checkpoint_naming مفعلاً، يُحفظ كل نقطة تحقق محفوظة في Accelerator.project_dir/checkpoints/checkpoint_{checkpoint_number}.
يجب تسجيل أي عناصر أخرى ذات حالة يُراد حفظها باستخدام طريقة register_for_checkpointing() حتى يمكن حفظها وتحميلها. يجب أن تحتوي كل كائن يُمرر إلى هذه الطريقة ليتم حفظه على دالة load_state_dict ودالة state_dict.
Update on GitHubإذا كان لديك
torchdata>=0.8.0مثبتًا، يمكنك أيضًا تمريرuse_stateful_dataloader=Trueإلى DataLoaderConfiguration الخاص بك. يوسّع هذا فئات DataLoader في Accelerate بوظيفةload_state_dictووظيفةstate_dict، ويجعلAccelerator.save_stateوAccelerator.load_stateتتتبع أيضًا مدى التقدم في قراءة مجموعة بيانات التدريب عند حفظ النموذج.