NaNs জড়িত বিপর্যয়মূলক ঘটনা কখনও কখনও একটি TensorFlow প্রোগ্রামের সময় ঘটতে পারে, মডেল প্রশিক্ষণ প্রক্রিয়াগুলিকে পঙ্গু করে। এই ধরনের ঘটনার মূল কারণ প্রায়ই অস্পষ্ট হয়, বিশেষ করে অ-তুচ্ছ আকার এবং জটিলতার মডেলগুলির জন্য। এই ধরনের মডেল বাগ ডিবাগ করা সহজ করতে, TensorBoard 2.3+ (TensorFlow 2.3+ এর সাথে একসাথে) Debugger V2 নামে একটি বিশেষ ড্যাশবোর্ড প্রদান করে। এখানে আমরা টেনসরফ্লোতে লেখা একটি নিউরাল নেটওয়ার্কে NaN-এর সাথে জড়িত একটি বাস্তব বাগ-এর মাধ্যমে কাজ করে এই টুলটি কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করি।
এই টিউটোরিয়ালে চিত্রিত কৌশলগুলি অন্যান্য ধরণের ডিবাগিং কার্যকলাপের ক্ষেত্রে প্রযোজ্য যেমন জটিল প্রোগ্রামগুলিতে রানটাইম টেনসর আকারগুলি পরিদর্শন করা। তুলনামূলকভাবে উচ্চ ফ্রিকোয়েন্সি হওয়ার কারণে এই টিউটোরিয়ালটি NaN-এর উপর ফোকাস করে।
বাগ পর্যবেক্ষণ
আমরা যে TF2 প্রোগ্রামটি ডিবাগ করব তার সোর্স কোড GitHub এ উপলব্ধ । উদাহরণ প্রোগ্রামটি টেনসরফ্লো পিপ প্যাকেজেও প্যাকেজ করা হয়েছে (সংস্করণ 2.3+) এবং এর দ্বারা আহ্বান করা যেতে পারে:
python -m tensorflow.python.debug.examples.v2.debug_mnist_v2
এই TF2 প্রোগ্রামটি একটি মাল্টি-লেয়ার পারসেপশন (MLP) তৈরি করে এবং এটিকে MNIST ইমেজ চিনতে প্রশিক্ষণ দেয়। এই উদাহরণটি উদ্দেশ্যমূলকভাবে কাস্টম লেয়ার কনস্ট্রাক্ট, লস ফাংশন এবং ট্রেনিং লুপ সংজ্ঞায়িত করতে TF2 এর নিম্ন-স্তরের API ব্যবহার করে, কারণ আমরা যখন সহজ ব্যবহার করার তুলনায় এই আরও নমনীয় কিন্তু আরও ত্রুটি-প্রবণ API ব্যবহার করি তখন NaN বাগ হওয়ার সম্ভাবনা বেশি। -ব্যবহারের জন্য কিন্তু সামান্য কম নমনীয় উচ্চ-স্তরের API যেমন tf.keras ।
প্রতিটি প্রশিক্ষণ ধাপের পর প্রোগ্রামটি একটি পরীক্ষার নির্ভুলতা প্রিন্ট করে। আমরা কনসোলে দেখতে পাচ্ছি যে পরীক্ষার নির্ভুলতা প্রথম ধাপের পরে কাছাকাছি-সুযোগ স্তরে (~0.1) আটকে যায়। এটি অবশ্যই মডেল প্রশিক্ষণের আচরণের প্রত্যাশিত নয়: আমরা আশা করি যে ধাপ বাড়লে নির্ভুলতা ধীরে ধীরে 1.0 (100%) এ পৌঁছাবে।
Accuracy at step 0: 0.216
Accuracy at step 1: 0.098
Accuracy at step 2: 0.098
Accuracy at step 3: 0.098
...
একটি শিক্ষিত অনুমান হল যে এই সমস্যাটি একটি সংখ্যাগত অস্থিরতার কারণে হয়, যেমন NaN বা অসীম। যাইহোক, আমরা কীভাবে নিশ্চিত করব যে এটি আসলেই ঘটনা এবং কীভাবে আমরা সংখ্যাসূচক অস্থিরতা তৈরির জন্য দায়ী TensorFlow অপারেশন (op) খুঁজে পাব? এই প্রশ্নের উত্তর দেওয়ার জন্য, আসুন ডিবাগার V2 দিয়ে বগি প্রোগ্রামটিকে ইনস্ট্রুমেন্ট করি।
ডিবাগার V2 এর সাথে টেনসরফ্লো কোডের ইন্সট্রুমেন্টিং
tf.debugging.experimental.enable_dump_debug_info()
হল ডিবাগার V2 এর API এন্ট্রি পয়েন্ট। এটি কোডের একক লাইনের সাথে একটি TF2 প্রোগ্রামের যন্ত্র। উদাহরণ স্বরূপ, প্রোগ্রামের শুরুতে নিচের লাইনটি যোগ করলে ডিবাগ তথ্য /tmp/tfdbg2_logdir-এ লগ ডিরেক্টরিতে (logdir) লেখা হবে। ডিবাগ তথ্য TensorFlow রানটাইমের বিভিন্ন দিক কভার করে। TF2-এ, এটির মধ্যে রয়েছে উদগ্রীব সম্পাদনের সম্পূর্ণ ইতিহাস, @tf.function দ্বারা সঞ্চালিত গ্রাফ বিল্ডিং, গ্রাফগুলির সম্পাদন, কার্যকরী ইভেন্টগুলির দ্বারা উত্পন্ন টেনসর মান, সেইসাথে সেই ইভেন্টগুলির কোড অবস্থান (পাইথন স্ট্যাক ট্রেস) . ডিবাগ তথ্যের সমৃদ্ধি ব্যবহারকারীদের অস্পষ্ট বাগগুলিকে সংকুচিত করতে সক্ষম করে।
tf.debugging.experimental.enable_dump_debug_info(
"/tmp/tfdbg2_logdir",
tensor_debug_mode="FULL_HEALTH",
circular_buffer_size=-1)
tensor_debug_mode
আর্গুমেন্ট ডিবাগার V2 প্রতিটি আগ্রহী বা ইন-গ্রাফ টেনসর থেকে কোন তথ্য বের করে তা নিয়ন্ত্রণ করে। "FULL_HEALTH" হল একটি মোড যা প্রতিটি ফ্লোটিং-টাইপ টেনসর সম্পর্কে নিম্নলিখিত তথ্য ক্যাপচার করে (যেমন, সাধারণত দেখা যায় float32 এবং কম সাধারণ bfloat16 dtype):
- ডিটি টাইপ
- পদমর্যাদা
- উপাদানের মোট সংখ্যা
- ফ্লোটিং-টাইপ উপাদানগুলির একটি ভাঙ্গন নিম্নলিখিত বিভাগগুলিতে: ঋণাত্মক সসীম (
-
), শূন্য (0
), ধনাত্মক সসীম (+
), ঋণাত্মক অসীম (-∞
), ধনাত্মক অসীম (+∞
), এবংNaN
।
"FULL_HEALTH" মোডটি NaN এবং ইনফিনিটি জড়িত বাগগুলি ডিবাগ করার জন্য উপযুক্ত৷ অন্যান্য সমর্থিত tensor_debug_mode
s এর জন্য নীচে দেখুন।
circular_buffer_size
আর্গুমেন্ট লগডিরে কতগুলি টেনসর ইভেন্ট সংরক্ষণ করা হয় তা নিয়ন্ত্রণ করে। এটি ডিফল্ট 1000, যার কারণে যন্ত্রযুক্ত TF2 প্রোগ্রাম শেষ হওয়ার আগে শুধুমাত্র শেষ 1000 টি টেনসর ডিস্কে সংরক্ষণ করা হয়। এই ডিফল্ট আচরণ ডিবাগ-ডেটা সম্পূর্ণতা ত্যাগ করে ডিবাগার ওভারহেড হ্রাস করে। যদি সম্পূর্ণতা পছন্দ করা হয়, যেমন এই ক্ষেত্রে, আমরা একটি নেতিবাচক মান (যেমন, -1 এখানে) আর্গুমেন্ট সেট করে সার্কুলার বাফার নিষ্ক্রিয় করতে পারি।
debug_mnist_v2 উদাহরণ enable_dump_debug_info()
এটিতে কমান্ড-লাইন পতাকা প্রেরণ করে। এই ডিবাগিং ইন্সট্রুমেন্টেশন সক্ষম করে আমাদের সমস্যাযুক্ত TF2 প্রোগ্রাম আবার চালানোর জন্য, করুন:
python -m tensorflow.python.debug.examples.v2.debug_mnist_v2 \
--dump_dir /tmp/tfdbg2_logdir --dump_tensor_debug_mode FULL_HEALTH
টেনসরবোর্ডে ডিবাগার V2 GUI শুরু করা হচ্ছে
ডিবাগার ইন্সট্রুমেন্টেশনের সাহায্যে প্রোগ্রাম চালানো হলে /tmp/tfdbg2_logdir-এ একটি লগডির তৈরি হয়। আমরা টেনসরবোর্ড শুরু করতে পারি এবং লগডিরে এটিকে নির্দেশ করতে পারি:
tensorboard --logdir /tmp/tfdbg2_logdir
ওয়েব ব্রাউজারে, http://localhost:6006-এ TensorBoard-এর পেজে নেভিগেট করুন। "ডিবাগার V2" প্লাগইনটি ডিফল্টরূপে নিষ্ক্রিয় থাকবে, তাই উপরের ডানদিকে "নিষ্ক্রিয় প্লাগইন" মেনু থেকে এটি নির্বাচন করুন। একবার নির্বাচিত হলে, এটি নিম্নলিখিতগুলির মতো হওয়া উচিত:
NaNs এর মূল কারণ খুঁজে বের করতে ডিবাগার V2 GUI ব্যবহার করা
টেনসরবোর্ডে ডিবাগার V2 GUI ছয়টি বিভাগে সংগঠিত:
- সতর্কতা : এই উপরের-বাম অংশে ইনস্ট্রুমেন্টেড টেনসরফ্লো প্রোগ্রাম থেকে ডিবাগ ডেটাতে ডিবাগার দ্বারা সনাক্ত করা "সতর্কতা" ইভেন্টগুলির একটি তালিকা রয়েছে৷ প্রতিটি সতর্কতা একটি নির্দিষ্ট অসঙ্গতি নির্দেশ করে যা মনোযোগের প্রয়োজন। আমাদের ক্ষেত্রে, এই বিভাগটি 499টি NaN/∞ ইভেন্ট হাইলাইট করে একটি প্রধান গোলাপী-লাল রঙের সাথে। এটি আমাদের সন্দেহ নিশ্চিত করে যে মডেলটি এর অভ্যন্তরীণ টেনসর মানগুলিতে NaN এবং/অথবা অসীম উপস্থিতির কারণে শিখতে ব্যর্থ হয়। আমরা শীঘ্রই এই সতর্কতাগুলির মধ্যে অনুসন্ধান করব৷
- পাইথন এক্সিকিউশন টাইমলাইন : এটি টপ-মিডল সেকশনের উপরের অর্ধেক। এটি অপস এবং গ্রাফের উত্সাহী সম্পাদনের সম্পূর্ণ ইতিহাস উপস্থাপন করে। টাইমলাইনের প্রতিটি বাক্স op বা গ্রাফের নামের প্রাথমিক অক্ষর দ্বারা চিহ্নিত করা হয় (যেমন, "TensorSliceDataset" op এর জন্য "T", "মডেল"
tf.function
এর জন্য "m")। আমরা নেভিগেশন বোতাম এবং টাইমলাইনের উপরে স্ক্রলবার ব্যবহার করে এই টাইমলাইনে নেভিগেট করতে পারি। - গ্রাফ এক্সিকিউশন : GUI-এর উপরের-ডান কোণায় অবস্থিত, এই বিভাগটি আমাদের ডিবাগিং টাস্কের কেন্দ্রীয় হবে। এটিতে গ্রাফের ভিতরে গণনা করা সমস্ত ভাসমান-ডিটাইপ টেনসরগুলির একটি ইতিহাস রয়েছে (যেমন,
@tf-function
s দ্বারা সংকলিত)। - গ্রাফ স্ট্রাকচার (উপরের-মধ্য অংশের নীচের অর্ধেক), সোর্স কোড (নীচে-বাম অংশ), এবং স্ট্যাক ট্রেস (নীচে-ডান অংশ) প্রাথমিকভাবে খালি। আমরা যখন GUI-এর সাথে ইন্টারঅ্যাক্ট করি তখন তাদের বিষয়বস্তু পূর্ণ হবে। এই তিনটি বিভাগ আমাদের ডিবাগিং টাস্কে গুরুত্বপূর্ণ ভূমিকা পালন করবে।
নিজেদেরকে UI-এর সংগঠনের সাথে যুক্ত করার পরে, আসুন কেন NaN গুলি উপস্থিত হল তার নীচে যাওয়ার জন্য নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করি৷ প্রথমে, সতর্কতা বিভাগে NaN/∞ সতর্কতায় ক্লিক করুন। এটি স্বয়ংক্রিয়ভাবে গ্রাফ এক্সিকিউশন বিভাগে 600টি গ্রাফ টেনসরের তালিকা স্ক্রোল করে এবং #88-এ ফোকাস করে, যা Log:0
নামের একটি টেনসর যা একটি Log
(প্রাকৃতিক লগারিদম) অপশন দ্বারা তৈরি হয়। একটি উল্লেখযোগ্য গোলাপী-লাল রঙ 2D ফ্লোট32 টেনসরের 1000টি উপাদানের মধ্যে একটি -∞ উপাদানকে হাইলাইট করে। TF2 প্রোগ্রামের রানটাইম ইতিহাসে এটিই প্রথম টেনসর যাতে কোনো NaN বা অসীম থাকে: টেনসরের আগে গণনা করা হয় এতে NaN বা ∞ থাকে না; পরে গণনা করা অনেকগুলি (আসলে, বেশিরভাগ) টেনসরে NaN থাকে। আমরা গ্রাফ এক্সিকিউশন তালিকার উপরে এবং নীচে স্ক্রোল করে এটি নিশ্চিত করতে পারি। এই পর্যবেক্ষণটি একটি শক্তিশালী ইঙ্গিত দেয় যে Log
অপটি এই TF2 প্রোগ্রামে সংখ্যাসূচক অস্থিরতার উত্স।
কেন এই Log
অপ থুতু আউট একটি -∞? এই প্রশ্নের উত্তর দেওয়ার জন্য অপের ইনপুট পরীক্ষা করা প্রয়োজন। টেনসরের নামের উপর ক্লিক করা ( Log:0
) গ্রাফ স্ট্রাকচার বিভাগে এর TensorFlow গ্রাফে Log
অপের আশেপাশে একটি সহজ কিন্তু তথ্যপূর্ণ ভিজ্যুয়ালাইজেশন নিয়ে আসে। তথ্য প্রবাহের উপর থেকে নীচের দিকটি নোট করুন। অপ নিজেই মাঝখানে গাঢ় দেখানো হয়. এর অব্যবহিত উপরে, আমরা দেখতে পাচ্ছি একটি Placeholder op Log
অপে এক এবং একমাত্র ইনপুট প্রদান করে। গ্রাফ এক্সিকিউশন তালিকায় এই probs
প্লেসহোল্ডার দ্বারা উৎপন্ন টেনসর কোথায়? হলুদ ব্যাকগ্রাউন্ড কালারটিকে ভিজ্যুয়াল সাহায্য হিসাবে ব্যবহার করে, আমরা দেখতে পাচ্ছি যে probs:0
টেনসরটি Log:0
টেনসরের উপরে তিনটি সারি, অর্থাৎ 85 সারিতে।
85 সারিতে probs:0
টেনসরের সংখ্যাগত ভাঙ্গনের দিকে আরও সতর্ক দৃষ্টিপাত করলে দেখা যায় কেন এর ভোক্তা Log:0
একটি -∞ তৈরি করে: probs:0
এর 1000টি উপাদানের মধ্যে একটি উপাদানের মান 0। -∞ হল 0 এর প্রাকৃতিক লগারিদম গণনার ফলাফল! আমরা যদি কোনোভাবে নিশ্চিত করতে পারি যে Log
অপ শুধুমাত্র ইতিবাচক ইনপুটগুলির সংস্পর্শে আসে, আমরা NaN/∞ ঘটতে বাধা দিতে সক্ষম হব। প্লেসহোল্ডার probs
টেনসরে ক্লিপিং প্রয়োগ করে (যেমন, tf.clip_by_value()
) ব্যবহার করে এটি অর্জন করা যেতে পারে।
আমরা বাগ সমাধানের কাছাকাছি যাচ্ছি, কিন্তু এখনও পুরোপুরি সম্পন্ন হয়নি। ফিক্স প্রয়োগ করার জন্য, আমাদের জানতে হবে পাইথন সোর্স কোডে Log
অপ এবং এর প্লেসহোল্ডার ইনপুটটি কোথায় এসেছে। ডিবাগার V2 তাদের উৎসে গ্রাফ অপস এবং এক্সিকিউশন ইভেন্টগুলি ট্রেস করার জন্য প্রথম-শ্রেণীর সহায়তা প্রদান করে। যখন আমরা গ্রাফ এক্সিকিউশনে Log:0
টেনসরে ক্লিক করি, স্ট্যাক ট্রেস বিভাগটি Log
অপের তৈরির মূল স্ট্যাক ট্রেস দিয়ে পপুলেট করা হয়েছিল। স্ট্যাক ট্রেসটি কিছুটা বড় কারণ এতে TensorFlow-এর অভ্যন্তরীণ কোড (যেমন, gen_math_ops.py এবং dumping_callback.py) থেকে অনেকগুলি ফ্রেম রয়েছে, যা আমরা বেশিরভাগ ডিবাগিং কাজের জন্য নিরাপদে উপেক্ষা করতে পারি। আগ্রহের ফ্রেম হল debug_mnist_v2.py এর লাইন 216 (অর্থাৎ, পাইথন ফাইলটি আমরা আসলে ডিবাগ করার চেষ্টা করছি)। "লাইন 216" এ ক্লিক করলে সোর্স কোড বিভাগে কোডের সংশ্লিষ্ট লাইনের একটি দৃশ্য দেখা যায়।
এটি অবশেষে আমাদের সোর্স কোডে নিয়ে আসে যা এর probs
ইনপুট থেকে সমস্যাযুক্ত Log
অপ তৈরি করে। এটি আমাদের কাস্টম ক্যাটাগরিকাল ক্রস-এনট্রপি লস ফাংশন @tf.function
দ্বারা সজ্জিত এবং তাই একটি টেনসরফ্লো গ্রাফে রূপান্তরিত হয়েছে। Placeholder op probs
লস ফাংশনের প্রথম ইনপুট আর্গুমেন্টের সাথে মিলে যায়। Log
অপটি tf.math.log() API কল দিয়ে তৈরি করা হয়েছে।
এই বাগটির মান-ক্লিপিং ফিক্সটি এমন কিছু দেখাবে:
diff = -(labels *
tf.math.log(tf.clip_by_value(probs), 1e-6, 1.))
এটি এই TF2 প্রোগ্রামের সংখ্যাগত অস্থিরতার সমাধান করবে এবং MLP কে সফলভাবে প্রশিক্ষণ দেবে। সংখ্যাসূচক অস্থিরতা ঠিক করার আরেকটি সম্ভাব্য পদ্ধতি হল tf.keras.losses.CategoricalCrossentropy
ব্যবহার করা।
এটি একটি TF2 মডেলের বাগ পর্যবেক্ষণ করা থেকে শুরু করে একটি কোড পরিবর্তন নিয়ে আসা পর্যন্ত আমাদের যাত্রা শেষ করে যা ডিবাগার V2 টুলের সাহায্যে বাগ সংশোধন করে, যা সংখ্যাসূচক সারাংশ সহ ইনস্ট্রুমেন্টেড TF2 প্রোগ্রামের আগ্রহী এবং গ্রাফ এক্সিকিউশন ইতিহাসের সম্পূর্ণ দৃশ্যমানতা প্রদান করে। টেনসর মান এবং অপস, টেনসর এবং তাদের মূল সোর্স কোডের মধ্যে অ্যাসোসিয়েশন।
ডিবাগার V2 এর হার্ডওয়্যার সামঞ্জস্য
ডিবাগার V2 CPU এবং GPU সহ মূলধারার প্রশিক্ষণ হার্ডওয়্যার সমর্থন করে। tf.distributed.MirroredStrategy সহ মাল্টি-GPU প্রশিক্ষণও সমর্থিত। TPU- এর জন্য সমর্থন এখনও প্রাথমিক পর্যায়ে রয়েছে এবং কল করা প্রয়োজন
tf.config.set_soft_device_placement(True)
কল করার আগে enable_dump_debug_info()
। TPU-তেও এর অন্যান্য সীমাবদ্ধতা থাকতে পারে। আপনি যদি ডিবাগার V2 ব্যবহার করে সমস্যায় পড়েন, অনুগ্রহ করে আমাদের GitHub সমস্যা পৃষ্ঠায় বাগ রিপোর্ট করুন।
ডিবাগার V2 এর API সামঞ্জস্য
Debugger V2 TensorFlow-এর সফ্টওয়্যার স্ট্যাকের তুলনামূলকভাবে নিম্ন স্তরে প্রয়োগ করা হয়, এবং তাই Tf.keras , tf.data , এবং TensorFlow-এর নিম্ন স্তরের উপরে নির্মিত অন্যান্য API-এর সাথে সামঞ্জস্যপূর্ণ। ডিবাগার V2 এছাড়াও TF1 এর সাথে পশ্চাদপদ সামঞ্জস্যপূর্ণ, যদিও TF1 প্রোগ্রাম দ্বারা উত্পন্ন ডিবাগ লগডিরগুলির জন্য Eager এক্সিকিউশন টাইমলাইন খালি থাকবে।
API ব্যবহারের টিপস
এই ডিবাগিং এপিআই সম্পর্কে একটি প্রায়শই জিজ্ঞাসিত প্রশ্ন হল TensorFlow কোডে একটি কলটি enable_dump_debug_info()
তে প্রবেশ করা উচিত। সাধারণত, আপনার TF2 প্রোগ্রামে যত তাড়াতাড়ি সম্ভব API কল করা উচিত, বিশেষত পাইথন ইম্পোর্ট লাইনের পরে এবং গ্রাফ বিল্ডিং এবং এক্সিকিউশন শুরু হওয়ার আগে। এটি আপনার মডেল এবং এর প্রশিক্ষণকে শক্তিশালী করে এমন সমস্ত অপারেশন এবং গ্রাফের সম্পূর্ণ কভারেজ নিশ্চিত করবে।
বর্তমানে সমর্থিত tensor_debug_modes হল: NO_TENSOR
, CURT_HEALTH
, CONCISE_HEALTH
, FULL_HEALTH
, এবং SHAPE
। প্রতিটি টেনসর থেকে বের করা তথ্যের পরিমাণ এবং ডিবাগ করা প্রোগ্রামে কর্মক্ষমতা ওভারহেডের মধ্যে তারা পরিবর্তিত হয়। enable_dump_debug_info()
এর ডকুমেন্টেশনের args বিভাগটি দেখুন।
কর্মক্ষমতা ওভারহেড
ডিবাগিং এপিআই ইনস্ট্রুমেন্টেড টেনসরফ্লো প্রোগ্রামে কর্মক্ষমতা ওভারহেডের সাথে পরিচয় করিয়ে দেয়। ওভারহেড tensor_debug_mode
, হার্ডওয়্যারের ধরন এবং যন্ত্রযুক্ত TensorFlow প্রোগ্রামের প্রকৃতি অনুসারে পরিবর্তিত হয়। একটি রেফারেন্স পয়েন্ট হিসাবে, একটি GPU-তে, NO_TENSOR
মোড ব্যাচ আকার 64-এর অধীনে একটি ট্রান্সফরমার মডেলের প্রশিক্ষণের সময় 15% ওভারহেড যোগ করে। অন্যান্য tensor_debug_modes-এর জন্য শতাংশ ওভারহেড বেশি: CURT_HEALTH
, CONCISE_HEALTH
, FULL_HEALTH
SHAPE
জন্য প্রায় 50% মোড CPU-তে, ওভারহেড সামান্য কম। TPU-তে, ওভারহেড বর্তমানে বেশি।
অন্যান্য TensorFlow ডিবাগিং API-এর সাথে সম্পর্ক
মনে রাখবেন যে টেনসরফ্লো ডিবাগিংয়ের জন্য অন্যান্য সরঞ্জাম এবং API অফার করে। আপনি API ডক্স পৃষ্ঠায় tf.debugging.*
নামস্থানের অধীনে এই জাতীয় APIগুলি ব্রাউজ করতে পারেন। এই APIগুলির মধ্যে সবচেয়ে বেশি ব্যবহৃত হয় tf.print()
। ডিবাগার V2 কখন ব্যবহার করা উচিত এবং এর পরিবর্তে tf.print()
কখন ব্যবহার করা উচিত? tf.print()
যেখানে সুবিধাজনক
- আমরা জানি কোন টেনসরগুলি মুদ্রণ করতে হবে,
- আমরা জানি সোর্স কোডে ঠিক কোথায় এই
tf.print()
স্টেটমেন্টগুলি সন্নিবেশ করাতে হবে, - এই ধরনের টেনসরের সংখ্যা খুব বেশি নয়।
অন্যান্য ক্ষেত্রে (উদাহরণস্বরূপ, অনেক টেনসর মান পরীক্ষা করা, টেনসরফ্লো-এর অভ্যন্তরীণ কোড দ্বারা উত্পন্ন টেনসর মান পরীক্ষা করা, এবং সংখ্যাসূচক অস্থিরতার উত্স অনুসন্ধান করা যেমন আমরা উপরে দেখিয়েছি), ডিবাগার V2 ডিবাগ করার একটি দ্রুত উপায় সরবরাহ করে। উপরন্তু, ডিবাগার V2 আগ্রহী এবং গ্রাফ টেনসর পরিদর্শন করার জন্য একটি ঐক্যবদ্ধ পদ্ধতি প্রদান করে। এটি অতিরিক্তভাবে গ্রাফ গঠন এবং কোড অবস্থান সম্পর্কে তথ্য প্রদান করে, যা tf.print()
এর ক্ষমতার বাইরে।
আরেকটি এপিআই যা ∞ এবং NaN সম্পর্কিত সমস্যাগুলি ডিবাগ করতে ব্যবহার করা যেতে পারে তা হল tf.debugging.enable_check_numerics()
। enable_dump_debug_info()
এর বিপরীতে, enable_check_numerics()
ডিস্কে ডিবাগ তথ্য সংরক্ষণ করে না। পরিবর্তে, এটি শুধুমাত্র TensorFlow রানটাইম চলাকালীন ∞ এবং NaN নিরীক্ষণ করে এবং যেকোনও অপ-এর দ্বারা এই ধরনের খারাপ সংখ্যাসূচক মান তৈরি হওয়ার সাথে সাথে মূল কোডের অবস্থানের সাথে ত্রুটি দেখা দেয়। enable_dump_debug_info()
এর তুলনায় এটির ওভারহেড কম পারফরম্যান্স রয়েছে, কিন্তু প্রোগ্রামের এক্সিকিউশন ইতিহাসের সম্পূর্ণ ট্রেস বহন করে না এবং ডিবাগার V2 এর মতো গ্রাফিকাল ইউজার ইন্টারফেসের সাথে আসে না।