بهترین روش ها برای آموزش شتاب دهی TensorFlow 1.x در Amazon SageMaker PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.

بهترین روش ها برای آموزش شتاب دهی TensorFlow 1.x در Amazon SageMaker

امروزه بسیاری از مشتریان از TensorFlow برای آموزش مدل های یادگیری عمیق برای نرخ کلیک در تبلیغات و توصیه های شخصی سازی در تجارت الکترونیک استفاده می کنند. همانطور که رفتار مشتریانشان تغییر می کند، آنها می توانند هر روز مقادیر زیادی داده جدید جمع آوری کنند. تکرار مدل یکی از کارهای روزانه دانشمندان داده است، اما آنها با این مشکل مواجه هستند که آموزش روی مجموعه داده های بزرگ بسیار طولانی است.

آمازون SageMaker یک پلتفرم یادگیری ماشینی کاملاً مدیریت شده (ML) است که می‌تواند به دانشمندان داده کمک کند تا به جای زیرساخت، روی مدل‌ها تمرکز کنند، با پشتیبانی بومی از الگوریتم‌ها و چارچوب‌هایی مانند TensorFlow و PyTorch. SageMaker گزینه های آموزشی توزیع شده انعطاف پذیری را ارائه می دهد که با جریان کاری خاص شما تنظیم می شود. از آنجایی که بسیاری از دانشمندان داده ممکن است در فرآیند آموزش شتاب فاقد تجربه باشند، در این پست ما به شما عواملی را که برای آموزش مدل یادگیری عمیق سریع اهمیت دارند و بهترین شیوه های آموزش شتاب برای TensorFlow 1.x در SageMaker به شما نشان می دهیم. ما همچنین یک کد نمونه داریم DeepFM آموزش توزیع شده در SageMaker در GitHub repo.

هنگام اجرای اسکریپت TensorFlow در SageMaker باید عوامل زیادی را برای به حداکثر رساندن استفاده از CPU/GPU در نظر بگیرید، مانند زیرساخت، نوع شتاب دهنده، روش آموزشی توزیع شده، روش بارگذاری داده، آموزش با دقت ترکیبی و موارد دیگر.

ما بهترین شیوه ها را در زمینه های زیر مورد بحث قرار می دهیم:

  • آموزش را در یک نمونه تسریع کنید
  • تسریع آموزش در موارد متعدد
  • خطوط لوله داده
  • آموزش دقیق مختلط خودکار

آموزش را در یک نمونه تسریع کنید

هنگامی که اسکریپت TensorFlow خود را روی یک نمونه اجرا می کنید، می توانید یک سری بهینه سازی کامپیوتری مانند ابر محاسبه الاستیک آمازون (Amazon EC2) سری C5 یا یک سری محاسبات شتابی با چندین پردازنده گرافیکی در یک نمونه مانند p3.8xlarge، p3.16xlarge، p3dn.24xlarge، و p4d.24xlarge.

در این بخش، استراتژی‌هایی را برای چندین CPU در یک نمونه و آموزش توزیع شده با چندین GPU در یک نمونه مورد بحث قرار می‌دهیم.

چند CPU در یک نمونه

در این بخش، ما در مورد تنظیم دستی موازی اپراتورها در دستگاه های CPU، روش برج، TensorFlow MirroredStrategy و Horovod بحث می کنیم.

تنظیم دستی موازی اپراتورها در دستگاه های CPU

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 به حداکثر تعداد vCPUهای نمونه فعلی، حد بالای استفاده از CPU تقریباً با تعداد هسته های فیزیکی نمونه آموزشی یکسان است.

اگر تنظیم کنید os.environ["KMP_AFFINITY"]= "verbose,disabled"، رشته سیستم عامل به ابر رشته سخت افزاری محدود نمی شود و استفاده از CPU ممکن است از تعداد هسته های فیزیکی بیشتر باشد.

با توجه به تنظیمات توازی درونی TensorFlow، بین موازی TensorFlow و تعداد رشته های MKL-DNN، ترکیب های مختلف این سه پارامتر منجر به سرعت های تمرین متفاوت می شود. بنابراین، باید هر مورد را آزمایش کنید تا بهترین ترکیب را پیدا کنید. یک وضعیت رایج تنظیم سه پارامتر (intra_op_parallelism_threads و inter_op_parallelism_threads برای تنسورفلو، os.environ['OMP_NUM_THREADS'] برای MKL-DNN) به نصف تعداد vCPU ها (هسته فیزیکی) یا تعداد کل vCPU ها.

