Amazon SageMaker PlatoBlockchain ডেটা ইন্টেলিজেন্সে TensorFlow 1.x ত্বরণ প্রশিক্ষণের জন্য সর্বোত্তম অনুশীলন। উল্লম্ব অনুসন্ধান. আ.

Amazon SageMaker-এ TensorFlow 1.x ত্বরণ প্রশিক্ষণের জন্য সেরা অনুশীলন

আজ, অনেক গ্রাহক ইকমার্সে বিজ্ঞাপন এবং ব্যক্তিগতকরণের সুপারিশগুলিতে তাদের ক্লিকথ্রু হারের জন্য গভীর শিক্ষার মডেলগুলিকে প্রশিক্ষণ দিতে TensorFlow ব্যবহার করছেন৷ তাদের ক্লায়েন্টদের আচরণ পরিবর্তন হওয়ার সাথে সাথে তারা প্রতিদিন প্রচুর পরিমাণে নতুন ডেটা জমা করতে পারে। মডেল পুনরাবৃত্তি একজন ডেটা বিজ্ঞানীর দৈনন্দিন কাজগুলির মধ্যে একটি, কিন্তু তারা বড় ডেটাসেটগুলিতে প্রশিক্ষণ নিতে খুব বেশি সময় নেওয়ার সমস্যার সম্মুখীন হয়।

আমাজন সেজমেকার এটি একটি সম্পূর্ণরূপে পরিচালিত মেশিন লার্নিং (ML) প্ল্যাটফর্ম যা ডেটা বিজ্ঞানীদেরকে অবকাঠামোর পরিবর্তে মডেলগুলিতে ফোকাস করতে সাহায্য করতে পারে, যা আপনার নিজস্ব-অ্যালগরিদম এবং ফ্রেমওয়ার্ক যেমন TensorFlow এবং PyTorch আনতে স্থানীয় সমর্থন সহ। সেজমেকার নমনীয় বিতরণকৃত প্রশিক্ষণের বিকল্পগুলি অফার করে যা আপনার নির্দিষ্ট কর্মপ্রবাহের সাথে সামঞ্জস্য করে। কারণ অনেক ডেটা বিজ্ঞানীর ত্বরণ প্রশিক্ষণ প্রক্রিয়ার অভিজ্ঞতার অভাব থাকতে পারে, এই পোস্টে আমরা আপনাকে দ্রুত গভীর শিক্ষার মডেল প্রশিক্ষণের জন্য গুরুত্বপূর্ণ বিষয়গুলি এবং SageMaker-এ TensorFlow 1.x-এর জন্য ত্বরণ প্রশিক্ষণের সেরা অনুশীলনগুলি দেখাই৷ আমরা একটি নমুনা কোড আছে ডিপএফএম SageMaker উপর প্রশিক্ষণ বিতরণ গিটহুব রেপো.

আপনি যখন SageMaker-এ আপনার TensorFlow স্ক্রিপ্ট চালান তখন CPU/GPU ব্যবহারকে সর্বাধিক করার জন্য অনেকগুলি বিষয় বিবেচনা করা উচিত, যেমন পরিকাঠামো, এক্সিলারেটরের ধরন, বিতরণ করা প্রশিক্ষণের পদ্ধতি, ডেটা লোডিং পদ্ধতি, মিশ্র নির্ভুল প্রশিক্ষণ এবং আরও অনেক কিছু।

আমরা নিম্নলিখিত ক্ষেত্রগুলিতে সেরা অনুশীলনগুলি নিয়ে আলোচনা করি:

  • একটি একক উদাহরণে প্রশিক্ষণ ত্বরান্বিত করুন
  • একাধিক দৃষ্টান্তে প্রশিক্ষণ ত্বরান্বিত করুন
  • ডেটা পাইপলাইন
  • স্বয়ংক্রিয় মিশ্র নির্ভুলতা প্রশিক্ষণ

একটি একক উদাহরণে প্রশিক্ষণ ত্বরান্বিত করুন

