TensorFlow পরীক্ষার সেরা অনুশীলন

টেনসরফ্লো রিপোজিটরিতে কোড পরীক্ষার জন্য এইগুলি প্রস্তাবিত অনুশীলনগুলি৷

আপনি শুরু করার আগে

আপনি একটি TensorFlow প্রকল্পে সোর্স কোড অবদান করার আগে, অনুগ্রহ করে প্রকল্পের GitHub রেপোতে CONTRIBUTING.md ফাইলটি পর্যালোচনা করুন৷ (উদাহরণস্বরূপ, মূল TensorFlow রেপোর জন্য CONTRIBUTING.md ফাইলটি দেখুন।) সমস্ত কোড অবদানকারীদের একটি অবদানকারী লাইসেন্স চুক্তি (CLA) স্বাক্ষর করতে হবে।

সাধারণ নীতি

শুধুমাত্র আপনি আপনার BUILD নিয়মে কি ব্যবহার করেন তার উপর নির্ভর করে

টেনসরফ্লো একটি বড় লাইব্রেরি, এবং এর সাবমডিউলগুলির জন্য একটি ইউনিট পরীক্ষা লেখার সময় সম্পূর্ণ প্যাকেজের উপর নির্ভর করে একটি সাধারণ অভ্যাস। যাইহোক, এটি bazel নির্ভরতা-ভিত্তিক বিশ্লেষণকে অক্ষম করে। এর মানে হল যে ক্রমাগত ইন্টিগ্রেশন সিস্টেম বুদ্ধিমত্তার সাথে প্রি-সাবমিট/পোস্টসাবমিট রানের জন্য সম্পর্কহীন পরীক্ষাগুলি দূর করতে পারে না। আপনি যদি শুধুমাত্র আপনার BUILD ফাইলে যে সাবমডিউলগুলি পরীক্ষা করছেন তার উপর নির্ভর করেন, তাহলে আপনি সমস্ত TensorFlow ডেভেলপারদের জন্য সময় এবং অনেক মূল্যবান গণনা শক্তি বাঁচাতে পারবেন।

যাইহোক, সম্পূর্ণ TF লক্ষ্যগুলি বাদ দিতে আপনার বিল্ড নির্ভরতা পরিবর্তন করলে আপনি আপনার পাইথন কোডে যা আমদানি করতে পারেন তার জন্য কিছু সীমাবদ্ধতা নিয়ে আসে। আপনি আর আপনার ইউনিট পরীক্ষায় import tensorflow as tf ব্যবহার করতে পারবেন না। কিন্তু এটি একটি সার্থক ট্রেডঅফ কারণ এটি সমস্ত বিকাশকারীকে হাজার হাজার অপ্রয়োজনীয় পরীক্ষা চালানো থেকে বাঁচায়।

সমস্ত কোড ইউনিট পরীক্ষা থাকা উচিত

যেকোন কোডের জন্য আপনি লিখবেন, আপনাকে তার ইউনিট পরীক্ষাও লিখতে হবে। আপনি যদি একটি নতুন ফাইল foo.py লেখেন, তাহলে আপনাকে foo_test.py এ এর ইউনিট পরীক্ষা করা উচিত এবং একই পরিবর্তনের মধ্যে জমা দেওয়া উচিত। আপনার সমস্ত কোডের জন্য 90% ক্রমবর্ধমান পরীক্ষার কভারেজ লক্ষ্য করুন।

TF এ নেটিভ বেজেল পরীক্ষার নিয়ম ব্যবহার করা এড়িয়ে চলুন