روش برج

برای تکثیر یک مدل بر روی GPU ها، هر GPU نمونه مخصوص به خود را از پاس رو به جلو دریافت می کند. نمونه پاس رو به جلو a نامیده می شود برج. روش برج تقریباً همیشه برای دستگاه های 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) تغییر دهید.

بیایید به تفاوت استفاده از CPU با حالت برج فعال نگاه کنیم. شکل زیر استفاده از CPU نمونه ml.c5.18xlarge را با پیکربندی زیر نشان می‌دهد:

بدون برج + داده LibSVM + حالت لوله + MKL-DNN غیرفعال کردن اتصال

بدون برج

شکل زیر استفاده از CPU نمونه ml.c5.18xlarge را با پیکربندی زیر نشان می‌دهد:

برج با دستگاه CPU تنظیم شده + داده LibSVM + حالت لوله + MKL-DNN غیرفعال کردن اتصال

استفاده از CPU هنگام استفاده از روش برج بیشتر است و از تعداد هسته های فیزیکی بیشتر است.

TensorFlow Mirrored Strategy

TensorFlow MirroredStrategy به معنای آموزش همزمان در چندین نسخه روی یک ماشین است. این استراتژی معمولاً برای آموزش روی یک دستگاه با چندین پردازنده گرافیکی استفاده می شود. برای مقایسه سرعت تمرین با روش دیگری، از MirroredStrategy برای دستگاه CPU خود استفاده می کنیم.

هنگامی که از 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. هنگامی که از API داده TensorFlow استفاده می کنید و استراتژی را با هم توزیع می کنید، شی مجموعه داده باید به جای ویژگی ها و برچسب ها در تابع برگردانده شود. input_fn.

معمولاً TensorFlow MirroredStrategy کندتر از روش برج در آموزش CPU است، بنابراین ما استفاده از MirroredStrategy را در یک هاست تک چند CPU توصیه نمی کنیم.

هرود

هرود یک چارچوب آموزشی یادگیری عمیق توزیع شده برای TensorFlow، Keras، PyTorch و Apache MXNet است. هدف هوروود ایجاد یادگیری عمیق توزیع شده سریع و آسان برای استفاده است.

یک پارامتر وجود دارد 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) به نمونه های آموزشی. وقتی حالت Pipe را فعال می‌کنید، توجه داشته باشید که کارگران مختلف در یک میزبان باید از کانال‌های متفاوتی برای جلوگیری از خطا استفاده کنند. این به این دلیل است که اولین فرآیند کارگر داده‌های 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 + تنظیمات پیش فرض intra op و inter op) که می توانید آن را با روش برج مقایسه کنید.

هوروود

آموزش توزیع شده با چندین پردازنده گرافیکی در یک نمونه واحد

شروع آموزش توزیع شده با چندین پردازنده گرافیکی در یک نمونه عادی است زیرا دانشمندان داده فقط باید یک نمونه را مدیریت کنند و از اتصال پرسرعت بین GPUها استفاده کنند. مشاغل آموزشی SageMaker از چندین نوع نمونه پشتیبانی می کنند که دارای چندین GPU در یک نمونه واحد هستند، مانند ml.p3.8xlarge، ml.p3.16xlarge، ml.p3dn.24xlarge، و ml.p4d.24xlarge. این روش مانند چندین CPU در یک نمونه است، اما با کمی تغییرات در اسکریپت.

روش برج

روش برج در اینجا تقریباً مشابه آموزش چند سی پی یو است. شما باید اندازه دسته را با توجه به تعداد GPUهای در حال استفاده مقیاس کنید.

TensorFlow Mirrored Strategy

استراتژی فرعی پیش فرض MirroredStrategy is NcclAllReduce. شما باید اندازه دسته را با توجه به تعداد GPUهای در حال استفاده مقیاس کنید. کد زیر را ببینید:

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

تسریع آموزش در موارد متعدد

کاهش مقیاس همیشه گزینه ای برای بهبود سرعت تمرین است. بیشتر و بیشتر دانشمندان داده این را به عنوان یک گزینه پیش فرض در رابطه با آموزش توزیع شده انتخاب می کنند. در این بخش، ما در مورد استراتژی های آموزش توزیع شده با میزبان های متعدد بحث می کنیم.

چندین CPU با چندین نمونه

