অ্যাক্সিলারেটর ব্যাকএন্ড

একটি Tensor গণনা বর্ণনা করা বেশ সহজ, কিন্তু কখন এবং কীভাবে সেই গণনাটি সঞ্চালিত হবে তা নির্ভর করবে Tensor জন্য কোন ব্যাকএন্ড ব্যবহার করা হবে এবং হোস্ট সিপিইউতে কখন ফলাফলের প্রয়োজন হবে।

পর্দার আড়ালে, Tensor অপারেশনগুলি GPUs বা TPUs- এর মতো এক্সিলারেটরে পাঠানো হয়, বা যখন কোনও অ্যাক্সিলারেটর উপলব্ধ না থাকে তখন CPU-তে চালানো হয়। এটি আপনার জন্য স্বয়ংক্রিয়ভাবে ঘটে এবং একটি উচ্চ-স্তরের ইন্টারফেস ব্যবহার করে জটিল সমান্তরাল গণনা করা সহজ করে তোলে। যাইহোক, এই প্রেরণ কিভাবে ঘটে তা বোঝার জন্য এটি কার্যকর হতে পারে এবং সর্বোত্তম কর্মক্ষমতার জন্য এটি কাস্টমাইজ করতে সক্ষম হতে পারে।

টেনসরফ্লো-এর জন্য সুইফটের ত্বরিত গণনা করার জন্য দুটি ব্যাকএন্ড রয়েছে: টেনসরফ্লো এজার মোড এবং X10। ডিফল্ট ব্যাকএন্ড হল TensorFlow এজার মোড, কিন্তু এটি ওভাররাইড করা যেতে পারে। একটি ইন্টারেক্টিভ টিউটোরিয়াল উপলব্ধ যা আপনাকে এই বিভিন্ন ব্যাকএন্ড ব্যবহারের মাধ্যমে নিয়ে যায়।

TensorFlow আগ্রহী মোড

টেনসরফ্লো এজার মোড ব্যাকএন্ড টেনসরফ্লো সি এপিআই ব্যবহার করে প্রতিটি Tensor অপারেশনকে একটি জিপিইউ বা সিপিইউতে পাঠাতে যেমন এটি সম্মুখীন হয়। সেই অপারেশনের ফলাফল তারপর পুনরুদ্ধার করা হয় এবং পরবর্তী অপারেশনে চলে যায়।

এই অপারেশন-বাই-অপারেশন প্রেরণটি বোঝার জন্য সহজ এবং আপনার কোডের মধ্যে কোনও স্পষ্ট কনফিগারেশনের প্রয়োজন নেই। যাইহোক, অনেক ক্ষেত্রেই এটি সর্বোত্তম কার্যক্ষমতার ফল দেয় না কারণ ওভারহেডের কারণে অনেক ছোট অপারেশন পাঠানো হয়, অপারেশন ফিউশন এবং অপ্টিমাইজেশানের অভাবের সাথে মিলিত যা অপারেশনের গ্রাফ উপস্থিত থাকলে ঘটতে পারে। অবশেষে, টেনসরফ্লো এজার মোড টিপিইউগুলির সাথে বেমানান, এবং শুধুমাত্র সিপিইউ এবং জিপিইউগুলির সাথে ব্যবহার করা যেতে পারে৷

X10 (XLA-ভিত্তিক ট্রেসিং)

X10 হল সুইফট ফর টেনসরফ্লো ব্যাকএন্ডের নাম যা অলস টেনসর ট্রেসিং এবং এক্সএলএ অপ্টিমাইজিং কম্পাইলার ব্যবহার করে অনেক ক্ষেত্রে অপারেশন-বাই-অপারেশন ডিসপ্যাচের উপর কার্যকারিতা উল্লেখযোগ্যভাবে উন্নত করে। উপরন্তু, এটি TPU- এর জন্য সামঞ্জস্য যোগ করে, মেশিন লার্নিং মডেলের মধ্যে পাওয়া গণনার জন্য বিশেষভাবে অপ্টিমাইজ করা অ্যাক্সিলারেটর।

Tensor গণনার জন্য X10 ব্যবহার ডিফল্ট নয়, তাই আপনাকে এই ব্যাকএন্ডে নির্বাচন করতে হবে। এটি একটি XLA ডিভাইসে একটি Tensor স্থাপন করা হয়েছে তা উল্লেখ করে করা হয়:

let tensor1 = Tensor<Float>([0.0, 1.0, 2.0], on: Device.defaultXLA)
let tensor2 = Tensor<Float>([1.5, 2.5, 3.5], on: Device.defaultXLA)

এই বিন্দুর পরে, একটি গণনা বর্ণনা করা ঠিক TensorFlow আগ্রহী মোডের মতোই:

let tensor3 = tensor1 + tensor2

একটি Tensor তৈরি করার সময় আরও বিশদ প্রদান করা যেতে পারে, যেমন কি ধরনের এক্সিলারেটর ব্যবহার করতে হবে এবং কোনটি, যদি একাধিক উপলব্ধ থাকে। উদাহরণস্বরূপ, দ্বিতীয় টিপিইউ ডিভাইসে একটি Tensor তৈরি করা যেতে পারে (ধরে নিচ্ছে যে এটি হোস্টের কাছে দৃশ্যমান হচ্ছে প্রোগ্রামটি চলছে) নিম্নলিখিতগুলি ব্যবহার করে:

let tpuTensor = Tensor<Float>([0.0, 1.0, 2.0], on: Device(kind: .TPU, ordinal: 1, backend: .XLA))

