একটি মডেলের অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করার ক্ষমতা অনেকগুলি অ্যাপ্লিকেশনের জন্য অত্যাবশ্যক, যেমন স্থানান্তর শেখার ক্ষেত্রে বা পূর্বপ্রশিক্ষিত মডেলগুলি ব্যবহার করে অনুমান সম্পাদনের জন্য। একটি মডেলের প্যারামিটার (ওজন, পক্ষপাত, ইত্যাদি) একটি চেকপয়েন্ট ফাইল বা ডিরেক্টরিতে সংরক্ষণ করা এটি সম্পন্ন করার একটি উপায়।
এই মডিউলটি TensorFlow v2 ফরম্যাট চেকপয়েন্ট লোড এবং সংরক্ষণ করার জন্য একটি উচ্চ-স্তরের ইন্টারফেস প্রদান করে, সেইসাথে নিম্ন-স্তরের উপাদানগুলি যা এই ফাইল বিন্যাসে লিখতে এবং পড়তে পারে।
সহজ মডেল লোড করা এবং সংরক্ষণ করা হচ্ছে
Checkpointable
প্রোটোকলের সাথে সামঞ্জস্য রেখে, অনেক সাধারণ মডেলকে কোনো অতিরিক্ত কোড ছাড়াই চেকপয়েন্টে সিরিয়াল করা যেতে পারে:
import Checkpoints
import ImageClassificationModels
extension LeNet: Checkpointable {}
var model = LeNet()
...
try model.writeCheckpoint(to: directory, name: "LeNet")
এবং তারপর একই চেকপয়েন্ট ব্যবহার করে পড়া যেতে পারে:
try model.readCheckpoint(from: directory, name: "LeNet")
মডেল লোডিং এবং সংরক্ষণের জন্য এই ডিফল্ট বাস্তবায়ন মডেলের প্রতিটি টেনসরের জন্য একটি পাথ-ভিত্তিক নামকরণ স্কিম ব্যবহার করবে যা মডেল স্ট্রাকটের মধ্যে থাকা বৈশিষ্ট্যগুলির নামের উপর ভিত্তি করে। উদাহরণস্বরূপ, LeNet-5 মডেলের প্রথম কনভোলিউশনের মধ্যে ওজন এবং পক্ষপাতগুলি যথাক্রমে conv1/filter
এবং conv1/bias
নাম দিয়ে সংরক্ষণ করা হবে। লোড করার সময়, চেকপয়েন্ট রিডার এই নামগুলির সাথে টেনসরগুলি অনুসন্ধান করবে।
মডেল লোডিং এবং সংরক্ষণ কাস্টমাইজ করা
কোন টেনসরগুলি সংরক্ষিত এবং লোড করা হয় বা সেই টেনসরগুলির নামকরণের উপর আপনি যদি আরও বেশি নিয়ন্ত্রণ করতে চান তবে Checkpointable
প্রোটোকলটি কাস্টমাইজেশনের কয়েকটি পয়েন্ট অফার করে।
নির্দিষ্ট ধরণের বৈশিষ্ট্যগুলিকে উপেক্ষা করতে, আপনি আপনার মডেলে ignoredTensorPaths
একটি বাস্তবায়ন প্রদান করতে পারেন যা Type.property
আকারে স্ট্রিংগুলির একটি সেট প্রদান করে। উদাহরণস্বরূপ, প্রতিটি মনোযোগ স্তরে scale
বৈশিষ্ট্য উপেক্ষা করতে, আপনি ["Attention.scale"]
ফিরে আসতে পারেন।
ডিফল্টরূপে, একটি মডেলের প্রতিটি গভীর স্তরকে আলাদা করতে একটি ফরোয়ার্ড স্ল্যাশ ব্যবহার করা হয়। এটি আপনার মডেলে checkpointSeparator
প্রয়োগ করে এবং এই বিভাজকের জন্য ব্যবহার করার জন্য একটি নতুন স্ট্রিং প্রদান করে কাস্টমাইজ করা যেতে পারে।
অবশেষে, টেনসর নামকরণে সর্বাধিক মাত্রার কাস্টমাইজেশনের জন্য, আপনি tensorNameMap
প্রয়োগ করতে পারেন এবং একটি ফাংশন প্রদান করতে পারেন যা মডেলের একটি টেনসরের জন্য তৈরি করা ডিফল্ট স্ট্রিং নাম থেকে চেকপয়েন্টে একটি পছন্দসই স্ট্রিং নামে মানচিত্র তৈরি করে। সাধারণত, এটি অন্যান্য ফ্রেমওয়ার্কের সাথে উত্পন্ন চেকপয়েন্টগুলির সাথে ইন্টারঅপারেশন করতে ব্যবহৃত হবে, যার প্রত্যেকটির নিজস্ব নামকরণের নিয়ম এবং মডেল কাঠামো রয়েছে। একটি কাস্টম ম্যাপিং ফাংশন এই টেনসরগুলির নামকরণের জন্য সর্বাধিক মাত্রার কাস্টমাইজেশন দেয়।
কিছু স্ট্যান্ডার্ড হেল্পার ফাংশন প্রদান করা হয়, যেমন ডিফল্ট CheckpointWriter.identityMap
(যা চেকপয়েন্টের জন্য স্বয়ংক্রিয়ভাবে তৈরি হওয়া টেনসর পথের নাম ব্যবহার করে), অথবা CheckpointWriter.lookupMap(table:)
ফাংশন, যা একটি অভিধান থেকে একটি ম্যাপিং তৈরি করতে পারে।
কাস্টম ম্যাপিং কীভাবে সম্পন্ন করা যায় তার একটি উদাহরণের জন্য, অনুগ্রহ করে GPT-2 মডেলটি দেখুন, যা OpenAI-এর চেকপয়েন্টগুলির জন্য ব্যবহৃত সঠিক নামকরণ প্রকল্পের সাথে মেলে একটি ম্যাপিং ফাংশন ব্যবহার করে৷
চেকপয়েন্ট রিডার এবং চেকপয়েন্ট রাইটার উপাদান
চেকপয়েন্ট লেখার জন্য, Checkpointable
প্রোটোকল দ্বারা প্রদত্ত এক্সটেনশনটি মডেলের বৈশিষ্ট্যগুলিকে পুনরাবৃত্তি করতে প্রতিফলন এবং কীপাথ ব্যবহার করে এবং একটি অভিধান তৈরি করে যা টেনসর মানগুলিতে স্ট্রিং টেনসর পাথগুলিকে ম্যাপ করে। এই অভিধানটি একটি অন্তর্নিহিত CheckpointWriter
প্রদান করা হয়, সাথে একটি ডিরেক্টরি যেখানে চেকপয়েন্ট লিখতে হয়। সেই CheckpointWriter
সেই অভিধান থেকে অন-ডিস্ক চেকপয়েন্ট তৈরি করার কাজ পরিচালনা করে।
এই প্রক্রিয়াটির বিপরীতটি পড়া হচ্ছে, যেখানে একটি CheckpointReader
একটি অন-ডিস্ক চেকপয়েন্ট ডিরেক্টরির অবস্থান দেওয়া হয়। তারপরে এটি সেই চেকপয়েন্ট থেকে পড়ে এবং একটি অভিধান তৈরি করে যা চেকপয়েন্টের মধ্যে টেনসরের নামগুলি তাদের সংরক্ষিত মানগুলির সাথে ম্যাপ করে। এই অভিধানটি এই অভিধানের সাথে একটি মডেলের বর্তমান টেনসরগুলি প্রতিস্থাপন করতে ব্যবহৃত হয়।
লোড করা এবং সংরক্ষণ উভয়ের জন্য, Checkpointable
প্রোটোকল উপরে বর্ণিত ম্যাপিং ফাংশন ব্যবহার করে অন-ডিস্ক টেনসর নামের সাথে টেনসরের স্ট্রিং পাথ ম্যাপ করে।
যদি Checkpointable
প্রোটোকলের প্রয়োজনীয় কার্যকারিতার অভাব থাকে, বা চেকপয়েন্ট লোডিং এবং সংরক্ষণ প্রক্রিয়ার উপর আরও নিয়ন্ত্রণের প্রয়োজন হয়, CheckpointReader
এবং CheckpointWriter
ক্লাসগুলি নিজেরাই ব্যবহার করা যেতে পারে।
TensorFlow v2 চেকপয়েন্ট ফর্ম্যাট
TensorFlow v2 চেকপয়েন্ট ফরম্যাট, এই হেডারে সংক্ষেপে বর্ণনা করা হয়েছে, TensorFlow মডেল চেকপয়েন্টের জন্য দ্বিতীয় প্রজন্মের বিন্যাস। এই দ্বিতীয়-প্রজন্মের বিন্যাসটি 2016 সালের শেষের দিক থেকে ব্যবহার করা হচ্ছে, এবং v1 চেকপয়েন্ট বিন্যাসের তুলনায় অনেক উন্নতি হয়েছে। TensorFlow SavedModels মডেল প্যারামিটার সংরক্ষণ করতে তাদের মধ্যে v2 চেকপয়েন্ট ব্যবহার করে।
একটি TensorFlow v2 চেকপয়েন্ট নিম্নলিখিত মত কাঠামো সহ একটি ডিরেক্টরি নিয়ে গঠিত:
checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002
যেখানে প্রথম ফাইলটি চেকপয়েন্টের জন্য মেটাডেটা সংরক্ষণ করে এবং অবশিষ্ট ফাইলগুলি মডেলের জন্য ক্রমিক পরামিতি ধারণ করে বাইনারি শার্ড।
ইনডেক্স মেটাডেটা ফাইলে শার্ডের মধ্যে থাকা সমস্ত সিরিয়ালাইজড টেনসরের ধরন, আকার, অবস্থান এবং স্ট্রিং নাম রয়েছে। এই সূচী ফাইলটি চেকপয়েন্টের সবচেয়ে কাঠামোগতভাবে জটিল অংশ, এবং এটি tensorflow::table
এর উপর ভিত্তি করে, যা নিজেই SSTable/LevelDB এর উপর ভিত্তি করে। এই সূচক ফাইলটি কী-মানের জোড়ার একটি সিরিজের সমন্বয়ে গঠিত, যেখানে কীগুলি স্ট্রিং এবং মানগুলি প্রোটোকল বাফার। স্ট্রিংগুলি সাজানো এবং উপসর্গ-সংকুচিত। উদাহরণস্বরূপ: যদি প্রথম এন্ট্রিটি conv1/weight
এবং পরবর্তী conv1/bias
হয়, তাহলে দ্বিতীয় এন্ট্রিটি শুধুমাত্র bias
অংশটি ব্যবহার করে।
এই সামগ্রিক সূচক ফাইলটি কখনও কখনও স্ন্যাপি কম্প্রেশন ব্যবহার করে সংকুচিত হয়। SnappyDecompression.swift
ফাইলটি একটি সংকুচিত ডেটা উদাহরণ থেকে Snappy ডিকম্প্রেশনের একটি নেটিভ সুইফট বাস্তবায়ন প্রদান করে।
ইনডেক্স হেডার মেটাডেটা এবং টেনসর মেটাডেটা প্রোটোকল বাফার হিসাবে এনকোড করা হয় এবং সুইফট প্রোটোবুফের মাধ্যমে সরাসরি এনকোড/ডিকোড করা হয়।
CheckpointIndexReader
এবং CheckpointIndexWriter
ক্লাসগুলি ওভারআর্চিং CheckpointReader
এবং CheckpointWriter
ক্লাসের অংশ হিসাবে এই সূচক ফাইলগুলি লোড করা এবং সংরক্ষণ করা পরিচালনা করে। পরেরটি টেনসর ডেটা ধারণ করে কাঠামোগতভাবে সহজ বাইনারি শার্ডগুলিতে কী পড়তে এবং লিখতে হবে তা নির্ধারণের জন্য ভিত্তি হিসাবে সূচক ফাইলগুলি ব্যবহার করে।