أفضل الممارسات للتدريب على تسريع TensorFlow 1.x على Amazon SageMaker PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

أفضل الممارسات للتدريب على تسريع TensorFlow 1.x على Amazon SageMaker

اليوم ، يستخدم الكثير من العملاء TensorFlow لتدريب نماذج التعلم العميق لمعدل النقر إلى الظهور في توصيات الإعلان والتخصيص في التجارة الإلكترونية. مع تغير سلوك عملائهم ، يمكنهم تجميع كميات كبيرة من البيانات الجديدة كل يوم. يعد تكرار النموذج إحدى الوظائف اليومية لعالم البيانات ، لكنهم يواجهون مشكلة قضاء وقت طويل جدًا في التدريب على مجموعات البيانات الكبيرة.

الأمازون SageMaker هي عبارة عن نظام أساسي للتعلم الآلي (ML) مُدار بالكامل يمكن أن يساعد علماء البيانات على التركيز على النماذج بدلاً من البنية التحتية ، مع دعم أصلي لجلب الخوارزميات والأطر الخاصة بك مثل TensorFlow و PyTorch. يقدم SageMaker خيارات تدريب موزعة مرنة تتكيف مع مهام سير العمل الخاصة بك. نظرًا لأن العديد من علماء البيانات قد يفتقرون إلى الخبرة في عملية التدريب على التسريع ، فإننا نعرض لك في هذا المنشور العوامل المهمة لتدريب نموذج التعلم العميق السريع وأفضل ممارسات التدريب على التسريع لـ TensorFlow 1.x على SageMaker. لدينا أيضًا نموذج رمز ديب اف ام توزيع التدريب على SageMaker على جيثب ريبو.

هناك العديد من العوامل التي يجب مراعاتها لزيادة استخدام وحدة المعالجة المركزية / وحدة معالجة الرسومات إلى أقصى حد عند تشغيل البرنامج النصي TensorFlow على SageMaker ، مثل البنية التحتية ونوع المسرع وطريقة التدريب الموزعة وطريقة تحميل البيانات والتدريب المختلط الدقيق والمزيد.

نناقش أفضل الممارسات في المجالات التالية:

  • تسريع التدريب على مثيل واحد
  • تسريع التدريب على حالات متعددة
  • خطوط أنابيب البيانات
  • تدريب آلي مختلط بدقة

تسريع التدريب على مثيل واحد

عند تشغيل البرنامج النصي TensorFlow الخاص بك على مثيل واحد ، يمكنك اختيار سلسلة محسّنة للكمبيوتر مثل الأمازون الحوسبة المرنة السحابية (Amazon EC2) سلسلة C5 ، أو سلسلة حوسبة متسارعة مع GPU متعددة في مثيل واحد مثل p3.8xlarge و p3.16xlarge و p3dn.24xlarge و p4d.24xlarge.

في هذا القسم ، نناقش استراتيجيات وحدات المعالجة المركزية المتعددة في مثيل واحد ، والتدريب الموزع مع العديد من وحدات معالجة الرسومات في مثيل واحد.

وحدات المعالجة المركزية المتعددة في مثيل واحد

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

ضبط توازي المشغلين يدويًا على أجهزة وحدة المعالجة المركزية

يحدد TensorFlow تلقائيًا العدد المناسب من الخيوط لموازنة حساب العملية في عملية التدريب. ومع ذلك ، يمكنك ضبط ملف intra_op تجمع الخيوط و inter_op يتم توفير إعدادات التوازي بواسطة TensorFlow واستخدام متغيرات البيئة لـ MKL-DNN لتعيين الارتباط لمؤشر نظام التشغيل. انظر الكود التالي:

# Set parallelism of intra_op and inter_op
num_cpus = int(os.environ['SM_NUM_CPUS'])
config = tf.ConfigProto(allow_soft_placement=True, device_count={'CPU': num_cpus}, intra_op_parallelism_threads=num_cpus, inter_op_parallelism_threads=num_cpus)
run_config = tf.estimator.RunConfig().replace(session_config = config)

# Use Intel MKL-DNN Setting to accelerate training speed
os.environ["KMP_AFFINITY"]= "verbose,disabled"
os.environ['OMP_NUM_THREADS'] = str(num_cpus)
os.environ['KMP_SETTINGS'] = '1'

