Amazon SageMaker PlatoBlockchain ڈیٹا انٹیلی جنس پر TensorFlow 1.x ایکسلریشن ٹریننگ کے بہترین طریقے۔ عمودی تلاش۔ عی

Amazon SageMaker پر TensorFlow 1.x ایکسلریشن ٹریننگ کے بہترین طریقے

آج، بہت سارے صارفین ای کامرس میں اشتہارات اور ذاتی نوعیت کی سفارشات میں کلک تھرو ریٹ کے لیے گہری سیکھنے کے ماڈلز کو تربیت دینے کے لیے TensorFlow کا استعمال کر رہے ہیں۔ جیسے جیسے ان کے کلائنٹس کے رویے میں تبدیلی آتی ہے، وہ ہر روز بڑی مقدار میں نیا ڈیٹا جمع کر سکتے ہیں۔ ماڈل کی تکرار ڈیٹا سائنسدان کی روزمرہ کی ملازمتوں میں سے ایک ہے، لیکن انہیں بڑے ڈیٹا سیٹس پر تربیت حاصل کرنے میں بہت زیادہ وقت لینے کا مسئلہ درپیش ہے۔

ایمیزون سیج میکر ایک مکمل طور پر منظم مشین لرننگ (ML) پلیٹ فارم ہے جو ڈیٹا سائنسدانوں کو بنیادی ڈھانچے کے بجائے ماڈلز پر توجہ مرکوز کرنے میں مدد کر سکتا ہے، جس میں آپ کے اپنے الگورتھم اور فریم ورک جیسے TensorFlow اور PyTorch لانے کے لیے مقامی مدد حاصل ہو سکتی ہے۔ سیج میکر لچکدار تقسیم شدہ تربیتی اختیارات پیش کرتا ہے جو آپ کے مخصوص ورک فلو کے مطابق ہوتا ہے۔ چونکہ بہت سے ڈیٹا سائنسدانوں کو ایکسلریشن ٹریننگ کے عمل میں تجربے کی کمی ہو سکتی ہے، اس پوسٹ میں ہم آپ کو وہ عوامل دکھاتے ہیں جو فاسٹ ڈیپ لرننگ ماڈل ٹریننگ کے لیے اہم ہیں اور SageMaker پر TensorFlow 1.x کے لیے ایکسلریشن ٹریننگ کے بہترین طریقے۔ ہمارے پاس ایک نمونہ کوڈ بھی ہے۔ ڈیپ ایف ایم پر سیج میکر پر تربیت تقسیم کی۔ GitHub repo.

سیج میکر پر اپنی TensorFlow اسکرپٹ چلاتے وقت آپ کو CPU/GPU کے زیادہ سے زیادہ استعمال کے لیے بہت سے عوامل پر غور کرنا چاہیے، جیسے کہ انفراسٹرکچر، ایکسلریٹر کی قسم، تقسیم شدہ تربیت کا طریقہ، ڈیٹا لوڈ کرنے کا طریقہ، مخلوط درستگی کی تربیت، اور بہت کچھ۔

ہم درج ذیل شعبوں میں بہترین طریقوں پر تبادلہ خیال کرتے ہیں:

  • ایک ہی موقع پر تربیت کو تیز کریں۔
  • متعدد مواقع پر تربیت کو تیز کریں۔
  • ڈیٹا پائپ لائنز
  • خودکار مخلوط صحت سے متعلق تربیت

ایک ہی موقع پر تربیت کو تیز کریں۔

اپنی TensorFlow اسکرپٹ کو کسی ایک مثال پر چلاتے وقت، آپ کمپیوٹر کو آپٹمائزڈ سیریز کا انتخاب کرسکتے ہیں جیسے کہ ایمیزون لچکدار کمپیوٹ کلاؤڈ (Amazon EC2) C5 سیریز، یا ایک ہی مثال میں ایک سے زیادہ GPU کے ساتھ ایک تیز رفتار کمپیوٹنگ سیریز جیسے p3.8xlarge، p3.16xlarge، p3dn.24xlarge، اور p4d.24xlarge۔

اس سیکشن میں، ہم ایک ہی موقع پر متعدد CPUs کے لیے حکمت عملیوں پر تبادلہ خیال کرتے ہیں، اور ایک ہی موقع پر متعدد GPUs کے ساتھ تربیت تقسیم کرتے ہیں۔

ایک ہی مثال پر متعدد CPUs