আপনার টেনসরফ্লো স্ক্রিপ্ট একটি একক উদাহরণে চালানোর সময়, আপনি একটি কম্পিউটার অপ্টিমাইজ করা সিরিজ বেছে নিতে পারেন যেমন অ্যামাজন ইলাস্টিক কম্পিউট ক্লাউড (Amazon EC2) C5 সিরিজ, বা একাধিক GPU সহ একটি ত্বরিত কম্পিউটিং সিরিজ যেমন p3.8xlarge, p3.16xlarge, p3dn.24xlarge, এবং p4d.24xlarge।

এই বিভাগে, আমরা একক দৃষ্টান্তে একাধিক CPU-এর কৌশল নিয়ে আলোচনা করি, এবং একক দৃষ্টান্তে একাধিক GPU-এর সাথে প্রশিক্ষণ বিতরণ করি।

একটি একক উদাহরণে একাধিক CPU

এই বিভাগে, আমরা CPU ডিভাইসে ম্যানুয়ালি অপারেটরদের সমান্তরালতা, টাওয়ার পদ্ধতি, TensorFlow MirroredStrategy, এবং Horovod নিয়ে আলোচনা করি।

CPU ডিভাইসে ম্যানুয়ালি অপারেটরদের সমান্তরালতা সেট করা

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-এর ইন্ট্রা এবং ইন্টার উভয়কেই বর্তমান উদাহরণের সর্বোচ্চ সংখ্যক vCPU-তে সেট করার পরে, CPU ব্যবহারের উপরের সীমা প্রশিক্ষণের উদাহরণের শারীরিক কোরের সংখ্যার প্রায় সমান।

যদি আপনি সেট করেন os.environ["KMP_AFFINITY"]= "verbose,disabled", OS থ্রেড হার্ডওয়্যার হাইপার থ্রেডের সাথে আবদ্ধ নয়, এবং CPU ব্যবহার শারীরিক কোরের সংখ্যা অতিক্রম করতে পারে।

টেনসরফ্লো আন্তঃ সমান্তরালতা, টেনসরফ্লো আন্তঃ সমান্তরালতা এবং এমকেএল-ডিএনএন থ্রেডের সংখ্যার সেটিংস সম্পর্কে, এই তিনটি প্যারামিটারের বিভিন্ন সমন্বয়ের ফলে বিভিন্ন প্রশিক্ষণের গতি হয়। অতএব, সেরা সংমিশ্রণ খুঁজে পেতে আপনাকে প্রতিটি ক্ষেত্রে পরীক্ষা করতে হবে। একটি সাধারণ পরিস্থিতি হল তিনটি প্যারামিটার সেট করা (intra_op_parallelism_threads এবং inter_op_parallelism_threads TensorFlow এর জন্য, os.environ['OMP_NUM_THREADS'] MKL-DNN-এর জন্য) অর্ধেক vCPUs (শারীরিক কোর) বা মোট vCPU-এর সংখ্যা।

টাওয়ার পদ্ধতি

GPU-এর উপর একটি মডেল প্রতিলিপি করতে, প্রতিটি GPU ফরওয়ার্ড পাসের নিজস্ব উদাহরণ পায়। ফরোয়ার্ড পাসের উদাহরণকে বলা হয় a মিনার. টাওয়ার পদ্ধতি প্রায় সবসময় জিপিইউ ডিভাইসের জন্য ব্যবহৃত হয়। অন্যান্য পদ্ধতির সাথে প্রশিক্ষণের গতির তুলনা করতে, এখানে আমরা আমাদের 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 ব্যবহারের পার্থক্য দেখি। নিম্নলিখিত চিত্রটি নিম্নলিখিত কনফিগারেশনের সাথে ml.c5.18xlarge ইনস্ট্যান্সের CPU ব্যবহার দেখায়:

কোন টাওয়ার + LibSVM ডেটা + পাইপ মোড + MKL-DNN অক্ষম বাইন্ডিং + টেনসরফ্লো ইন্ট্রা/ইন্টার op প্যারালেলিজম সেটিং ইনস্ট্যান্সের ভিসিপিইউগুলির সর্বাধিক সংখ্যায়

টাওয়ার নেই

নিম্নলিখিত চিত্রটি নিম্নলিখিত কনফিগারেশনের সাথে ml.c5.18xlarge ইনস্ট্যান্সের CPU ব্যবহার দেখায়:

সেট সিপিইউ ডিভাইস সহ টাওয়ার + LibSVM ডেটা + পাইপ মোড + MKL-DNN অক্ষম বাইন্ডিং + টেনসরফ্লো ইন্ট্রা/ইন্টার অপ প্যারালেলিজম সেটিং ইনস্ট্যান্সের ভিসিপিইউগুলির সর্বাধিক সংখ্যায়

টাওয়ার পদ্ধতি ব্যবহার করার সময় CPU ব্যবহার বেশি হয় এবং এটি শারীরিক কোরের সংখ্যা ছাড়িয়ে যায়।

টেনসরফ্লো মিররড স্ট্র্যাটেজি

TensorFlow MirroredStrategy মানে একটি মেশিনে একাধিক প্রতিলিপি জুড়ে সিঙ্ক্রোনাস প্রশিক্ষণ। এই কৌশলটি সাধারণত একাধিক GPU সহ একটি মেশিনে প্রশিক্ষণের জন্য ব্যবহৃত হয়। অন্য পদ্ধতির সাথে প্রশিক্ষণের গতির তুলনা করতে, আমরা আমাদের CPU ডিভাইসের জন্য MirroredStrategy ব্যবহার করি।

TensorFlow MirroredStrategy ব্যবহার করার সময়, আপনি যদি CPU ডিভাইস সেট না করেন, TensorFlow শুধুমাত্র একক কর্মী হিসাবে একটি 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 সাব-স্ট্র্যাটেজি হিসাবে, টেনসরফ্লো শুধু কমানোর কাজ করে /CPU:0. আপনি যখন TensorFlow ডেটাসেট API ব্যবহার করেন এবং একসাথে কৌশল বিতরণ করেন, তখন ফাংশনের বৈশিষ্ট্য এবং লেবেলের পরিবর্তে ডেটাসেট অবজেক্টটি ফেরত দেওয়া উচিত input_fn.

সাধারণত, TensorFlow MirroredStrategy CPU প্রশিক্ষণের টাওয়ার পদ্ধতির চেয়ে ধীর, তাই আমরা একটি মাল্টি-সিপিইউ একক হোস্টে MirroredStrategy ব্যবহার করার পরামর্শ দিই না।

হোরোভড

হোরোভড TensorFlow, Keras, PyTorch, এবং Apache MXNet-এর জন্য একটি বিতরণ করা গভীর শিক্ষার প্রশিক্ষণ কাঠামো। Horovod এর লক্ষ্য হল বিতরণ করা গভীর শিক্ষাকে দ্রুত এবং সহজে ব্যবহার করা।

এর একটি প্যারামিটার আছে distribution SageMaker Python SDK এস্টিমেটর 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' 
} 
}

ml.p3.8xlarge এর মতো একটি GPU উদাহরণ নির্বাচন করার সময়, আপনাকে প্রতিটি কর্মীর জন্য প্রতিটি GPU পিন করতে হবে:

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

মডেল কনভারজেন্সের গতি বাড়ানোর জন্য, Horovod অফিসিয়াল ডকুমেন্টেশন অনুযায়ী কর্মীদের সংখ্যা দ্বারা শেখার হার মাপুন। যাইহোক, বাস্তব-বিশ্বের প্রকল্পগুলিতে, আপনার শেখার হারকে কিছুটা স্কেল করা উচিত, তবে কর্মীদের সংখ্যার দ্বারা নয়, যার ফলে মডেলের কার্যকারিতা খারাপ হয়। উদাহরণস্বরূপ, যদি মূল শেখার হার 0.001 হয়, তাহলে আমরা শেখার হার 0.0015 এ স্কেল করি, এমনকি যদি কর্মীদের সংখ্যা চার বা তার বেশি হয়।