পরীক্ষা চালানোর সময় টিএফ-এর অনেক সূক্ষ্মতা রয়েছে। আমরা আমাদের বেজেল ম্যাক্রোগুলিতে সেই সমস্ত জটিলতাগুলি আড়াল করার জন্য কাজ করেছি। তাদের সাথে মোকাবিলা করা এড়াতে, স্থানীয় পরীক্ষার নিয়মের পরিবর্তে নিম্নলিখিতগুলি ব্যবহার করুন। মনে রাখবেন যে এই সবগুলি tensorflow/tensorflow.bzl এ সংজ্ঞায়িত করা হয়েছে CC পরীক্ষার জন্য, tf_cc_test , tf_gpu_cc_test , tf_gpu_only_cc_test ব্যবহার করুন। পাইথন পরীক্ষার জন্য, tf_py_test বা gpu_py_test ব্যবহার করুন। আপনার যদি নেটিভ py_test নিয়মের কাছাকাছি কিছুর প্রয়োজন হয়, তাহলে পরিবর্তে tensorflow.bzl-এ সংজ্ঞায়িত একটি ব্যবহার করুন। আপনাকে শুধু BUILD ফাইলের শীর্ষে নিম্নলিখিত লাইন যোগ করতে হবে: load(“tensorflow/tensorflow.bzl”, “py_test”)

পরীক্ষা কোথায় কার্যকর হয় সচেতন থাকুন

আপনি যখন একটি পরীক্ষা লেখেন, আমাদের পরীক্ষার ইনফ্রা আপনার পরীক্ষাগুলি CPU, GPU এবং এক্সিলারেটরগুলিতে চালানোর যত্ন নিতে পারে যদি আপনি সেগুলি সেই অনুযায়ী লেখেন। আমাদের কাছে স্বয়ংক্রিয় পরীক্ষা রয়েছে যা Linux, macos, windows-এ চলে, যেগুলিতে GPU সহ বা ছাড়া সিস্টেম রয়েছে। আপনাকে কেবল উপরে তালিকাভুক্ত ম্যাক্রোগুলির মধ্যে একটি বাছাই করতে হবে, এবং তারপরে ট্যাগগুলি যেখানে কার্যকর করা হবে তা সীমাবদ্ধ করতে ব্যবহার করুন৷

  • manual ট্যাগ আপনার পরীক্ষাকে যেকোনো জায়গায় চালানো থেকে বাদ দেবে। এর মধ্যে রয়েছে ম্যানুয়াল টেস্ট এক্সিকিউশন যা প্যাটার্ন ব্যবহার করে যেমন bazel test tensorflow/…

  • no_oss অফিসিয়াল TF OSS পরীক্ষার পরিকাঠামোতে আপনার পরীক্ষা চালানো থেকে বাদ দেবে।

  • no_mac বা no_windows ট্যাগগুলি প্রাসঙ্গিক অপারেটিং সিস্টেম টেস্ট স্যুট থেকে আপনার পরীক্ষা বাদ দিতে ব্যবহার করা যেতে পারে।

  • no_gpu ট্যাগ ব্যবহার করা যেতে পারে আপনার পরীক্ষাটি GPU টেস্ট স্যুটে চলা থেকে বাদ দিতে।

প্রত্যাশিত টেস্ট স্যুটে পরীক্ষা চালানো যাচাই করুন

TF এর বেশ কয়েকটি টেস্ট স্যুট রয়েছে। কখনও কখনও, তারা সেট আপ করতে বিভ্রান্তিকর হতে পারে। আপনার পরীক্ষাগুলি ক্রমাগত বিল্ডগুলি থেকে বাদ দেওয়া হতে পারে এমন বিভিন্ন সমস্যা হতে পারে। এইভাবে, আপনার যাচাই করা উচিত যে আপনার পরীক্ষাগুলি প্রত্যাশা অনুযায়ী কার্যকর হচ্ছে। এটা করতে:

  • আপনার পুল রিকোয়েস্ট (পিআর) তে আপনার প্রিসবমিট শেষ হওয়ার জন্য অপেক্ষা করুন।
  • স্ট্যাটাস চেক দেখতে আপনার PR এর নীচে স্ক্রোল করুন।
  • যেকোন কোকোরো চেকের ডান পাশে "বিশদ বিবরণ" লিঙ্কে ক্লিক করুন।
  • আপনার নতুন যোগ করা লক্ষ্যগুলি খুঁজে পেতে "লক্ষ্য" তালিকা পরীক্ষা করুন।