متغير البيئة KMP_AFFINITY من MKL-DNN مضبوط على granularity=fine,compact,1,0 بشكل افتراضي. بعد تعيين كلاً من TensorFlow داخل وخارج TensorFlow على الحد الأقصى لعدد وحدات المعالجة المركزية الافتراضية للمثيل الحالي ، يكون الحد الأعلى لاستخدام وحدة المعالجة المركزية تقريبًا هو نفس عدد النوى المادية لمثيل التدريب.

إذا قمت بتعيين os.environ["KMP_AFFINITY"]= "verbose,disabled"، فإن مؤشر ترابط نظام التشغيل غير مرتبط بمؤشر الترابط الفائق للأجهزة ، ويمكن أن يتجاوز استخدام وحدة المعالجة المركزية عدد النوى المادية.

فيما يتعلق بإعدادات التوازي الداخلي TensorFlow ، والتوازي البيني TensorFlow ، وعدد خيوط MKL-DNN ، ينتج عن مجموعات مختلفة من هذه المعلمات الثلاثة سرعات تدريب مختلفة. لذلك ، تحتاج إلى اختبار كل حالة للعثور على أفضل مجموعة. الوضع الشائع هو تعيين المعلمات الثلاثة (intra_op_parallelism_threads و inter_op_parallelism_threads لـ TensorFlow ، os.environ['OMP_NUM_THREADS'] لـ MKL-DNN) إلى نصف عدد وحدات vCPU (الأساسية المادية) أو العدد الإجمالي لوحدات vCPU.

طريقة البرج

لتكرار نموذج عبر وحدات معالجة الرسومات ، تحصل كل وحدة معالجة رسومات على مثيلها الخاص من التمرير الأمامي. يسمى مثيل التمرير الأمامي a برج. تُستخدم طريقة البرج دائمًا تقريبًا لأجهزة GPU. لمقارنة سرعة التدريب بالطرق الأخرى ، نستخدم هنا أيضًا طريقة البرج لجهاز وحدة المعالجة المركزية لدينا.

إذا لم تقم بتعيين جهاز وحدة المعالجة المركزية يدويًا ، فلن تستخدم TensorFlow طريقة البرج لمعدل التدرجات اللونية ، لذلك لا تحتاج إلى قياس حجم الدُفعة في مثل هذه الحالات.

  1. اضبط جهاز وحدة المعالجة المركزية يدويًا:
device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))

  1. استعمل replicate_model_fn لحزم model_fn:
DeepFM = tf.estimator.Estimator(model_fn=tf.contrib.estimator.replicate_model_fn(model_fn, devices=device_list), model_dir=FLAGS.model_dir, params=model_params, config=config)

  1. استعمل TowerOptimizer لحزم optimizer:
optimizer = tf.contrib.estimator.TowerOptimizer(optimizer)

  1. التفاف الخاص بك model_fn:
with tf.variable_scope(‘deepfm_model’, reuse=tf.AUTO_REUSE)

  1. تغيير حجم الدفعة إلى (NUM_CPU - 1).

دعونا نلقي نظرة على الاختلاف في استخدام وحدة المعالجة المركزية مع تمكين وضع البرج. يوضح الشكل التالي استخدام وحدة المعالجة المركزية لمثيل ml.c5.18xlarge بالتكوين التالي:

لا يوجد برج + بيانات LibSVM + وضع الأنبوب + MKL-DNN تعطيل الربط + إعداد توازي TensorFlow intra / inter op إلى الحد الأقصى لعدد وحدات المعالجة المركزية الافتراضية الخاصة بالمثيل

لا برج

يوضح الشكل التالي استخدام وحدة المعالجة المركزية لمثيل ml.c5.18xlarge بالتكوين التالي:

برج مزود بجهاز CPU محدد + بيانات LibSVM + وضع الأنبوب + تعطيل ربط MKL-DNN + إعداد توازي TensorFlow intra / inter op إلى الحد الأقصى لعدد وحدات المعالجة المركزية الافتراضية الخاصة بالمثيل

يكون استخدام وحدة المعالجة المركزية أعلى عند استخدام طريقة البرج ، ويتجاوز عدد النوى المادية.

استراتيجية TensorFlow معكوسة

تعني TensorFlow MirroredStrategy التدريب المتزامن عبر العديد من النسخ المتماثلة على جهاز واحد. تُستخدم هذه الإستراتيجية عادةً للتدريب على جهاز واحد مزود بوحدات معالجة رسومات متعددة. لمقارنة سرعة التدريب بأسلوب آخر ، نستخدم MirroredStrategy لجهاز وحدة المعالجة المركزية لدينا.