اس سیکشن میں، ہم CPU ڈیوائسز پر آپریٹرز کی متوازی ترتیب، ٹاور کا طریقہ، TensorFlow MirroredStrategy، اور Horovod پر بات کرتے ہیں۔

سی پی یو ڈیوائسز پر آپریٹرز کی ہم آہنگی کو دستی طور پر ترتیب دینا

TensorFlow خود بخود دھاگوں کی مناسب تعداد کا انتخاب کرتا ہے تاکہ تربیت کے عمل میں آپریشن کے حساب کتاب کو متوازی بنایا جا سکے۔ تاہم، آپ سیٹ کر سکتے ہیں intra_op دھاگے پول اور inter_op TensorFlow کے ذریعے فراہم کردہ متوازی ترتیبات اور OS تھریڈ کے لیے بائنڈنگ سیٹ کرنے کے لیے 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 کے انٹرا اور انٹر دونوں کو موجودہ مثال کے vCPUs کی زیادہ سے زیادہ تعداد پر سیٹ کرنے کے بعد، CPU کے استعمال کی بالائی حد تقریباً ٹریننگ مثال کے فزیکل کور کی تعداد کے برابر ہے۔

اگر آپ نے مقرر کیا ہے os.environ["KMP_AFFINITY"]= "verbose,disabled"، OS تھریڈ ہارڈ ویئر ہائپر تھریڈ کا پابند نہیں ہے، اور CPU کا استعمال فزیکل کور کی تعداد سے زیادہ ہو سکتا ہے۔

TensorFlow intra parallelism، TensorFlow inter parallelism، اور MKL-DNN تھریڈز کی سیٹنگز کے بارے میں، ان تینوں پیرامیٹرز کے مختلف امتزاج کے نتیجے میں مختلف ٹریننگ کی رفتار ہوتی ہے۔ لہذا، بہترین امتزاج تلاش کرنے کے لیے آپ کو ہر کیس کی جانچ کرنے کی ضرورت ہے۔ ایک عام صورت حال یہ ہے کہ تین پیرامیٹرز (intra_op_parallelism_threads اور inter_op_parallelism_threads TensorFlow کے لیے، os.environ['OMP_NUM_THREADS'] MKL-DNN کے لیے) vCPUs کی نصف تعداد (فزیکل کور) یا vCPUs کی کل تعداد۔

ٹاور کا طریقہ

GPUs پر ماڈل کی نقل تیار کرنے کے لیے، ہر GPU کو فارورڈ پاس کی اپنی مثال ملتی ہے۔ فارورڈ پاس کی مثال کو کہا جاتا ہے۔ ٹاور. ٹاور کا طریقہ تقریباً ہمیشہ GPU آلات کے لیے استعمال ہوتا ہے۔ تربیت کی رفتار کا دوسرے طریقوں سے موازنہ کرنے کے لیے، یہاں ہم اپنے CPU ڈیوائس کے لیے ٹاور کا طریقہ بھی استعمال کرتے ہیں۔

اگر آپ CPU ڈیوائس کو دستی طور پر سیٹ نہیں کرتے ہیں، تو TensorFlow گریڈیئنٹس کو اوسط کرنے کے لیے ٹاور کا طریقہ استعمال نہیں کرتا ہے، لہذا آپ کو ایسے معاملات میں بیچ کے سائز کو پیمانہ کرنے کی ضرورت نہیں ہے۔

  1. CPU ڈیوائس کو دستی طور پر سیٹ کریں:
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 مثال کے CPU کے استعمال کو درج ذیل کنفیگریشن کے ساتھ دکھاتی ہے۔

کوئی ٹاور + LibSVM ڈیٹا + پائپ موڈ + MKL-DNN غیر فعال بائنڈنگ + TensorFlow intra/inter op parallelism کی ترتیب مثال کے vCPUs کی زیادہ سے زیادہ تعداد پر

No Tower

درج ذیل اعداد و شمار ml.c5.18xlarge مثال کے CPU کے استعمال کو درج ذیل کنفیگریشن کے ساتھ دکھاتا ہے:

سیٹ CPU ڈیوائس کے ساتھ ٹاور + LibSVM ڈیٹا + پائپ موڈ + MKL-DNN غیر فعال بائنڈنگ + TensorFlow intra/inter op parallelism کی ترتیب مثال کے vCPUs کی زیادہ سے زیادہ تعداد پر