প্রতিটি ক্লাস/ইউনিট এর নিজস্ব ইউনিট টেস্ট ফাইল থাকতে হবে

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

গতি এবং চলমান সময়

Sharding যতটা সম্ভব কম ব্যবহার করা উচিত

ভাগ করার পরিবর্তে অনুগ্রহ করে বিবেচনা করুন:

  • আপনার পরীক্ষা ছোট করা
  • যদি উপরেরটি সম্ভব না হয় তবে পরীক্ষাগুলিকে বিভক্ত করুন

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

ছোট পরীক্ষা ভালো হয়

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

  • আপনার পরীক্ষায় প্রশিক্ষণের কম পুনরাবৃত্তি চালান
  • সাধারণ জাল দিয়ে পরীক্ষার অধীনে সিস্টেমের ভারী নির্ভরতা প্রতিস্থাপন করতে নির্ভরতা ইনজেকশন ব্যবহার করার কথা বিবেচনা করুন।
  • ইউনিট পরীক্ষায় ছোট ইনপুট ডেটা ব্যবহার করার কথা বিবেচনা করুন
  • যদি অন্য কিছু কাজ করে না, আপনার পরীক্ষা ফাইলটি বিভক্ত করার চেষ্টা করুন।

ফ্লেক্স এড়াতে পরীক্ষার সময়গুলি পরীক্ষার আকারের টাইমআউটের অর্ধেক লক্ষ্য করা উচিত

bazel পরীক্ষার লক্ষ্যমাত্রা সহ, ছোট পরীক্ষায় 1 মিনিটের সময়সীমা থাকে। মাঝারি পরীক্ষার সময়সীমা 5 মিনিট। TensorFlow টেস্ট ইনফ্রা দ্বারা বড় পরীক্ষাগুলি চালানো হয় না। যাইহোক, অনেক পরীক্ষা তারা যে পরিমাণ সময় নেয় তা নির্ধারক নয়। বিভিন্ন কারণে আপনার পরীক্ষাগুলি প্রতিবার এবং তারপরে আরও বেশি সময় নিতে পারে। এবং, আপনি যদি এমন একটি পরীক্ষাকে চিহ্নিত করেন যা গড়ে 50 সেকেন্ডের জন্য চলে, তাহলে আপনার পরীক্ষাটি একটি পুরানো CPU সহ একটি মেশিনে সময়সূচী করলে তা বিপর্যস্ত হবে। অতএব, ছোট পরীক্ষার জন্য 30 সেকেন্ড গড় চলমান সময়ের লক্ষ্য করুন। মাঝারি পরীক্ষার জন্য গড় চলমান সময়ের 2 মিনিট 30 সেকেন্ড লক্ষ্য করুন।

নমুনার সংখ্যা হ্রাস করুন এবং প্রশিক্ষণের জন্য সহনশীলতা বাড়ান

ধীর গতিতে চলমান পরীক্ষা অবদানকারীদের বাধা দেয়। পরীক্ষায় প্রশিক্ষণ চালানো খুব ধীর হতে পারে। আপনার পরীক্ষাগুলি যথেষ্ট দ্রুত (2.5 মিনিট সর্বোচ্চ) রাখতে আপনার পরীক্ষায় কম নমুনা ব্যবহার করতে সক্ষম হওয়ার জন্য উচ্চ সহনশীলতা পছন্দ করুন।

অনির্ধারণবাদ এবং ফ্লেক্স দূর করুন

নির্ধারক পরীক্ষা লিখুন

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

সর্বদা স্টোকাস্টিটির কোনো উৎস বীজ