عند استخدام TensorFlow MirroredStrategy ، إذا لم تقم بتعيين جهاز وحدة المعالجة المركزية ، فإن TensorFlow تستخدم وحدة معالجة مركزية واحدة فقط كعامل واحد ، وهو مضيعة للموارد. نوصي بإعداد جهاز وحدة المعالجة المركزية يدويًا ، لأنه سيؤدي إلى تقليل التشغيل /CPU:0، وبالتالي فإن /CPU:0 لا يتم استخدام الجهاز كنسخة طبق الأصل هنا. انظر الكود التالي:

device_list = []
if manual_CPU_device_set:
		cpu_prefix=’/cpu:’
		for I in range(1, num_cpus):
			devices_list.append(cpu_prefix + str(i))
mirrored_strategy = tf.distribute.MirroredStrategy(devices=devices_list)
	else:
mirrored_strategy = tf.distribute.MirroredStrategy()

# Set strategy to config:
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
eval_distribute=mirrored_strategy,
session_config = config)

تحتاج إلى قياس حجم الدُفعة عند استخدام MirroredStrategy ؛ على سبيل المثال ، قم بتوسيع حجم الدُفعة إلى مضاعفات عدد أجهزة وحدة معالجة الرسومات.

بالنسبة للإستراتيجية الفرعية عند ضبط جهاز وحدة المعالجة المركزية ، إذا لم تقم بتعيين cross_device_ops المعلمة في tf.distribute.MirroredStrategy()، يستخدم TensorFlow امتداد ReductionToOneDevice استراتيجية فرعية بشكل افتراضي. ومع ذلك ، إذا قمت بتعيين HierarchicalCopyAllReduce كاستراتيجية فرعية ، يقوم TensorFlow بتقليل العمل /CPU:0. عند استخدام TensorFlow Dataset API وتوزيع الإستراتيجية معًا ، يجب إرجاع كائن مجموعة البيانات بدلاً من الميزات والتسميات في الوظيفة input_fn.

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

هوروفود

هوروفود عبارة عن إطار تدريب تعليمي عميق موزع لـ TensorFlow و Keras و PyTorch و Apache MXNet. الهدف من Horovod هو جعل التعلم العميق الموزع سريعًا وسهل الاستخدام.

هناك متغير distribution في SageMaker Python SDK Estimator API ، والتي يمكنك استخدامها لتوضيح تدريب Horovod الموزع. يوفر SageMaker البنية التحتية ويدير البرنامج النصي الخاص بك باستخدام MPI. انظر الكود التالي:

hvd_processes_per_host = 4
distribution = {'mpi': { 
'enabled': True, 
'processes_per_host': hvd_processes_per_host,
'custom_mpi_options': '-verbose --NCCL_DEBUG=INFO -x OMPI_MCA_btl_vader_single_copy_mechanism=none' 
} 
}

عند اختيار مثيل GPU مثل ml.p3.8xlarge ، تحتاج إلى تثبيت كل GPU لكل عامل:

config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

لتسريع تقارب النموذج ، قم بقياس معدل التعلم بعدد العمال وفقًا لوثائق هوروفود الرسمية. ومع ذلك ، في مشاريع العالم الحقيقي ، يجب عليك قياس معدل التعلم إلى حد ما ، ولكن ليس بعدد العمال ، مما يؤدي إلى أداء نموذج سيء. على سبيل المثال ، إذا كان معدل التعلم الأصلي 0.001 ، فإننا نقيس معدل التعلم إلى 0.0015 ، حتى لو كان عدد العمال أربعة أو أكثر.

بشكل عام ، فقط الأساسي (هوروفود رتبة 0) يحفظ نقطة التفتيش والنموذج بالإضافة إلى عملية التقييم. لا تحتاج إلى قياس حجم الدُفعة عند استخدام Horovod. عروض SageMaker وضع الأنابيب لدفق البيانات من خدمة تخزين أمازون البسيطة (Amazon S3) في حالات التدريب. عند تمكين وضع الأنابيب ، يجب أن تدرك أن العاملين المختلفين على نفس المضيف يحتاجون إلى استخدام قنوات مختلفة لتجنب الأخطاء. هذا لأن أول عملية عاملة تقرأ بيانات FIFO / القناة ، وستتوقف عمليات العمال الأخرى في نفس المثيل لأنهم لا يستطيعون قراءة البيانات من نفس قناة FIFO ، لذلك لا يعمل Horovod بشكل صحيح. لتجنب هذه المشكلة ، قم بتعيين القنوات وفقًا لعدد العمال لكل مثيل. تأكد على الأقل من أن العاملين المختلفين على نفس المضيف يستهلكون قنوات مختلفة ؛ نفس القناة يمكن أن يستهلكها العمال على مضيف مختلف.