সাধারণত, শুধুমাত্র প্রাথমিক (Horovod র্যাঙ্ক 0) চেকপয়েন্ট এবং মডেলের পাশাপাশি মূল্যায়ন অপারেশন সংরক্ষণ করে। Horovod ব্যবহার করার সময় আপনাকে ব্যাচের আকার মাপতে হবে না। সেজমেকার অফার করে পাইপ মোড থেকে ডেটা স্ট্রিম করতে আমাজন সিম্পল স্টোরেজ সার্ভিস (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 + ডিফল্ট ইন্ট্রা অপ এবং ইন্টার অপ সেটিং) ব্যবহার করার সময় ফলাফল দেখায়, যা আপনি টাওয়ার পদ্ধতির সাথে তুলনা করতে পারেন।

horovod

একটি একক উদাহরণে একাধিক GPU সহ প্রশিক্ষণ বিতরণ করা হয়েছে

একক দৃষ্টান্তে একাধিক GPU-এর সাথে বিতরণ করা প্রশিক্ষণ শুরু করা স্বাভাবিক কারণ ডেটা বিজ্ঞানীদের শুধুমাত্র একটি উদাহরণ পরিচালনা করতে হবে এবং GPU-গুলির মধ্যে উচ্চ-গতির আন্তঃসংযোগের সুবিধা নিতে হবে। সেজমেকার প্রশিক্ষণের কাজগুলি একাধিক ইন্সট্যান্স প্রকারকে সমর্থন করে যেগুলির একটি একক উদাহরণে একাধিক GPU রয়েছে, যেমন ml.p3.8xlarge, ml.p3.16xlarge, ml.p3dn.24xlarge এবং ml.p4d.24xlarge৷ পদ্ধতিটি একক দৃষ্টান্তে একাধিক CPU-এর মতোই, তবে স্ক্রিপ্টে কয়েকটি পরিবর্তন সহ।

টাওয়ার পদ্ধতি

এখানে টাওয়ার পদ্ধতি প্রায় মাল্টি-সিপিইউ প্রশিক্ষণের মতোই। ব্যবহার করা GPU গুলির সংখ্যা অনুসারে আপনাকে ব্যাচের আকার স্কেল করতে হবে।

টেনসরফ্লো মিররড স্ট্র্যাটেজি

এর ডিফল্ট সাব-স্ট্র্যাটেজি 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 ডিভাইসে ম্যানুয়ালি অপারেটরদের সমান্তরালতা সেটিং সহ প্যারামিটার সার্ভার
    • টাওয়ার সহ প্যারামিটার সার্ভার (ম্যানুয়ালি সিপিইউ ডিভাইস সেট করা, এবং সেট করা allow_soft_placement=True in tf.ConfigProto)
    • হোরোভড

একটি প্যারামিটার সার্ভার ব্যবহার করার সময় tf.estimator এপিআই, চেকপয়েন্টের পথটি অবশ্যই আমাজন S3 বা স্থানীয় পথের মতো একটি ভাগযোগ্য পথ হতে হবে আমাজন ইলাস্টিক ফাইল সার্ভিস (Amazon EFS) পাত্রে ম্যাপিং। একটি প্যারামিটার সার্ভারের জন্য tf.keras, চেকপয়েন্ট পাথ স্থানীয় পাথ সেট করা যেতে পারে. Horovod-এর জন্য, চেকপয়েন্টের পথটি প্রশিক্ষণের উদাহরণের একটি স্থানীয় পথে সেট করা যেতে পারে।

একটি প্যারামিটার সার্ভার ব্যবহার করার সময় এবং tf.estimator Amazon 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