چهار روش اصلی برای استفاده از چندین CPU با چندین نمونه در هنگام فعال کردن آموزش توزیع شده وجود دارد:

    • سرور پارامتر بدون تنظیم دستی موازی اپراتورها در دستگاه های CPU
    • سرور پارامتر با تنظیم دستی موازی اپراتورها در دستگاه های CPU
    • سرور پارامتر با برج (تنظیم دستگاه های CPU به صورت دستی و تنظیم allow_soft_placement=True in tf.ConfigProto)
    • هرود

هنگام استفاده از سرور پارامتر در tf.estimator API، مسیر ایست بازرسی باید یک مسیر قابل اشتراک گذاری مانند آمازون S3 یا مسیر محلی باشد سرویس فایل الاستیک آمازون نقشه برداری (Amazon EFS) به ظرف. برای سرور پارامتر در tf.keras، مسیر ایست بازرسی را می توان روی مسیر محلی تنظیم کرد. برای Horovod، مسیر ایست بازرسی را می توان روی یک مسیر محلی از نمونه آموزشی تنظیم کرد.

هنگام استفاده از سرور پارامتر و tf.estimator API با مسیر ایست بازرسی به آمازون S3، اگر مدل کاملاً بزرگ باشد، ممکن است با خطای اصلی در ذخیره بازرسی در S3 مواجه شوید. می توانید از کانتینر داخلی SageMaker TensorFlow 1.15 یا TensorFlow 1.15.2 استفاده کنید یا از Amazon EFS به عنوان مسیر بازرسی اشتراک استفاده کنید.

هنگام استفاده از یک سرور پارامتر برای چندین میزبان، ممکن است بار پارامتر در هر فرآیند سرور پارامتر نامتعادل باشد (مخصوصاً زمانی که متغیرهای جدول تعبیه شده نسبتاً بزرگی وجود داشته باشد)، که می تواند باعث خطا شود. می‌توانید اندازه فایل هر نقطه بازرسی شارد را در آمازون S3 بررسی کنید تا تعیین کنید که آیا پارامترهای سرور پارامتر متعادل هستند یا خیر، زیرا هر سرور پارامتر مربوط به یک قطعه از فایل پوینت بازرسی است. برای جلوگیری از چنین مشکلاتی، می‌توانید از تابع پارتیشن‌کننده استفاده کنید تا سعی کنید پارامترهای هر سرور پارامتر را به طور مساوی توزیع کنید:

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

واحد پردازش گرافیکی با چندین نمونه

مشاغل آموزشی SageMaker از نمونه هایی پشتیبانی می کنند که فقط یک GPU دارند، مانند سری ml.p3.xlarge، ml.g4dn و ml.g5. دو روش اصلی در این سناریو استفاده می شود: سرورهای پارامتر و Horovod.

روش آموزشی توزیع‌شده سرور پارامتر داخلی SageMaker این است که یک فرآیند سرور پارامتر و یک فرآیند کارگر برای هر نمونه آموزشی را شروع کند (هر سرور پارامتر فقط مسئول بخشی از پارامترهای مدل است)، بنابراین پیش‌فرض یک دستگاه چند ماشینی است. آموزش پردازنده گرافیکی آموزش توزیع شده سرور پارامتر داخلی SageMaker یک روش به روز رسانی گرادیان ناهمزمان است. برای کاهش تأثیر به‌روزرسانی‌های ناهمزمان بر همگرایی آموزش، توصیه می‌شود نرخ یادگیری را کاهش دهید. اگر می خواهید از تمام پردازنده های گرافیکی موجود در نمونه استفاده کنید، باید از ترکیبی از سرورهای پارامتر و روش برج استفاده کنید.

برای هوروود، فقط تنظیم کنید processes_per_host=1 در پارامتر توزیع SageMaker Python Estimator API.

چند پردازنده گرافیکی با چندین نمونه

برای سرورهای پارامتر و روش برج، تغییرات کد اساساً مانند روش برج برای یک نمونه با چندین GPU است و نیازی به تنظیم دستی دستگاه‌های GPU نیست.

برای Horovod، processes_per_host را در پارامتر توزیع به تعداد GPUهای هر نمونه آموزشی تنظیم کنید. اگر از حالت Pipe استفاده می کنید، تعداد کارگران در هر نمونه باید با تعداد کانال ها مطابقت داشته باشد.

خطوط لوله داده