عند استخدام Horovod ، قد تواجه الخطأ التالي:

“One or more tensors were submitted to be reduced, gathered or broadcasted by subset of ranks and are waiting for remainder of ranks for more than 60 seconds. This may indicate that different ranks are trying to submit different tensors or that only subset of ranks is submitting tensors, which will cause deadlock.”

السبب المحتمل لهذه المشكلة هو أن رتبة معينة (مثل الرتبة 0) تعمل بشكل أبطأ أو تؤدي وظائف أكثر من الرتب الأخرى ، وهذا يتسبب في انتظار الرتب الأخرى لفترة طويلة. على الرغم من أن الرتبة 0 يجب أن تقوم أحيانًا بعمل أكثر من الرتب الأخرى ، إلا أنه يجب ملاحظة أن المرتبة 0 لا ينبغي أن تفعل الكثير لفترة طويلة. على سبيل المثال ، بالنسبة لتقييم النموذج على مجموعة التحقق من الصحة وحفظ نقاط التفتيش أثناء التدريب ، إذا كان لا مفر من أن تستغرق هذه العمليات وقتًا طويلاً ، مما قد يتسبب في حدوث أخطاء ، فإن أحد الحلول البديلة هو السماح لجميع العمال بالقيام بنفس عمل الرتبة 0 (نقاط التفتيش الادخار والتقييم وما إلى ذلك).

تعد تجزئة البيانات أحد أهم الأشياء التي يجب مراعاتها عند استخدام التدريب الموزع. يمكنك استخدام TensorFlow dataset.shard() في البرنامج النصي الخاص بك. يقدم SageMaker أيضًا ميزة جزء مجموعة البيانات في ملف قناة المدخلات عن طريق الإعداد distribution=S3shardbykey في قناة مجموعة البيانات. انظر الكود التالي:

dataset = PipeModeDataset(channel, record_format='TFRecord')

number_host = len(FLAGS.hosts)

if FLAGS.enable_data_multi_path : # If there are multi channels mapping with different S3 path
    if FLAGS.enable_s3_shard == False :
        if number_host > 1:
            index = hvd.rank() // FLAGS.worker_per_host
            dataset = dataset.shard(number_host, index)
else :
    if FLAGS.enable_s3_shard :
        dataset = dataset.shard(FLAGS.worker_per_host, hvd.local_rank())
    else :
        dataset = dataset.shard(hvd.size(), hvd.rank())

يوضح الشكل التالي النتيجة عند استخدام Horovod (ml.c5.18xlarge ، Horovod + LibSVM + default intra op and inter op setting) ، والتي يمكنك مقارنتها بطريقة البرج.

هوروفود

تدريب موزع باستخدام وحدات معالجة رسومات متعددة في مثيل واحد

من الطبيعي أن تبدأ التدريب الموزع مع وحدات معالجة رسومات متعددة في مثيل واحد لأن علماء البيانات يحتاجون فقط إلى إدارة مثيل واحد والاستفادة من الارتباط عالي السرعة بين وحدات معالجة الرسومات. تدعم مهام تدريب SageMaker أنواع المثيلات المتعددة التي تحتوي على وحدات معالجة رسومات متعددة في مثيل واحد ، مثل ml.p3.8xlarge و ml.p3.16xlarge و ml.p3dn.24xlarge و ml.p4d.24xlarge. الطريقة هي نفسها مثل العديد من وحدات المعالجة المركزية في مثيل واحد ، ولكن مع بعض التغييرات في البرنامج النصي.

طريقة البرج

طريقة البرج هنا هي نفسها تقريبًا كما في التدريب متعدد وحدات المعالجة المركزية. تحتاج إلى قياس حجم الدُفعة وفقًا لعدد وحدات معالجة الرسومات المستخدمة.

استراتيجية TensorFlow معكوسة