সেজমেকার প্রশিক্ষণের কাজগুলি এমন উদাহরণগুলিকে সমর্থন করে যেখানে শুধুমাত্র একটি জিপিইউ আছে, যেমন ml.p3.xlarge, ml.g4dn এবং ml.g5 সিরিজ। এই পরিস্থিতিতে দুটি প্রধান পদ্ধতি ব্যবহার করা হয়: প্যারামিটার সার্ভার এবং Horovod।

সেজমেকার-এর অন্তর্নির্মিত প্যারামিটার সার্ভার বিতরণ প্রশিক্ষণ পদ্ধতিটি হল একটি প্যারামিটার সার্ভার প্রক্রিয়া এবং প্রতিটি প্রশিক্ষণ উদাহরণের জন্য একটি কর্মী প্রক্রিয়া শুরু করা (প্রতিটি পরামিতি সার্ভার শুধুমাত্র মডেল প্যারামিটারের অংশের জন্য দায়ী), তাই ডিফল্টটি মাল্টি-মেশিন একক- জিপিইউ প্রশিক্ষণ। SageMaker বিল্ট-ইন প্যারামিটার সার্ভার বিতরণ প্রশিক্ষণ একটি অ্যাসিঙ্ক্রোনাস গ্রেডিয়েন্ট আপডেট পদ্ধতি। ট্রেনিং কনভারজেন্সে অ্যাসিঙ্ক্রোনাস আপডেটের প্রভাব কমাতে, শেখার হার কমানোর পরামর্শ দেওয়া হয়। আপনি যদি উদাহরণে সমস্ত GPU ব্যবহার করতে চান তবে আপনাকে প্যারামিটার সার্ভার এবং টাওয়ার পদ্ধতির সংমিশ্রণ ব্যবহার করতে হবে।

Horovod জন্য, শুধু সেট processes_per_host=1 সেজমেকার পাইথন এস্টিমেটর এপিআই-এর ডিস্ট্রিবিউশন প্যারামিটারে।

একাধিক দৃষ্টান্ত সহ একাধিক GPU

প্যারামিটার সার্ভার এবং টাওয়ার পদ্ধতির জন্য, কোড পরিবর্তনগুলি মূলত একাধিক GPU সহ একটি একক উদাহরণের জন্য টাওয়ার পদ্ধতির মতোই, এবং GPU ডিভাইসগুলিকে ম্যানুয়ালি সেট করার প্রয়োজন নেই৷

Horovod-এর জন্য, প্রতিটি ট্রেনিং ইন্সট্যান্সের GPU-এর সংখ্যার জন্য ডিস্ট্রিবিউশন প্যারামিটারে processes_per_host সেট করুন। আপনি যদি পাইপ মোড ব্যবহার করেন, প্রতি দৃষ্টান্তে কর্মীদের সংখ্যা চ্যানেলের সংখ্যার সাথে মেলে।

ডেটা পাইপলাইন

আমরা যে অবকাঠামো নিয়ে আলোচনা করেছি তার পাশাপাশি আরেকটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে: ডেটা পাইপলাইন। একটি ডেটা পাইপলাইন বোঝায় যে আপনি কীভাবে ডেটা লোড করেন এবং ডেটাকে নিউরাল নেটওয়ার্কে ফিড করার আগে রূপান্তর করেন। CPU ডেটা প্রস্তুত করতে ব্যবহৃত হয়, যেখানে GPU ব্যবহার করা হয় CPU থেকে ডেটা গণনা করতে। যেহেতু জিপিইউ একটি ব্যয়বহুল সম্পদ, আরও জিপিইউ অলস সময় অদক্ষ; আপনার প্রশিক্ষণ কাজের একটি ভাল ডেটা পাইপলাইন GPU এবং CPU ব্যবহার উন্নত করতে পারে।

আপনি যখন আপনার TensorFlow ডেটা ইনপুট পাইপলাইন অপ্টিমাইজ করার চেষ্টা করছেন, তখন ব্যবহার করা API অর্ডার বিবেচনা করুন টেনসরফ্লো ডেটাসেট, প্রশিক্ষণ ডেটার আকার (অনেক ছোট ফাইল বা বেশ কয়েকটি বড় ফাইল), ব্যাচের আকার এবং আরও অনেক কিছু।