علاوه بر زیرساختی که در مورد آن بحث کردیم، نکته مهم دیگری نیز وجود دارد که باید در نظر گرفته شود: خط لوله داده. خط لوله داده به نحوه بارگیری داده ها و تبدیل داده ها قبل از تغذیه به شبکه های عصبی اشاره دارد. CPU برای تهیه داده ها استفاده می شود، در حالی که GPU برای محاسبه داده ها از CPU استفاده می شود. از آنجایی که GPU یک منبع گران قیمت است، زمان بیکاری بیشتر GPU ناکارآمد است. یک خط لوله داده خوب در کار آموزشی شما می تواند استفاده از GPU و CPU را بهبود بخشد.

وقتی می‌خواهید خط لوله ورودی داده TensorFlow خود را بهینه کنید، ترتیب API مورد استفاده را در نظر بگیرید مجموعه داده های TensorFlow، اندازه داده های آموزشی (بسیاری از فایل های کوچک یا چندین فایل بزرگ)، اندازه دسته ای و غیره.

بیایید به تعامل بین GPU و CPU در طول آموزش نگاه کنیم. شکل‌های زیر تعاملات با و بدون خط لوله را مقایسه می‌کنند.

خط لوله

خط لوله بهتر می تواند زمان بیکاری GPU را کاهش دهد. نکات زیر را در نظر بگیرید:

  • از منطق تابع ساده در استخراج ویژگی ها و برچسب ها استفاده کنید
  • نمونه ها را از قبل در حافظه واکشی کنید
  • ورودی/خروجی غیرضروری دیسک و ورودی/خروجی شبکه را کاهش دهید
  • ویژگی ها و برچسب های پردازش شده را در حافظه پنهان کنید
  • تعداد دفعات تکرار بین CPU و GPU را کاهش دهید
  • از کارگران مختلف بخواهید که با بخش های مختلف مجموعه داده آموزشی سروکار داشته باشند
  • زمان فراخوانی API مجموعه داده TensorFlow را کاهش دهید

TensorFlow یک API تبدیل مربوط به فرمت های داده ارائه می دهد و ترتیب API تبدیل در TensorFlow بر سرعت آموزش بسیار تأثیر می گذارد. بهترین ترتیب فراخوانی API مجموعه داده TensorFlow باید آزمایش شود. در زیر برخی از اصول اساسی آمده است:

  • از نقشه برداری استفاده کنید. این بدان معناست که ابتدا API دسته ای مجموعه داده TensorFlow و سپس API نقشه داده ها را فراخوانی کنید. تابع تجزیه سفارشی ارائه شده در تابع نقشه، مانند decode_tfrecord در کد نمونه، یک دسته کوچک از داده ها را تجزیه می کند. برعکس، ابتدا نقشه و سپس دسته یک نقشه اسکالر است و تابع تجزیه کننده سفارشی فقط یک نمونه را پردازش می کند.
  • از API حافظه پنهان مجموعه داده TensorFlow برای ذخیره ویژگی ها و برچسب ها استفاده کنید. API حافظه پنهان مجموعه داده TensorFlow را قبل از تکرار API مجموعه داده TensorFlow قرار دهید، در غیر این صورت استفاده از RAM به صورت خطی دوره به دوره افزایش می یابد. اگر مجموعه داده به اندازه RAM است، از API حافظه پنهان مجموعه داده TensorFlow استفاده نکنید. اگر نیاز به استفاده از API حافظه پنهان مجموعه داده TensorFlow و API shuffle دارید، از ترتیب زیر استفاده کنید: ایجاد شی مجموعه داده TensorFlow -> Cache API -> shuffle API -> Batch API -> map API -> repeat API -> prefetch API.
  • استفاده از tfrecord قالب مجموعه داده بیشتر از فرمت LibSVM.
  • حالت فایل یا حالت لوله به فرمت مجموعه داده و مقدار فایل شما بستگی دارد. این tfrecorddataset API می تواند تنظیم شود num_parallel_reads برای خواندن چندین فایل به صورت موازی و تنظیم buffer_size برای بهینه سازی خواندن داده ها، در حالی که pipemodedataset API چنین تنظیماتی ندارد. حالت Pipe برای شرایطی که یک فایل بزرگ و تعداد کل فایل ها کم است مناسب تر است. توصیه می کنیم از یک کار پردازش 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)

برای آموزش در نمونه های CPU، تنظیم موازی سازی intra op, inter opو متغیر محیطی MKL-DNN نقطه شروع خوبی است.

آموزش دقیق مختلط خودکار