الاستراتيجية الفرعية الافتراضية لـ MirroredStrategy is NcclAllReduce. تحتاج إلى قياس حجم الدُفعة وفقًا لعدد وحدات معالجة الرسومات المستخدمة. انظر الكود التالي:

mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy,
				eval_distribute=mirrored_strategy)

تسريع التدريب على حالات متعددة

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

وحدات المعالجة المركزية متعددة مع حالات متعددة

هناك أربع طرق رئيسية لاستخدام وحدات المعالجة المركزية المتعددة مع حالات متعددة عند تمكين التدريب الموزع:

    • خادم المعلمات بدون ضبط توازي المشغلين يدويًا على أجهزة وحدة المعالجة المركزية
    • خادم المعلمات مع ضبط توازي المشغلين يدويًا على أجهزة وحدة المعالجة المركزية
    • خادم معلمات مع برج (ضبط أجهزة وحدة المعالجة المركزية يدويًا ، وتعيينها allow_soft_placement=True in tf.ConfigProto)
    • هوروفود

عند استخدام خادم معلمة في ملف tf.estimator API ، يجب أن يكون مسار نقطة التفتيش مسارًا قابلاً للمشاركة مثل Amazon S3 أو المسار المحلي لـ خدمة الملفات المرنة من أمازون (Amazon EFS) تعيين الحاوية. بالنسبة لخادم المعلمات بتنسيق tf.keras، يمكن تعيين مسار نقطة التفتيش على المسار المحلي. بالنسبة إلى Horovod ، يمكن تعيين مسار نقطة التفتيش على مسار محلي لمثيل التدريب.

عند استخدام خادم المعلمة و tf.estimator API مع مسار نقطة التفتيش إلى Amazon S3 ، إذا كان النموذج كبيرًا جدًا ، فقد تواجه خطأً أساسيًا عالقًا عند حفظ نقطة التفتيش في S3. يمكنك استخدام حاوية SageMaker المضمنة TensorFlow 1.15 أو TensorFlow 1.15.2 أو استخدام Amazon EFS كمسار نقطة تفتيش للمشاركة.

عند استخدام خادم معلمات لعدة مضيفين ، قد يكون تحميل المعلمة على كل عملية خادم معلمة غير متوازن (خاصةً عند وجود متغيرات جدول تضمين كبيرة نسبيًا) ، مما قد يتسبب في حدوث أخطاء. يمكنك التحقق من حجم الملف لكل نقطة فحص للجزء في Amazon S3 لتحديد ما إذا كانت المعلمات على خادم المعلمات متوازنة ، لأن كل خادم معلمة يتوافق مع جزء من ملف نقاط التحقق. لتجنب مثل هذه المشكلات ، يمكنك استخدام وظيفة التقسيم لمحاولة جعل معلمات كل خادم معلمة موزعة بالتساوي:

with tf.variable_scope('deepfm_model', reuse=tf.AUTO_REUSE, partitioner = tf.fixed_size_partitioner(num_shards=len(FLAGS.hosts))):

GPU واحد مع مثيلات متعددة

تدعم وظائف تدريب SageMaker الحالات التي تحتوي على وحدة معالجة رسومات واحدة فقط ، مثل سلسلة ml.p3.xlarge و ml.g4dn و ml.g5. هناك طريقتان رئيسيتان مستخدمتان في هذا السيناريو: خوادم المعلمات و Horovod.

تتمثل طريقة التدريب الموزع لخادم المعلمات المضمنة في SageMaker في بدء عملية خادم معلمة وعملية عاملة لكل مثيل تدريب (يكون كل خادم معلمة مسؤولاً فقط عن جزء من معلمات النموذج) ، وبالتالي فإن الإعداد الافتراضي هو جهاز واحد متعدد الأجهزة تدريب GPU. التدريب الموزع لخادم المعلمات المدمج في SageMaker هو طريقة تحديث متدرجة غير متزامنة. لتقليل تأثير التحديثات غير المتزامنة على تقارب التدريب ، يوصى بتقليل معدل التعلم. إذا كنت تريد استخدام جميع وحدات معالجة الرسومات في المثيل ، فأنت بحاجة إلى استخدام مجموعة من خوادم المعلمات وطريقة البرج.

بالنسبة إلى Horovod ، حدد للتو processes_per_host=1 في معلمة التوزيع الخاصة بواجهة برمجة تطبيقات SageMaker Python Estimator.

وحدات معالجة رسومات متعددة مع مثيلات متعددة