আসুন প্রশিক্ষণের সময় জিপিইউ এবং সিপিইউ এর মধ্যে মিথস্ক্রিয়া দেখি। নিম্নলিখিত পরিসংখ্যান একটি পাইপলাইন সঙ্গে এবং ছাড়া মিথস্ক্রিয়া তুলনা.

পাইপলাইন

একটি ভাল পাইপলাইন GPU নিষ্ক্রিয় সময় কমাতে পারে। নিম্নলিখিত টিপস বিবেচনা করুন:

  • বৈশিষ্ট্য এবং লেবেল নিষ্কাশনে সহজ ফাংশন যুক্তি ব্যবহার করুন
  • মেমরিতে নমুনাগুলি প্রিফেচ করুন
  • অপ্রয়োজনীয় ডিস্ক I/O এবং নেটওয়ার্কিং I/O হ্রাস করুন
  • মেমরিতে প্রক্রিয়াকৃত বৈশিষ্ট্য এবং লেবেলগুলি ক্যাশে করুন
  • CPU এবং GPU-এর মধ্যে প্রতিলিপির সময়ের সংখ্যা কমিয়ে দিন
  • প্রশিক্ষণ ডেটাসেটের বিভিন্ন অংশের সাথে বিভিন্ন কর্মীদের ডিল করুন
  • TensorFlow ডেটাসেট API কল করার সময় কমিয়ে দিন

টেনসরফ্লো ডেটাসেট ফর্ম্যাটগুলির সাথে সম্পর্কিত একটি ট্রান্সফর্ম API প্রদান করে এবং টেনসরফ্লোতে ট্রান্সফর্মেশন API-এর ক্রম প্রশিক্ষণের গতিকে অনেক বেশি প্রভাবিত করে। TensorFlow ডেটাসেট API কল করার সর্বোত্তম অর্ডার পরীক্ষা করা দরকার। নিম্নলিখিত কিছু মৌলিক নীতি আছে:

  • একটি ভেক্টরাইজড মানচিত্র ব্যবহার করুন। এর মানে প্রথমে TensorFlow ডেটাসেট ব্যাচ API কল করুন, তারপর ডেটাসেট মানচিত্র API। মানচিত্র ফাংশনে প্রদত্ত কাস্টম পার্সিং ফাংশন, যেমন decode_tfrecord নমুনা কোডে, ডেটার একটি ছোট ব্যাচ পার্স করে। বিপরীতে, প্রথমে মানচিত্র এবং তারপর ব্যাচ একটি স্কেলার মানচিত্র, এবং কাস্টম পার্সার ফাংশন শুধুমাত্র একটি নমুনা প্রক্রিয়া করে।
  • বৈশিষ্ট্য এবং লেবেল ক্যাশে করতে TensorFlow ডেটাসেট ক্যাশে API ব্যবহার করুন। টেনসরফ্লো ডেটাসেট রিপিট এপিআই-এর আগে টেনসরফ্লো ডেটাসেট ক্যাশে এপিআই রাখুন, অন্যথায় র‌্যাম ইউটিলাইজেশন রৈখিকভাবে যুগে যুগে বৃদ্ধি পাবে। ডেটাসেটটি RAM এর মতো বড় হলে, TensorFlow ডেটাসেট ক্যাশে API ব্যবহার করবেন না। আপনি যদি TensorFlow ডেটাসেট ক্যাশে API এবং শাফেল API ব্যবহার করতে চান, তাহলে নিম্নলিখিত ক্রমটি ব্যবহার করার কথা বিবেচনা করুন: TensorFlow ডেটাসেট অবজেক্ট তৈরি করুন -> cache API -> shuffle API -> batch API -> map API -> repeat API -> prefetch API।
  • ব্যবহার tfrecord ডেটাসেট বিন্যাস LibSVM বিন্যাসের চেয়ে বেশি।
  • ফাইল মোড বা পাইপ মোড আপনার ডেটাসেট বিন্যাস এবং ফাইলের পরিমাণের উপর নির্ভর করে। দ্য tfrecorddataset API সেট করতে পারেন num_parallel_reads সমান্তরাল এবং সেট একাধিক ফাইল পড়তে buffer_size ডেটা পড়ার অপ্টিমাইজ করতে, যেখানে pipemodedataset API-এর এই ধরনের সেটিংস নেই। পাইপ মোড এমন পরিস্থিতিতে আরও উপযুক্ত যেখানে একটি ফাইল বড় এবং ফাইলের মোট সংখ্যা ছোট। আমরা প্রি-প্রসেসিং কাজ করার জন্য একটি সেজমেকার প্রসেসিং কাজ ব্যবহার করার পরামর্শ দিই, যেমন লেবেল অনুসারে একটি বড় ফাইলে একাধিক ফাইল যোগ করা, ডেটাসেটটিকে আরও ভারসাম্যপূর্ণ করতে একটি নমুনা পদ্ধতি ব্যবহার করা এবং সুষম ডেটাসেট পরিবর্তন করা।