ডিভাইসগুলির মধ্যে Tensor কোনও অন্তর্নিহিত নড়াচড়া করা হয় না, তাই যদি দুটি Tensor বিভিন্ন ডিভাইসে একসাথে একটি অপারেশনে ব্যবহার করা হয় তবে একটি রানটাইম ত্রুটি ঘটবে৷ একটি নতুন ডিভাইসে একটি Tensor বিষয়বস্তু ম্যানুয়ালি অনুলিপি করতে, আপনি Tensor(copying:to:) ইনিশিয়ালাইজার ব্যবহার করতে পারেন। কিছু বৃহত্তর-স্কেল স্ট্রাকচার যেগুলির মধ্যে Tensor রয়েছে, যেমন মডেল এবং অপ্টিমাইজার, তাদের সমস্ত অভ্যন্তরীণ Tensor এক ধাপে একটি নতুন ডিভাইসে সরানোর জন্য সহায়ক ফাংশন রয়েছে।

TensorFlow আগ্রহী মোডের বিপরীতে, X10 ব্যাকএন্ড ব্যবহার করে অপারেশনগুলি পৃথকভাবে পাঠানো হয় না কারণ তারা সম্মুখীন হয়। পরিবর্তে, একটি এক্সিলারেটরে প্রেরণ শুধুমাত্র হোস্টের কাছে গণনা করা মানগুলি পড়ার মাধ্যমে বা একটি সুস্পষ্ট বাধা স্থাপন করে ট্রিগার করা হয়। এটি যেভাবে কাজ করে তা হল যে রানটাইম হোস্টের কাছে পড়া মান থেকে শুরু হয় (অথবা একটি ম্যানুয়াল বাধার আগে শেষ গণনা) এবং সেই মানটির ফলে গণনার গ্রাফ ট্রেস করে।

এই ট্রেস করা গ্রাফটি তারপর এক্সএলএ এইচএলও ইন্টারমিডিয়েট রিপ্রেজেন্টেশানে রূপান্তরিত হয় এবং এক্সিলারেটরে এক্সিকিউশনের জন্য অপ্টিমাইজ এবং কম্পাইল করার জন্য এক্সএলএ কম্পাইলারের কাছে পাঠানো হয়। সেখান থেকে, পুরো হিসাবটি এক্সিলারেটরে পাঠানো হয় এবং শেষ ফলাফল পাওয়া যায়।

গণনা একটি সময়সাপেক্ষ প্রক্রিয়া, তাই X10 ব্যাপকভাবে সমান্তরাল গণনার সাথে ব্যবহার করা হয় যা একটি গ্রাফের মাধ্যমে প্রকাশ করা হয় এবং যেগুলি অনেকবার সম্পাদিত হয়। হ্যাশ মান এবং ক্যাশিং ব্যবহার করা হয় যাতে প্রতিটি অনন্য কনফিগারেশনের জন্য অভিন্ন গ্রাফগুলি শুধুমাত্র একবার সংকলিত হয়।

মেশিন লার্নিং মডেলের জন্য, প্রশিক্ষণ প্রক্রিয়ায় প্রায়ই একটি লুপ জড়িত থাকে যেখানে মডেলটি বারবার একই সিরিজের গণনার শিকার হয়। আপনি চাইবেন যে এই পাসগুলির প্রতিটিকে একই ট্রেসের পুনরাবৃত্তি হিসাবে দেখা হোক, এর ভিতরে বারবার ইউনিট সহ একটি দীর্ঘ গ্রাফের পরিবর্তে। এটি আপনার কোডের অবস্থানগুলিতে LazyTensorBarrier() ফাংশনে একটি কলের ম্যানুয়াল সন্নিবেশ দ্বারা সক্ষম করা হয়েছে যেখানে আপনি একটি ট্রেস শেষ করতে চান৷

X10 এ মিশ্র-নির্ভুল সমর্থন

X10 এর মাধ্যমে মিশ্র নির্ভুলতার সাথে প্রশিক্ষণ সমর্থিত এবং এটি নিয়ন্ত্রণ করার জন্য নিম্ন-স্তরের এবং উচ্চ-স্তরের API উভয়ই সরবরাহ করা হয়। নিম্ন-স্তরের API দুটি গণনা করা বৈশিষ্ট্য অফার করে: toReducedPrecision এবং toFullPrecision যা পূর্ণ এবং হ্রাসকৃত নির্ভুলতার মধ্যে রূপান্তর করে, যথার্থতা অনুসন্ধান করার জন্য isReducedPrecision সহ। Tensor ছাড়াও, মডেল এবং অপ্টিমাইজারগুলিকে এই API ব্যবহার করে সম্পূর্ণ এবং হ্রাসকৃত নির্ভুলতার মধ্যে রূপান্তর করা যেতে পারে।

মনে রাখবেন যে হ্রাসকৃত নির্ভুলতায় রূপান্তর একটি Tensor যৌক্তিক প্রকারকে পরিবর্তন করে না। যদি t একটি Tensor<Float> হয়, t.toReducedPrecision এছাড়াও একটি Tensor<Float> একটি হ্রাস-নির্ভুল অন্তর্নিহিত উপস্থাপনা সহ।

ডিভাইসগুলির মতো, বিভিন্ন নির্ভুলতার টেনসরগুলির মধ্যে অপারেশন অনুমোদিত নয়৷ এটি 32-বিট ফ্লোটে নীরব এবং অবাঞ্ছিত প্রচার এড়ায়, যা ব্যবহারকারীর দ্বারা সনাক্ত করা কঠিন হবে।