بالنسبة لخوادم المعلمات وطريقة البرج ، فإن تغييرات الكود هي في الأساس نفس طريقة البرج لمثيل واحد مع العديد من وحدات معالجة الرسومات ، وليست هناك حاجة لضبط أجهزة GPU يدويًا.

بالنسبة إلى Horovod ، اضبط Operations_per_host في معلمة التوزيع على عدد وحدات معالجة الرسومات لكل مثيل تدريب. إذا كنت تستخدم وضع الأنابيب ، فيجب أن يتطابق عدد العمال لكل مثيل مع عدد القنوات.

خطوط أنابيب البيانات

بالإضافة إلى البنية التحتية التي ناقشناها ، هناك شيء آخر مهم يجب مراعاته: خط أنابيب البيانات. يشير خط أنابيب البيانات إلى كيفية تحميل البيانات وتحويلها قبل أن تتغذى في الشبكات العصبية. تُستخدم وحدة المعالجة المركزية لإعداد البيانات ، بينما تُستخدم وحدة معالجة الرسومات لحساب البيانات من وحدة المعالجة المركزية. نظرًا لأن GPU مورد مكلف ، فإن وقت خمول GPU غير فعال ؛ يمكن أن يؤدي وجود خط بيانات جيد في وظيفتك التدريبية إلى تحسين استخدام وحدة معالجة الرسومات ووحدة المعالجة المركزية.

عندما تحاول تحسين خط أنابيب إدخال بيانات TensorFlow ، ضع في اعتبارك ترتيب واجهة برمجة التطبيقات المستخدم فيه مجموعات بيانات TensorFlow، وحجم بيانات التدريب (الكثير من الملفات الصغيرة أو عدة ملفات كبيرة) ، وحجم الدفعة ، وما إلى ذلك.

لنلق نظرة على التفاعل بين وحدة معالجة الرسومات ووحدة المعالجة المركزية أثناء التدريب. تقارن الأرقام التالية التفاعلات مع وبدون خط أنابيب.

خط أنابيب

يمكن أن يؤدي وجود خط أنابيب أفضل إلى تقليل وقت خمول وحدة معالجة الرسومات. ضع في اعتبارك النصائح التالية:

  • استخدم منطق الوظيفة البسيط في استخراج الميزات والتسميات
  • عينات الجلب المسبق في الذاكرة
  • قم بتقليل إدخال / إخراج القرص غير الضروري وإدخال / إخراج الشبكة
  • تخزين الميزات والعلامات المعالجة مؤقتًا في الذاكرة
  • قلل عدد مرات النسخ المتماثل بين CPU و GPU
  • اطلب من عمال مختلفين التعامل مع أجزاء مختلفة من مجموعة بيانات التدريب
  • قلل أوقات استدعاء واجهة برمجة تطبيقات مجموعة بيانات TensorFlow