নিম্নলিখিত কোড নমুনা দেখুন:

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 GPU (P3 ইন্সট্যান্স) এবং A100 (P4dn ইনস্ট্যান্স) টেনসর কোর সমর্থন করে। এই ধরনের উদাহরণ ব্যবহার করার সময় আপনি TensorFlow-এ মিশ্র নির্ভুল প্রশিক্ষণ সক্ষম করতে পারেন। সংস্করণ 1.14 থেকে শুরু করে, TensorFlow স্বয়ংক্রিয় মিশ্র নির্ভুল প্রশিক্ষণ সমর্থন করেছে। আপনি আপনার আসল অপ্টিমাইজার মোড়ানোর জন্য নিম্নলিখিত বিবৃতি ব্যবহার করতে পারেন:

tf.train.experimental.enable_mixed_precision_graph_rewrite(optimizer)

যদি মডেলটি ছোট হয় এবং GPU এর ব্যবহার কম হয়, তাহলে স্বয়ংক্রিয় মিশ্র নির্ভুল প্রশিক্ষণের কোন সুবিধা নেই। মডেল বড় হলে, স্বয়ংক্রিয় মিশ্র নির্ভুলতা প্রশিক্ষণ প্রশিক্ষণের গতি ত্বরান্বিত করতে পারে।

উপসংহার

আপনি যখন সেজমেকারে আপনার গভীর শিক্ষার মডেল প্রশিক্ষণ শুরু করেন, তখন দ্রুত প্রশিক্ষণের গতি অর্জনের জন্য নিম্নলিখিত টিপসগুলি বিবেচনা করুন:

  • মাল্টি-সিপিইউ, সিঙ্গেল-ইন্সট্যান্স মেথড বা সিঙ্গেল-জিপিইউ, সিঙ্গেল-ইনস্ট্যান্স পদ্ধতি ব্যবহার করে দেখুন। যদি CPU/GPU ব্যবহার খুব বেশি হয় (উদাহরণস্বরূপ 90% এর বেশি), পরবর্তী ধাপে যান।
  • একক হোস্টে আরও সিপিইউ বা একক হোস্টে আরও জিপিইউ ব্যবহার করে দেখুন। সিপিইউ বা জিপিইউ-এর সর্বোচ্চ ব্যবহারের কাছাকাছি হলে, পরবর্তী ধাপে যান।
  • একাধিক হোস্ট সহ একাধিক CPU বা একাধিক GPU ব্যবহার করে দেখুন।
  • প্যারামিটার সার্ভার বা Horovod ব্যবহার করার সময় আপনাকে কোড পরিবর্তন করতে হবে। কোড পরিবর্তন TensorFlow সেশন-ভিত্তিক API-এর জন্য একই নয়, tf.estimator API, এবং tf.keras API একটি প্যারামিটার সার্ভার বা Horovod বিভিন্ন প্রশিক্ষণের ক্ষেত্রে এবং কাজগুলিতে বিভিন্ন প্রশিক্ষণের গতি দেখাতে পারে, তাই সেরাটি নির্ধারণ করার জন্য আপনার কাছে সময় এবং বাজেট থাকলে উভয় পদ্ধতিই চেষ্টা করুন।