ٹاور کا طریقہ استعمال کرتے وقت CPU کا استعمال زیادہ ہوتا ہے، اور یہ فزیکل کور کی تعداد سے زیادہ ہوتا ہے۔

ٹینسر فلو آئینہ دار حکمت عملی

TensorFlow MirroredStrategy کا مطلب ہے ایک مشین پر متعدد نقلوں میں ہم وقت ساز تربیت۔ یہ حکمت عملی عام طور پر ایک سے زیادہ GPUs والی ایک مشین پر تربیت کے لیے استعمال ہوتی ہے۔ کسی اور طریقے سے تربیت کی رفتار کا موازنہ کرنے کے لیے، ہم اپنے CPU ڈیوائس کے لیے MirroredStrategy استعمال کرتے ہیں۔

TensorFlow MirroredStrategy استعمال کرتے وقت، اگر آپ CPU ڈیوائس سیٹ نہیں کرتے ہیں، TensorFlow صرف ایک CPU کو سنگل ورکر کے طور پر استعمال کرتا ہے، جو کہ وسائل کا ضیاع ہے۔ ہم CPU ڈیوائس کو دستی طور پر ترتیب دینے کی تجویز کرتے ہیں، کیونکہ یہ کم آپریشن کرے گا۔ /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 استعمال کرتے وقت آپ کو بیچ کا سائز پیمانہ کرنے کی ضرورت ہے۔ مثال کے طور پر، بیچ کے سائز کو GPU آلات کی تعداد کے متعدد تک پیمانہ کریں۔

ذیلی حکمت عملی کے لیے جب آپ CPU ڈیوائس سیٹ کرتے ہیں، اگر آپ سیٹ نہیں کرتے ہیں۔ cross_device_ops پیرامیٹر میں tf.distribute.MirroredStrategy()، TensorFlow استعمال کرتا ہے ReductionToOneDevice ذیلی حکمت عملی بطور ڈیفالٹ۔ تاہم، اگر آپ سیٹ کرتے ہیں HierarchicalCopyAllReduce ذیلی حکمت عملی کے طور پر، TensorFlow صرف کم کرنے کا کام کرتا ہے۔ /CPU:0. جب آپ TensorFlow ڈیٹاسیٹ 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())

ماڈل کنورجنسی کو تیز کرنے کے لیے، Horovod آفیشل دستاویزات کے مطابق ورکرز کی تعداد سے سیکھنے کی شرح کو پیمانہ کریں۔ تاہم، حقیقی دنیا کے منصوبوں میں، آپ کو سیکھنے کی شرح کو کچھ حد تک پیمانہ کرنا چاہیے، لیکن کارکنوں کی تعداد سے نہیں، جس کے نتیجے میں ماڈل کی کارکردگی خراب ہوتی ہے۔ مثال کے طور پر، اگر سیکھنے کی اصل شرح 0.001 ہے، تو ہم سیکھنے کی شرح کو 0.0015 تک پیمانہ کرتے ہیں، چاہے کارکنوں کی تعداد چار یا زیادہ ہو۔

عام طور پر، صرف پرائمری (Horovod rank 0) چیک پوائنٹ اور ماڈل کے ساتھ ساتھ تشخیصی آپریشن کو بچاتا ہے۔ Horovod استعمال کرتے وقت آپ کو بیچ کے سائز کو پیمانہ کرنے کی ضرورت نہیں ہے۔ سیج میکر پیش کرتا ہے۔ پائپ موڈ سے ڈیٹا سٹریم کرنے کے لیے ایمیزون سادہ اسٹوریج سروس (ایمیزون 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() آپ کے اسکرپٹ میں سیج میکر میں ڈیٹاسیٹ شارڈ کی خصوصیت بھی پیش کرتا ہے۔ ان پٹ چینل ترتیب کے ذریعے 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 + ڈیفالٹ انٹرا op اور انٹر آپ سیٹنگ) استعمال کرتے وقت نتیجہ دکھاتا ہے، جس کا آپ ٹاور کے طریقہ سے موازنہ کر سکتے ہیں۔

horovod

ایک ہی مثال پر متعدد GPUs کے ساتھ تقسیم شدہ تربیت