يوفر TensorFlow واجهة برمجة تطبيقات للتحويل تتعلق بتنسيقات مجموعة البيانات ، ويؤثر ترتيب واجهة برمجة تطبيقات التحويل في TensorFlow على سرعة التدريب كثيرًا. يجب اختبار أفضل ترتيب لاستدعاء واجهة برمجة تطبيقات مجموعة بيانات TensorFlow. فيما يلي بعض المبادئ الأساسية:

  • استخدم خريطة متجهية. وهذا يعني استدعاء API لمجموعة بيانات TensorFlow أولاً ، ثم API لخريطة مجموعة البيانات. وظيفة التحليل المخصصة المتوفرة في وظيفة الخريطة ، مثل decode_tfrecord في نموذج التعليمات البرمجية ، يوزع دفعة صغيرة من البيانات. على العكس من ذلك ، فإن التعيين أولاً ثم الدُفعة عبارة عن خريطة عددية ، وتعالج وظيفة المحلل اللغوي المخصص عينة واحدة فقط.
  • استخدم واجهة برمجة تطبيقات ذاكرة التخزين المؤقت لمجموعة بيانات TensorFlow لتخزين الميزات والتسميات مؤقتًا. ضع واجهة برمجة تطبيقات ذاكرة التخزين المؤقت لمجموعة بيانات TensorFlow قبل واجهة برمجة تطبيقات تكرار مجموعة بيانات TensorFlow ، وإلا فإن استخدام ذاكرة الوصول العشوائي يزيد حقبة خطية تلو الأخرى. إذا كانت مجموعة البيانات كبيرة مثل ذاكرة الوصول العشوائي ، فلا تستخدم واجهة برمجة تطبيقات ذاكرة التخزين المؤقت لمجموعة بيانات TensorFlow. إذا كنت بحاجة إلى استخدام واجهة برمجة تطبيقات ذاكرة التخزين المؤقت لمجموعة بيانات TensorFlow وواجهة برمجة تطبيقات خلط ورق اللعب ، ففكر في استخدام الترتيب التالي: إنشاء كائن مجموعة بيانات TensorFlow -> واجهة برمجة تطبيقات ذاكرة التخزين المؤقت -> واجهة برمجة التطبيقات العشوائية -> واجهة برمجة تطبيقات الدُفعات -> API للخريطة -> واجهة برمجة التطبيقات (API) المتكررة -> واجهة برمجة التطبيقات (API) للجلب المسبق.
  • استخدم tfrecord تنسيق مجموعة البيانات أكثر من تنسيق LibSVM.
  • يعتمد وضع الملف أو وضع الأنبوب على تنسيق مجموعة البيانات وكمية الملفات. ال tfrecorddataset يمكن تعيين API num_parallel_reads لقراءة ملفات متعددة بالتوازي وتعيين buffer_size لتحسين قراءة البيانات ، بينما pipemodedataset لا تحتوي واجهة برمجة التطبيقات على مثل هذه الإعدادات. يعد وضع الأنبوب أكثر ملاءمة للمواقف التي يكون فيها الملف الفردي كبيرًا ويكون إجمالي عدد الملفات صغيرًا. نوصي باستخدام مهمة معالجة SageMaker للقيام بأعمال المعالجة المسبقة ، مثل ضم ملفات متعددة إلى ملف أكبر وفقًا للتسميات ، باستخدام طريقة أخذ العينات لجعل مجموعة البيانات أكثر توازناً ، وخلط مجموعة البيانات المتوازنة.

انظر نموذج التعليمات البرمجية التالي:

def decode_tfrecord(batch_examples):
        # The feature definition here should BE consistent with LibSVM TO TFRecord process.
        features = tf.parse_example(batch_examples,
                                           features={
                                               "label": tf.FixedLenFeature([], tf.float32),
                                               "ids": tf.FixedLenFeature(dtype=tf.int64, shape=[FLAGS.field_size]),
                                               "values": tf.FixedLenFeature(dtype=tf.float32, shape=[FLAGS.field_size]) 
                                           })
        
        batch_label = features["label"]
        batch_ids = features["ids"]
        batch_values = features["values"]
        
        return {"feat_ids": batch_ids, "feat_vals": batch_values}, batch_label


    def decode_libsvm(line):
        columns = tf.string_split([line], ' ')
        labels = tf.string_to_number(columns.values[0], out_type=tf.float32)
        splits = tf.string_split(columns.values[1:], ':')
        id_vals = tf.reshape(splits.values,splits.dense_shape)
        feat_ids, feat_vals = tf.split(id_vals,num_or_size_splits=2,axis=1)
        feat_ids = tf.string_to_number(feat_ids, out_type=tf.int32)
        feat_vals = tf.string_to_number(feat_vals, out_type=tf.float32)
        return {"feat_ids": feat_ids, "feat_vals": feat_vals}, labels

if FLAGS.pipe_mode == 0:
        dataset = tf.data.TFRecordDataset(filenames)
    else :
        # Enter Pipe mode
        dataset = PipeModeDataset(channel, record_format='TFRecord')
        
    if FLAGS.enable_s3_shard == False:
        host_rank = FLAGS.hosts.index(FLAGS.current_host)
        number_host = len(FLAGS.hosts)
        dataset = dataset.shard(number_host, host_rank)
    
    dataset = dataset.batch(batch_size, drop_remainder=True) # Batch size to use
    dataset = dataset.map(decode_tfrecord,
                          num_parallel_calls=tf.data.experimental.AUTOTUNE) 

    if num_epochs > 1:
        dataset = dataset.repeat(num_epochs)
    dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

للتدريب على مثيلات وحدة المعالجة المركزية ، قم بتعيين التوازي لـ intra op, inter op، ومتغير البيئة لـ MKL-DNN هو نقطة انطلاق جيدة.

تدريب آلي مختلط بدقة