যেকোন এলোমেলো সংখ্যা জেনারেটর, বা স্টোকাস্টিটির অন্য কোন উৎস ফ্লাকিনেস হতে পারে। অতএব, এই প্রতিটি বীজ করা আবশ্যক. পরীক্ষাগুলিকে কম ফ্লেকি করার পাশাপাশি, এটি সমস্ত পরীক্ষাকে পুনরুত্পাদনযোগ্য করে তোলে। টিএফ পরীক্ষায় কিছু বীজ সেট করার বিভিন্ন উপায় হল:

# Python RNG
import random
random.seed(42)

# Numpy RNG
import numpy as np
np.random.seed(42)

# TF RNG
from tensorflow.python.framework import random_seed
random_seed.set_seed(42)

মাল্টিথ্রেডেড পরীক্ষায় sleep ব্যবহার করা এড়িয়ে চলুন

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

পরীক্ষা ফ্ল্যাকি কিনা পরীক্ষা করুন

ফ্লেক্স বিল্ডকপ এবং ডেভেলপারদের অনেক ঘন্টা নষ্ট করে দেয়। তারা সনাক্ত করা কঠিন, এবং তারা ডিবাগ করা কঠিন। যদিও স্বয়ংক্রিয় সিস্টেমগুলি ফ্লকিনেস শনাক্ত করার জন্য রয়েছে, তবুও তারা সঠিকভাবে ডিনালিস্ট পরীক্ষা করতে পারে তার আগে তাদের শত শত টেস্ট রান সংগ্রহ করতে হবে। এমনকি যখন তারা সনাক্ত করে, তারা আপনার পরীক্ষাগুলিকে অস্বীকার করে এবং পরীক্ষার কভারেজ হারিয়ে যায়। অতএব, পরীক্ষার লেখকদের পরীক্ষা লেখার সময় তাদের পরীক্ষাগুলি ফ্লেকি কিনা তা পরীক্ষা করা উচিত। পতাকা দিয়ে আপনার পরীক্ষা চালিয়ে এটি সহজেই করা যেতে পারে: --runs_per_test=1000

TensorFlowTestCase ব্যবহার করুন

TensorFlowTestCase প্রয়োজনীয় সতর্কতা অবলম্বন করে যেমন যতটা সম্ভব ফ্ল্যাকিনেস কমাতে ব্যবহৃত সমস্ত র্যান্ডম নম্বর জেনারেটর বীজ করা। আমরা আরও ফ্লাকিনেস উত্সগুলি আবিষ্কার এবং ঠিক করার সাথে সাথে এগুলিকে TensorFlowTestCase-এ যোগ করা হবে। তাই, টেনসরফ্লো পরীক্ষা লেখার সময় আপনার টেনসরফ্লোটেস্টকেস ব্যবহার করা উচিত। TensorFlowTestCase এখানে সংজ্ঞায়িত করা হয়েছে: tensorflow/python/framework/test_util.py

হারমেটিক পরীক্ষা লিখুন

হারমেটিক পরীক্ষার জন্য বাইরের কোনো সম্পদের প্রয়োজন নেই। তারা তাদের প্রয়োজনীয় সমস্ত কিছু দিয়ে পরিপূর্ণ, এবং তারা কেবল তাদের প্রয়োজন হতে পারে এমন কোনও জাল পরিষেবা শুরু করে। আপনার পরীক্ষা ব্যতীত অন্য যেকোন পরিষেবা অ-নিয়ন্ত্রকতার উত্স। এমনকি অন্যান্য পরিষেবার 99% প্রাপ্যতার সাথেও, নেটওয়ার্ক বিপর্যস্ত হতে পারে, rpc প্রতিক্রিয়া বিলম্বিত হতে পারে এবং আপনি একটি অবর্ণনীয় ত্রুটির বার্তা দিয়ে শেষ করতে পারেন। বাইরের পরিষেবাগুলি GCS, S3 বা যে কোনও ওয়েবসাইট হতে পারে, কিন্তু সীমাবদ্ধ নয়৷