ایک ہی موقع پر متعدد GPUs کے ساتھ تقسیم شدہ تربیت شروع کرنا معمول کی بات ہے کیونکہ ڈیٹا سائنسدانوں کو صرف ایک مثال کا انتظام کرنے اور GPUs کے درمیان تیز رفتار انٹر لنک سے فائدہ اٹھانے کی ضرورت ہوتی ہے۔ SageMaker تربیتی ملازمتیں متعدد مثالوں کی اقسام کو سپورٹ کرتی ہیں جن میں ایک ہی مثال پر متعدد GPUs ہوتے ہیں، جیسے ml.p3.8xlarge، ml.p3.16xlarge، ml.p3dn.24xlarge، اور ml.p4d.24xlarge۔ طریقہ ایک ہی مثال میں متعدد CPUs جیسا ہے، لیکن اسکرپٹ میں چند تبدیلیوں کے ساتھ۔

ٹاور کا طریقہ

یہاں ٹاور کا طریقہ تقریباً ویسا ہی ہے جیسا کہ ملٹی سی پی یو ٹریننگ میں ہے۔ آپ کو استعمال میں GPUs کی تعداد کے مطابق بیچ کا سائز پیمانہ کرنے کی ضرورت ہے۔

ٹینسر فلو آئینہ دار حکمت عملی

کی ڈیفالٹ ذیلی حکمت عملی MirroredStrategy is NcclAllReduce. آپ کو استعمال میں GPUs کی تعداد کے مطابق بیچ کا سائز پیمانہ کرنے کی ضرورت ہے۔ درج ذیل کوڈ دیکھیں:

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

متعدد مواقع پر تربیت کو تیز کریں۔

تربیت کی رفتار کو بہتر بنانے کے لیے اسکیل آؤٹ ہمیشہ ایک آپشن ہوتا ہے۔ زیادہ سے زیادہ ڈیٹا سائنسدان اسے تقسیم شدہ تربیت کے حوالے سے ڈیفالٹ آپشن کے طور پر منتخب کرتے ہیں۔ اس حصے میں، ہم متعدد میزبانوں کے ساتھ تقسیم شدہ تربیت کے لیے حکمت عملی پر تبادلہ خیال کرتے ہیں۔

متعدد مثالوں کے ساتھ متعدد CPUs

تقسیم شدہ تربیت کو فعال کرتے وقت متعدد مثالوں کے ساتھ متعدد CPUs استعمال کرنے کے چار اہم طریقے ہیں:

    • سی پی یو ڈیوائسز پر آپریٹرز کی ہم آہنگی کو دستی طور پر ترتیب دیئے بغیر پیرامیٹر سرور
    • سی پی یو ڈیوائسز پر آپریٹرز کی متوازی ترتیب کے ساتھ پیرامیٹر سرور
    • ٹاور کے ساتھ پیرامیٹر سرور (سی پی یو ڈیوائسز کو دستی طور پر ترتیب دینا، اور سیٹ کرنا allow_soft_placement=True in tf.ConfigProto)
    • ہورووڈ

میں پیرامیٹر سرور استعمال کرتے وقت tf.estimator API، چوکی کا راستہ ایک قابل اشتراک راستہ ہونا چاہیے جیسے Amazon S3 یا مقامی راستہ ایمیزون لچکدار فائل سروس (ایمیزون ای ایف ایس) کنٹینر پر نقشہ سازی کرنا۔ میں پیرامیٹر سرور کے لیے tf.kerasچیک پوائنٹ کا راستہ مقامی راستے پر سیٹ کیا جا سکتا ہے۔ Horovod کے لیے، چیک پوائنٹ کا راستہ تربیتی مثال کے مقامی راستے پر سیٹ کیا جا سکتا ہے۔

پیرامیٹر سرور استعمال کرتے وقت اور tf.estimator ایمیزون S3 کے چیک پوائنٹ پاتھ کے ساتھ API، اگر ماڈل کافی بڑا ہے، تو آپ کو 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 تربیتی ملازمتیں ایسی مثالوں کی حمایت کرتی ہیں جن میں صرف ایک GPU ہوتا ہے، جیسے ml.p3.xlarge، ml.g4dn، اور ml.g5 سیریز۔ اس منظر نامے میں استعمال ہونے والے دو اہم طریقے ہیں: پیرامیٹر سرورز اور Horovod۔