آخرین چیزی که ما در مورد آن بحث می کنیم، آموزش دقیق ترکیبی خودکار است که می تواند سرعت را افزایش دهد و به عملکرد مدل منجر شود. تا زمان نگارش این مقاله، پردازنده گرافیکی Nvidia V100 (نمونه P3) و A100 (نمونه P4dn) از هسته Tensor پشتیبانی می کنند. هنگام استفاده از این نوع نمونه‌ها، می‌توانید آموزش دقیق ترکیبی را در TensorFlow فعال کنید. با شروع از نسخه 1.14، TensorFlow از آموزش دقیق ترکیبی خودکار پشتیبانی می کند. می توانید از عبارت زیر برای بسته بندی بهینه ساز اصلی خود استفاده کنید:

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

اگر مدل کوچک باشد و استفاده از GPU کم باشد، هیچ مزیتی از آموزش با دقت ترکیبی خودکار وجود ندارد. اگر مدل بزرگ باشد، آموزش دقیق ترکیبی خودکار می تواند سرعت تمرین را تسریع کند.

نتیجه

هنگامی که آموزش مدل یادگیری عمیق خود را در SageMaker شروع می کنید، نکات زیر را برای دستیابی به سرعت آموزش سریعتر در نظر بگیرید:

  • ابتدا روش چند CPU، تک نمونه ای یا تک GPU، روش تک نمونه ای را امتحان کنید. اگر استفاده از CPU/GPU بسیار زیاد است (مثلاً بیش از 90 درصد)، به مرحله بعدی بروید.
  • CPU های بیشتری را در هاست تکی یا پردازنده های گرافیکی بیشتری را در هاست تکی امتحان کنید. اگر استفاده نزدیک به حداکثر استفاده از CPU یا GPU است، به مرحله بعدی بروید.
  • چندین CPU یا چندین GPU با چندین میزبان را امتحان کنید.
  • هنگام استفاده از سرورهای پارامتر یا Horovod باید کدها را تغییر دهید. اصلاح کد برای API مبتنی بر جلسه TensorFlow یکسان نیست، tf.estimator API و tf.keras API. یک سرور پارامتر یا Horovod ممکن است سرعت های آموزشی متفاوتی را در موارد و وظایف آموزشی مختلف نشان دهد، بنابراین اگر وقت و بودجه برای تعیین بهترین دارید، هر دو روش را امتحان کنید.

توصیه زیر را در نظر داشته باشید:

  • قبل از مقیاس‌بندی، میزان استفاده را بررسی کنید، خط لوله داده‌های خود را بهینه کنید، و CPU و GPU را در جدول زمانی همپوشانی کنید.
  • ابتدا مقیاس را افزایش دهید، سپس مقیاس را کاهش دهید.
  • اگر بعد از تمام روش ها نمی توانید استفاده از GPU خود را افزایش دهید، CPU را امتحان کنید. موارد زیادی وجود دارد (مخصوصاً برای مدل رتبه بندی نرخ کلیک) که در آن کل زمان آموزش آموزش نمونه CPU کوتاه تر و مقرون به صرفه تر از آموزش نمونه GPU است.

ما همچنین یک نمونه کد در آن داریم GitHub repo، جایی که ما دو نمونه از آموزش توزیع شده DeepFM را در SageMaker نشان می دهیم. یکی سرور پارامتر TensorFlow در نمونه های CPU است، دیگری Horovod در نمونه های GPU است.


درباره نویسنده

بهترین روش ها برای آموزش شتاب دهی TensorFlow 1.x در Amazon SageMaker PlatoBlockchain Data Intelligence. جستجوی عمودی Ai. یوهوی لیانگ Sr. یک معمار راه حل های یادگیری ماشین است. او بر ترویج و کاربرد یادگیری ماشین تمرکز کرده است و عمیقاً در بسیاری از پروژه های یادگیری ماشینی مشتریان درگیر است. او تجربه ای غنی در آموزش های توزیع شده، سیستم های توصیه و تبلیغات محاسباتی دارد.

بهترین روش ها برای آموزش شتاب دهی TensorFlow 1.x در Amazon SageMaker PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.شیشوآی وانگ Sr. یک معمار راه حل های یادگیری ماشین است. او با مشتریان AWS کار می کند تا به آنها کمک کند یادگیری ماشینی را در مقیاس بزرگ اتخاذ کنند. او از تماشای فیلم و سفر به دور دنیا لذت می برد.

تمبر زمان:

بیشتر از آموزش ماشین AWS