বেঞ্চমার্কিং

বেঞ্চমার্কিংয়ের মূল বিষয়গুলি

টোকাম্যাক্স সমন্বিত পারফরম্যান্স বেঞ্চমার্কিং পরিকাঠামো প্রদান করে। আপনি প্রদত্ত ইনপুট সেটের জন্য আপনার অপ f(x) নিম্নোক্তভাবে বেঞ্চমার্ক করতে পারেন:

# Conforming and initializing data to prepare for benchmarking
f_std, args = tokamax.standardize_function(f, kwargs={'x': x})

# Execute and measure timing
bench: tokamax.BenchmarkData = tokamax.benchmark(f_std, args)

standardize_function জটিল ফাংশনগুলোকে সরল করে, যেমন নন-অ্যারে আর্গুমেন্টের ক্ষেত্রে। এটি প্রথমে ' args নামক একটিমাত্র আর্গুমেন্ট দিয়ে একটি স্ট্যান্ডার্ড ফর্ম তৈরি করে, যা হলো অ্যাবস্ট্রাক্ট বা কনক্রিট অ্যারে jax.Array | jax.ShapeDtypeStruct এর একটি তালিকা। এরপর এটি এলোমেলোভাবে সমস্ত অ্যাবস্ট্রাক্ট টেনসর ইনিশিয়ালাইজ করে এবং শুধুমাত্র কনক্রিট অ্যারে আর্গুমেন্টসহ একটি স্ট্যান্ডার্ডাইজড f_std(args) রিটার্ন করে। স্ট্রিং-এর মতো স্ট্যাটিক আর্গুমেন্ট নিয়ে চিন্তা না করেই এটিকে সহজে jitt করা যায়।

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

উন্নত বেঞ্চমার্কিং বিষয়সমূহ

পুনরাবৃত্তি চালান

tokamax.benchmark আপনাকে ইটারেশনের সংখ্যা বেছে নিতে দেয়; বেশি ইটারেশন সাধারণত পরিমাপের নয়েজ কমিয়ে দেয়, যেমন, tokamax.benchmark(f_std, args, iterations=num_iters). তবে, অল্প সময়ের মধ্যে ইটারেশনের সংখ্যা খুব বেশি হলে থার্মাল থ্রটলিং চালু হতে পারে, বিশেষ করে কম্পিউট-হেভি কার্নেলগুলোর ক্ষেত্রে, যা এক্সিকিউশন টাইমকে প্রভাবিত করে। এই বিষয়গুলোর মধ্যে ভারসাম্য রক্ষা করা প্রায়শই একটি পরীক্ষামূলক বিষয়। একটি প্রস্তাবিত পদ্ধতি হলো, প্রতিটি পরীক্ষায় অল্প সংখ্যক ইটারেশন চালানো এবং একাধিকবার নির্দিষ্ট সময় পর পর পরীক্ষা করা, যার ফলে ওয়াল ক্লক টাইম বেড়ে যায়।

বেঞ্চমার্কিং পদ্ধতি

JAX পাইথন ওভারহেড প্রায়শই প্রকৃত অ্যাক্সিলারেটর কার্নেল এক্সিকিউশন টাইমের চেয়ে অনেক বেশি হয়। এর মানে হলো, jax.block_until_ready(f(x)) এর সময় পরিমাপ করার প্রচলিত পদ্ধতিটি কার্যকর হবে না। benchmark আপনাকে বেঞ্চমার্কিংয়ের জন্য ব্যবহৃত অন্তর্নিহিত টাইমিং পদ্ধতি বেছে নিতে দেয়, যেমন benchmark(f_std, args, iterations=num_iters, method=method)

TPU কার্নেলের জন্য, আমরা method=xprof_hermetic জোরালোভাবে সুপারিশ করি, যা XProf প্রোফাইলারকে চালু করে এবং হার্ডওয়্যারে এক্সিকিউশন টাইম পরিমাপ করে। হার্ডওয়্যার এবং কম্পাইলার সহ কাস্টম ফুল-স্ট্যাক সাপোর্টের কারণে এই পদ্ধতিতে প্রায় কোনো ইন্সট্রুমেন্টেশন ওভারহেড থাকে না।

GPU কার্নেলের জন্য, আপনি xprof_hermetic ও ব্যবহার করতে পারেন; XProf আবার NVIDIA-র CUPTI API ব্যবহার করে। আপনি method=cupti ব্যবহার করে সরাসরি একটি CUPTI টাইমারও চালু করতে পারেন। উভয় পদ্ধতিতেই কিছু পরিবর্তনশীল ওভারহেড থাকে, যা সাধারণত ৫% পর্যন্ত হতে পারে।

ডেটা বিতরণ

পূর্ববর্তী গবেষণায় দেখা গেছে যে, হার্ডওয়্যার-স্তরের জটিল শক্তি ও তাপীয় মিথস্ক্রিয়ার কারণে ডেটা বিন্যাসের ওপর ভিত্তি করে পারফরম্যান্সে উল্লেখযোগ্য তারতম্য হতে পারে। এর সমাধান করতে, standardize_function প্রকৃত ট্রেনিং জবের প্রতিনিধিত্বকারী পদ্ধতিতে ইনপুট অ্যারে ইনিশিয়ালাইজ করে; যেমন, যেকোনো বাস্তব-মানযুক্ত jax.ShapeDtypeStruct র‍্যান্ডমভাবে ইনিশিয়ালাইজ করা হবে। আপনি আপনার প্রয়োজন অনুযায়ী এটি পরিবর্তন করে নিতে পারেন।

বেঞ্চমার্কিং মোড

standardize_function আপনাকে শুধু ফরোয়ার্ড বেছে নিতে mode=forward , ফরোয়ার্ড ও রেসিডুয়াল গণনা করতে forward_res , শুধু VJP-ফাংশন বেছে নিতে vjp , এবং বেঞ্চমার্কিংয়ের জন্য একটি সম্পূর্ণ ফরোয়ার্ড ও VJP পাস গণনা করতে forward_and_vjp নির্বাচন করার সুযোগ দেয়। উল্লেখ্য যে, শুধু VJP-ফাংশন দিয়ে বেঞ্চমার্কিং করলে OOM (আউট অফ মেমরি) হতে পারে, কারণ ফরোয়ার্ড পাসটি ফেরত আসা স্ট্যান্ডার্ডাইজড ফাংশনের বাইরে গণনা করা হয় এবং এর সমস্ত মধ্যবর্তী ধাপ HLO-এর মধ্যে অন্তর্ভুক্ত থাকে, যা HBM মেমরিতে স্থায়ীভাবে থেকে যায়।