سیج میکر کا بلٹ ان پیرامیٹر سرور تقسیم شدہ تربیتی طریقہ پیرامیٹر سرور عمل شروع کرنا ہے اور ہر تربیتی مثال کے لیے ایک ورکر عمل شروع کرنا ہے (ہر پیرامیٹر سرور صرف ماڈل پیرامیٹرز کے حصے کے لیے ذمہ دار ہے)، لہذا ڈیفالٹ ملٹی مشین سنگل ہے۔ GPU تربیت۔ سیج میکر بلٹ ان پیرامیٹر سرور تقسیم شدہ تربیت ایک غیر مطابقت پذیر گریڈینٹ اپ ڈیٹ کا طریقہ ہے۔ ٹریننگ کنورجنسس پر غیر مطابقت پذیر اپ ڈیٹس کے اثرات کو کم کرنے کے لیے، سیکھنے کی شرح کو کم کرنے کی سفارش کی جاتی ہے۔ اگر آپ مثال کے طور پر تمام GPUs استعمال کرنا چاہتے ہیں، تو آپ کو پیرامیٹر سرورز اور ٹاور کا طریقہ استعمال کرنے کی ضرورت ہے۔

Horovod کے لیے، بس سیٹ کریں۔ processes_per_host=1 SageMaker Python Estimator API کے ڈسٹری بیوشن پیرامیٹر میں۔

متعدد مثالوں کے ساتھ متعدد GPUs

پیرامیٹر سرورز اور ٹاور کے طریقہ کار کے لیے، کوڈ کی تبدیلیاں بنیادی طور پر ایک ہی مثال کے لیے متعدد GPUs کے لیے ٹاور کے طریقہ کار کی طرح ہیں، اور GPU آلات کو دستی طور پر سیٹ کرنے کی ضرورت نہیں ہے۔

Horovod کے لیے، ہر تربیتی مثال کے GPUs کی تعداد پر تقسیم کے پیرامیٹر میں processes_per_host سیٹ کریں۔ اگر آپ پائپ موڈ استعمال کرتے ہیں، تو فی مثال کارکنوں کی تعداد کو چینلز کی تعداد سے ملنے کی ضرورت ہے۔

ڈیٹا پائپ لائنز

ہم نے جس بنیادی ڈھانچے پر بات کی ہے اس کے علاوہ، ایک اور اہم چیز پر غور کرنا ہے: ڈیٹا پائپ لائن۔ ڈیٹا پائپ لائن سے مراد یہ ہے کہ آپ ڈیٹا کو کیسے لوڈ کرتے ہیں اور ڈیٹا کو نیورل نیٹ ورکس میں فیڈ کرنے سے پہلے کیسے تبدیل کرتے ہیں۔ CPU ڈیٹا تیار کرنے کے لیے استعمال ہوتا ہے، جبکہ GPU CPU سے ڈیٹا کا حساب لگانے کے لیے استعمال ہوتا ہے۔ چونکہ GPU ایک مہنگا وسیلہ ہے، زیادہ GPU بیکار وقت غیر موثر ہے۔ آپ کی تربیتی ملازمت میں ایک اچھی ڈیٹا پائپ لائن GPU اور CPU کے استعمال کو بہتر بنا سکتی ہے۔

جب آپ اپنی TensorFlow ڈیٹا ان پٹ پائپ لائن کو بہتر بنانے کی کوشش کر رہے ہیں، تو اس میں استعمال ہونے والے API آرڈر پر غور کریں TensorFlow ڈیٹاسیٹس، تربیتی ڈیٹا کا سائز (بہت سی چھوٹی فائلیں یا کئی بڑی فائلیں)، بیچ کا سائز، وغیرہ۔

آئیے تربیت کے دوران GPU اور CPU کے درمیان تعامل کو دیکھتے ہیں۔ درج ذیل اعداد و شمار پائپ لائن کے ساتھ اور اس کے بغیر تعاملات کا موازنہ کرتے ہیں۔

پائپ لائن

ایک بہتر پائپ لائن GPU کے بیکار وقت کو کم کر سکتی ہے۔ مندرجہ ذیل تجاویز پر غور کریں:

  • خصوصیات اور لیبل نکالنے میں سادہ فنکشن منطق کا استعمال کریں۔
  • نمونے کو میموری پر پیش کریں۔
  • غیر ضروری ڈسک I/O اور نیٹ ورکنگ I/O کو کم کریں۔
  • پروسیس شدہ خصوصیات اور لیبلز کو میموری میں کیش کریں۔
  • CPU اور GPU کے درمیان نقل کے اوقات کی تعداد کو کم کریں۔
  • مختلف کارکنوں کو تربیتی ڈیٹاسیٹ کے مختلف حصوں سے نمٹنے کے لیے کہیں۔
  • TensorFlow ڈیٹاسیٹ API کو کال کرنے کے اوقات کو کم کریں۔