নিম্নলিখিত পরামর্শ মনে রাখবেন:

  • স্কেল করার আগে ব্যবহার পরীক্ষা করুন, আপনার ডেটা পাইপলাইন অপ্টিমাইজ করুন এবং টাইমলাইনে CPU এবং GPU ওভারল্যাপ করুন।
  • প্রথমে স্কেল আপ, তারপর স্কেল আউট।
  • আপনি যদি সমস্ত পদ্ধতির পরেও আপনার GPU ব্যবহার বাড়াতে না পারেন, CPU ব্যবহার করে দেখুন। এমন অনেক ক্ষেত্রে রয়েছে (বিশেষ করে ক্লিকথ্রু রেট র‍্যাঙ্কিং মডেলের জন্য) যেখানে CPU ইন্সট্যান্স ট্রেনিংয়ের মোট প্রশিক্ষণের সময় GPU ইনস্ট্যান্স ট্রেনিংয়ের চেয়ে কম এবং বেশি সাশ্রয়ী।

আমরা একটি কোড নমুনা আছে গিটহুব রেপো, যেখানে আমরা সেজমেকারে ডিপএফএম বিতরণ করা প্রশিক্ষণের দুটি নমুনা দেখাই। একটি হল CPU দৃষ্টান্তে একটি TensorFlow প্যারামিটার সার্ভার, অন্যটি GPU দৃষ্টান্তে Horovod।


লেখক সম্পর্কে

Amazon SageMaker PlatoBlockchain ডেটা ইন্টেলিজেন্সে TensorFlow 1.x ত্বরণ প্রশিক্ষণের জন্য সর্বোত্তম অনুশীলন। উল্লম্ব অনুসন্ধান. আ. ইউহুই লিয়াং একজন সিনিয়র মেশিন লার্নিং সলিউশন আর্কিটেক্ট। তিনি মেশিন লার্নিং এর প্রচার এবং প্রয়োগের উপর দৃষ্টি নিবদ্ধ করেছেন এবং অনেক গ্রাহকদের মেশিন লার্নিং প্রকল্পের সাথে গভীরভাবে জড়িত। ডিপ লার্নিং ডিস্ট্রিবিউটেড ট্রেনিং, রিকমেন্ডেশন সিস্টেম এবং কম্পিউটেশনাল অ্যাডভারটাইজিং এর একটি সমৃদ্ধ অভিজ্ঞতা রয়েছে তার।

Amazon SageMaker PlatoBlockchain ডেটা ইন্টেলিজেন্সে TensorFlow 1.x ত্বরণ প্রশিক্ষণের জন্য সর্বোত্তম অনুশীলন। উল্লম্ব অনুসন্ধান. আ.শিশুয়াই ওয়াং একজন সিনিয়র মেশিন লার্নিং সলিউশন আর্কিটেক্ট। তিনি এডব্লিউএস গ্রাহকদের সাথে কাজ করেন যাতে তারা বড় আকারে মেশিন লার্নিং গ্রহণ করে। তিনি সিনেমা দেখতে এবং বিশ্বজুড়ে ভ্রমণ উপভোগ করেন।

সময় স্ট্যাম্প:

থেকে আরো এডাব্লুএস মেশিন লার্নিং

এমএল মডেলের কর্মক্ষমতা বাড়ান এবং প্রাক-প্রশিক্ষিত মডেলের সাথে Amazon SageMaker বিল্ট-ইন অ্যালগরিদম ব্যবহার করে প্রশিক্ষণের সময় কমিয়ে দিন

উত্স নোড: 1719203
সময় স্ট্যাম্প: অক্টোবর 6, 2022