آخر شيء نناقشه هو التدريب التلقائي المختلط الدقيق ، والذي يمكن أن يسرع السرعة ويؤدي إلى أداء النموذج. حتى كتابة هذه السطور ، تدعم Nvidia V100 GPU (مثيل P3) و A100 (مثيل P4dn) نواة Tensor. يمكنك تمكين التدريب المختلط الدقيق في TensorFlow عند استخدام تلك الأنواع من المثيلات. بدءًا من الإصدار 1.14 ، دعم TensorFlow التدريب التلقائي المختلط الدقيق. يمكنك استخدام العبارة التالية لتغليف المُحسِّن الأصلي:

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

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

وفي الختام

عندما تبدأ تدريب نموذج التعلم العميق في SageMaker ، ضع في اعتبارك النصائح التالية لتحقيق سرعة تدريب أسرع:

  • جرب الطريقة متعددة وحدات المعالجة المركزية ، أو طريقة المثيل الفردي أو وحدة معالجة الرسومات الأحادية ، طريقة المثيل الفردي أولاً. إذا كان استخدام وحدة المعالجة المركزية / وحدة معالجة الرسومات عالية جدًا (على سبيل المثال أكثر من 90٪) ، فانتقل إلى الخطوة التالية.
  • جرب المزيد من وحدات المعالجة المركزية في مضيف واحد أو المزيد من وحدات معالجة الرسومات في مضيف واحد. إذا كان الاستخدام قريبًا من الحد الأقصى لاستخدام وحدات المعالجة المركزية أو وحدات معالجة الرسومات ، فانتقل إلى الخطوة التالية.
  • جرب وحدات معالجة مركزية متعددة أو وحدات معالجة رسومات متعددة مع مضيفين متعددين.
  • تحتاج إلى تعديل الأكواد عند استخدام خوادم المعلمات أو هوروفود. تعديل الكود ليس هو نفسه بالنسبة لواجهة برمجة التطبيقات المستندة إلى جلسة TensorFlow ، tf.estimator API و tf.keras API. قد يُظهر خادم المعلمات أو Horovod سرعات تدريب مختلفة في حالات ومهام تدريب مختلفة ، لذا جرب كلا الطريقتين إذا كان لديك الوقت والميزانية لتحديد أفضلهما.

ضع في اعتبارك النصيحة التالية:

  • تحقق من الاستخدام قبل التوسع ، وقم بتحسين مسار البيانات لديك ، واجعل وحدة المعالجة المركزية ووحدة معالجة الرسومات متداخلة في المخطط الزمني.
  • قم أولاً بالارتقاء ، ثم توسيع النطاق.
  • إذا لم تتمكن من زيادة استخدام GPU الخاص بك بعد كل الطرق ، فجرّب وحدة المعالجة المركزية. هناك العديد من الحالات (خاصة بالنسبة لنموذج تصنيف نسبة النقر إلى الظهور) حيث يكون إجمالي وقت التدريب لتدريب مثيل وحدة المعالجة المركزية أقصر وأكثر فعالية من حيث التكلفة من تدريب مثيل وحدة معالجة الرسومات.

لدينا أيضًا نموذج رمز في ملف جيثب ريبو، حيث نعرض عينتين من تدريب DeepFM الموزع على SageMaker. الأول هو خادم معلمات TensorFlow على مثيلات وحدة المعالجة المركزية ، والآخر هو Horovod في مثيلات GPU.


حول المؤلف

أفضل الممارسات للتدريب على تسريع TensorFlow 1.x على Amazon SageMaker PlatoBlockchain Data Intelligence. البحث العمودي. عاي. يوهوي ليانغ مهندس حلول التعلم الآلي. لقد ركز على الترويج للتعلم الآلي وتطبيقه ، وشارك بعمق في العديد من مشاريع التعلم الآلي للعملاء. يتمتع بخبرة غنية في التعلم العميق للتدريب الموزع وأنظمة التوصية والإعلانات الحاسوبية.

أفضل الممارسات للتدريب على تسريع TensorFlow 1.x على Amazon SageMaker PlatoBlockchain Data Intelligence. البحث العمودي. عاي.شيشواي وانغ مهندس حلول التعلم الآلي. إنه يعمل مع عملاء AWS لمساعدتهم على تبني التعلم الآلي على نطاق واسع. يستمتع بمشاهدة الأفلام والسفر حول العالم.

الطابع الزمني:

اكثر من التعلم الآلي من AWS