TensorFlow ڈیٹاسیٹ فارمیٹس سے متعلق ایک ٹرانسفارم API فراہم کرتا ہے، اور TensorFlow میں ٹرانسفارمیشن API کی ترتیب تربیت کی رفتار کو بہت زیادہ متاثر کرتی ہے۔ TensorFlow ڈیٹاسیٹ API کو کال کرنے کے بہترین آرڈر کو جانچنے کی ضرورت ہے۔ چند بنیادی اصول درج ذیل ہیں:

  • ویکٹرائزڈ نقشہ استعمال کریں۔ اس کا مطلب ہے کہ پہلے TensorFlow ڈیٹاسیٹ بیچ API کو کال کریں، پھر ڈیٹاسیٹ میپ API کو کال کریں۔ نقشہ فنکشن میں فراہم کردہ کسٹم پارسنگ فنکشن، جیسے decode_tfrecord نمونہ کوڈ میں، ڈیٹا کے ایک چھوٹے بیچ کو پارس کرتا ہے۔ اس کے برعکس، پہلے نقشہ اور پھر بیچ ایک اسکیلر نقشہ ہے، اور کسٹم پارسر فنکشن صرف ایک نمونے پر کارروائی کرتا ہے۔
  • خصوصیات اور لیبلز کو کیش کرنے کے لیے TensorFlow ڈیٹاسیٹ کیش API کا استعمال کریں۔ TensorFlow ڈیٹاسیٹ کیش API کو TensorFlow ڈیٹاسیٹ ریپیٹ API سے پہلے رکھیں، بصورت دیگر RAM کا استعمال خطی طور پر epoch کے لحاظ سے بڑھتا ہے۔ اگر ڈیٹا سیٹ RAM جتنا بڑا ہے تو TensorFlow ڈیٹاسیٹ کیش API استعمال نہ کریں۔ اگر آپ کو TensorFlow ڈیٹاسیٹ کیش API اور شفل API استعمال کرنے کی ضرورت ہے، تو درج ذیل ترتیب کو استعمال کرنے پر غور کریں: TensorFlow ڈیٹاسیٹ آبجیکٹ بنائیں -> cache API -> shuffle API -> بیچ API -> map API -> repeat API -> prefetch API۔
  • استعمال کریں tfrecord ڈیٹا سیٹ فارمیٹ LibSVM فارمیٹ سے زیادہ۔
  • فائل موڈ یا پائپ موڈ آپ کے ڈیٹاسیٹ فارمیٹ اور فائلوں کی مقدار پر منحصر ہے۔ دی tfrecorddataset API سیٹ کر سکتے ہیں۔ num_parallel_reads متوازی اور سیٹ میں متعدد فائلوں کو پڑھنے کے لئے buffer_size ڈیٹا کی ریڈنگ کو بہتر بنانے کے لیے، جبکہ pipemodedataset API میں ایسی ترتیبات نہیں ہیں۔ پائپ موڈ ان حالات کے لیے زیادہ موزوں ہے جہاں ایک فائل بڑی ہو اور فائلوں کی کل تعداد کم ہو۔ ہم تجویز کرتے ہیں کہ پری پروسیسنگ کام کرنے کے لیے 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 مثال) ٹینسر کور کو سپورٹ کرتے ہیں۔ اس قسم کی مثالیں استعمال کرتے وقت آپ TensorFlow میں مخلوط صحت سے متعلق تربیت کو فعال کر سکتے ہیں۔ ورژن 1.14 سے شروع کرتے ہوئے، TensorFlow نے خودکار مخلوط صحت سے متعلق تربیت کی حمایت کی ہے۔ آپ اپنے اصل آپٹیمائزر کو لپیٹنے کے لیے درج ذیل بیان کا استعمال کر سکتے ہیں:

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

اگر ماڈل چھوٹا ہے اور GPU کا استعمال کم ہے، تو خودکار مخلوط صحت سے متعلق تربیت کا کوئی فائدہ نہیں ہے۔ اگر ماڈل بڑا ہے تو خودکار مخلوط صحت سے متعلق تربیت تربیت کی رفتار کو تیز کر سکتی ہے۔

نتیجہ

جب آپ SageMaker میں اپنی ڈیپ لرننگ ماڈل ٹریننگ شروع کرتے ہیں، تو تیز تر تربیت کی رفتار حاصل کرنے کے لیے درج ذیل تجاویز پر غور کریں:

  • پہلے ملٹی سی پی یو، سنگل انسٹینس طریقہ یا سنگل جی پی یو، سنگل انسٹینس طریقہ آزمائیں۔ اگر CPU/GPU کا استعمال بہت زیادہ ہے (مثال کے طور پر 90% سے زیادہ)، تو اگلے مرحلے پر جائیں۔
  • سنگل ہوسٹ میں زیادہ CPUs یا سنگل ہوسٹ میں زیادہ GPUs آزمائیں۔ اگر استعمال CPUs یا GPUs کے زیادہ سے زیادہ استعمال کے قریب ہے، تو اگلے مرحلے پر جائیں۔
  • متعدد میزبانوں کے ساتھ متعدد CPUs یا متعدد GPUs کو آزمائیں۔
  • پیرامیٹر سرورز یا Horovod استعمال کرتے وقت آپ کو کوڈز میں ترمیم کرنے کی ضرورت ہے۔ کوڈ میں ترمیم TensorFlow سیشن پر مبنی API کے لیے ایک جیسی نہیں ہے، tf.estimator API، اور tf.keras API ایک پیرامیٹر سرور یا Horovod مختلف تربیتی معاملات اور کاموں میں مختلف تربیتی رفتار دکھا سکتے ہیں، لہذا اگر آپ کے پاس بہترین کا تعین کرنے کے لیے وقت اور بجٹ ہے تو دونوں طریقوں کو آزمائیں۔

درج ذیل مشورے کو ذہن میں رکھیں:

  • اسکیلنگ سے پہلے استعمال کی جانچ کریں، اپنی ڈیٹا پائپ لائن کو بہتر بنائیں، اور ٹائم لائن میں CPU اور GPU کو اوورلیپ کریں۔
  • پہلے پیمانہ کریں، پھر پیمانہ نکالیں۔
  • اگر آپ تمام طریقوں کے بعد بھی اپنا GPU استعمال نہیں کر سکتے تو CPU کو آزمائیں۔ بہت سے معاملات ہیں (خاص طور پر کلک تھرو ریٹ رینکنگ ماڈل کے لیے) جہاں CPU مثال کی تربیت کا کل تربیتی وقت GPU مثال کی تربیت سے کم اور زیادہ لاگت والا ہوتا ہے۔

ہمارے پاس کوڈ کا نمونہ بھی ہے۔ GitHub repoجہاں ہم سیج میکر پر ڈیپ ایف ایم تقسیم شدہ تربیت کے دو نمونے دکھاتے ہیں۔ ایک CPU مثالوں پر TensorFlow پیرامیٹر سرور ہے، دوسرا GPU مثالوں پر Horovod ہے۔


مصنفین کے بارے میں

Amazon SageMaker PlatoBlockchain ڈیٹا انٹیلی جنس پر TensorFlow 1.x ایکسلریشن ٹریننگ کے بہترین طریقے۔ عمودی تلاش۔ عی یوہوئی لیانگ ایک سینئر مشین لرننگ سلوشنز آرکیٹیکٹ ہے۔ اس نے مشین لرننگ کے فروغ اور اطلاق پر توجہ مرکوز کی ہے، اور بہت سے صارفین کے مشین لرننگ پروجیکٹس میں گہرائی سے شامل ہے۔ اس کے پاس گہری سیکھنے کی تقسیم شدہ تربیت، سفارشی نظام، اور کمپیوٹیشنل اشتہارات کا بھرپور تجربہ ہے۔

Amazon SageMaker PlatoBlockchain ڈیٹا انٹیلی جنس پر TensorFlow 1.x ایکسلریشن ٹریننگ کے بہترین طریقے۔ عمودی تلاش۔ عیشیشوائی وانگ ایک سینئر مشین لرننگ سلوشنز آرکیٹیکٹ ہے۔ وہ بڑے پیمانے پر مشین لرننگ کو اپنانے میں مدد کرنے کے لیے AWS کے صارفین کے ساتھ کام کرتا ہے۔ اسے فلمیں دیکھنے اور دنیا بھر میں گھومنے کا شوق ہے۔

ٹائم اسٹیمپ:

سے زیادہ AWS مشین لرننگ