উপভাষা-অজ্ঞেয়বাদী ভাগ করা, উপভাষা-অজ্ঞেয়বাদী ভাগ করা, উপভাষা-অজ্ঞেয়বাদী ভাগ করা

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

ভাগ করার নিয়ম

একটি শার্ডিং নিয়ম এনকোড করে যে আমরা একটি অপারেশনের মাধ্যমে কীভাবে প্রচার করি। যেহেতু Shardy এখন StableHLO-এর উপর নির্ভর করে, তাই এটি প্রতিটি stablehlo op-এর জন্য শার্ডিং নিয়ম সংজ্ঞায়িত করে। উপরন্তু, Shardy ShardingRuleOpInterface প্রদান করে যা উপভাষা মালিকরা তাদের ক্রিয়াকলাপগুলিতে তাদের নিজস্ব ক্রিয়াকলাপের জন্য শার্ডিং নিয়মগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারে। যতক্ষণ পর্যন্ত একটি অপারেশন এই ইন্টারফেস প্রয়োগ করে, Shardy এটির মাধ্যমে প্রচার করতে সক্ষম হবে।

def ShardingRuleOpInterface : OpInterface<"ShardingRuleOpInterface"> {
  let methods = [
    InterfaceMethod<
      /*desc=*/[{
        Returns the sharding rule of the op.
      }],
      /*retType=*/"mlir::sdy::OpShardingRuleAttr",
      /*methodName=*/"getShardingRule"
    >,
  ];
}

ডেটা প্রবাহ অপস

কিছু অপ্স, যেমন, অঞ্চল-ভিত্তিক অপ্স, একটি ভিন্ন পদ্ধতির প্রয়োজন যেখানে শার্ডিং নিয়ম, যা শুধুমাত্র সমস্ত অপারেন্ড এবং ফলাফল জুড়ে মাত্রার মধ্যে সঙ্গতি বর্ণনা করে, যথেষ্ট নয়। এই ক্ষেত্রে, Shardy একটি ShardableDataFlowOpInterface সংজ্ঞায়িত করে যাতে উপভাষা মালিকরা তাদের অপারেশনের মাধ্যমে শার্ডিংয়ের প্রচার বর্ণনা করতে পারে। এই ইন্টারফেসটি তাদের মালিকের মাধ্যমে প্রতিটি ডেটা প্রবাহ প্রান্তের উত্স এবং লক্ষ্যগুলি পেতে এবং প্রান্তের মালিকদের শার্ডিংগুলি পেতে এবং সেট করার পদ্ধতিগুলি সরবরাহ করে৷

def ShardableDataFlowOpInterface :
    OpInterface<"ShardableDataFlowOpInterface"> {
  (get|set)BlockArgumentEdgeOwnerShardings;
  (get|set)OpResultEdgeOwnerShardings;
  getBlockArgumentEdgeOwners;
  getOpResultEdgeOwners;
  getEdgeSources;
  // ...
}

আমরা কীভাবে ডেটা ফ্লো অপারেশনগুলি পরিচালনা করি তার একটি উচ্চ-স্তরের ওভারভিউয়ের জন্য ডেটা ফ্লো অপ্সগুলিও দেখুন৷

ইন্টারফেস এখনও বাস্তবায়িত হয়নি

ভবিষ্যতে, শার্ডিকে আরও নমনীয় এবং উপভাষা-অজ্ঞেয়বাদী করতে আরও ইন্টারফেস এবং বৈশিষ্ট্য যুক্ত করা হবে। আমরা নীচে তাদের তালিকা.

অবিরাম বিভাজন

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

উদাহরণস্বরূপ, নীচের চিত্রে, যদি add শার্ড করা হয় তবে এটি কীভাবে divide এবং subtract (গণনার বিভিন্ন অংশে) শার্ড করা হয় তা প্রভাবিত করবে না।

ধ্রুবক বিভাজন

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

এটি অর্জন করতে, Shardy ব্যবহারকারীদের সংজ্ঞায়িত করতে হবে: - A your_dialect.constant -> sdy.constant পাস; - একটি sdy::ConstantLike বৈশিষ্ট্য, যেমন iota ; - একটি mlir::Elementwise বৈশিষ্ট্য যেমন add এবং multiply ; - একটি sdy::ConstantFoldable স্লাইস / ব্রডকাস্টের মতো অপ্সের জন্য কনস্ট্যান্ট ফোল্ডেবল। এই অপ্সগুলি কম্পাইলের সময় টেকনিক্যালি গণনা করা যেতে পারে, যদি তাদের সমস্ত অপারেন্ড/ফলাফল স্থির হয়।

অপ অগ্রাধিকার

GSPMD-এ, উপাদান-ভিত্তিক অপ্সগুলি প্রথমে প্রচার করা হয়, তারপরে matmul মতো অপ্সগুলি প্রচার করা হয়। শার্ডিতে, আমরা ব্যবহারকারীদের তাদের নিজস্ব অগ্রাধিকার সেট করার অনুমতি দিতে চাই কারণ আমরা তাদের উপভাষাগুলিকে অগ্রাধিকার দিয়ে জানি না৷ সেই হিসেবে, আমরা তাদেরকে শার্ডি যে ক্রমানুসারে তাদের প্রচার করতে চান সেই ক্রমে অপারেশনের একটি তালিকা পাস করতে বলব।

নিচের চিত্রটি দেখায় কিভাবে সঠিক ক্রমে অপস প্রচার করতে জিএসপিএমডিতে অগ্রাধিকার ব্যবহার করা হয়।

অপ অগ্রাধিকার. কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা জানতে GSPMD কাগজ দেখুন

কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা নিয়ে আলোচনার জন্য GSPMD কাগজটি দেখুন।

উপভাষা-অজ্ঞেয়বাদী হওয়া

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

,

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

ভাগ করার নিয়ম

একটি শার্ডিং নিয়ম এনকোড করে যে আমরা একটি অপারেশনের মাধ্যমে কীভাবে প্রচার করি। যেহেতু Shardy এখন StableHLO-এর উপর নির্ভর করে, তাই এটি প্রতিটি stablehlo op-এর জন্য শার্ডিং নিয়ম সংজ্ঞায়িত করে। উপরন্তু, Shardy ShardingRuleOpInterface প্রদান করে যা উপভাষা মালিকরা তাদের ক্রিয়াকলাপগুলিতে তাদের নিজস্ব ক্রিয়াকলাপের জন্য শার্ডিং নিয়মগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারে। যতক্ষণ পর্যন্ত একটি অপারেশন এই ইন্টারফেস প্রয়োগ করে, Shardy এটির মাধ্যমে প্রচার করতে সক্ষম হবে।

def ShardingRuleOpInterface : OpInterface<"ShardingRuleOpInterface"> {
  let methods = [
    InterfaceMethod<
      /*desc=*/[{
        Returns the sharding rule of the op.
      }],
      /*retType=*/"mlir::sdy::OpShardingRuleAttr",
      /*methodName=*/"getShardingRule"
    >,
  ];
}

ডেটা প্রবাহ অপস

কিছু অপ্স, যেমন, অঞ্চল-ভিত্তিক অপ্স, একটি ভিন্ন পদ্ধতির প্রয়োজন যেখানে শার্ডিং নিয়ম, যা শুধুমাত্র সমস্ত অপারেন্ড এবং ফলাফল জুড়ে মাত্রার মধ্যে সঙ্গতি বর্ণনা করে, যথেষ্ট নয়। এই ক্ষেত্রে, Shardy একটি ShardableDataFlowOpInterface সংজ্ঞায়িত করে যাতে উপভাষা মালিকরা তাদের অপারেশনের মাধ্যমে শার্ডিংয়ের প্রচার বর্ণনা করতে পারে। এই ইন্টারফেসটি তাদের মালিকের মাধ্যমে প্রতিটি ডেটা প্রবাহ প্রান্তের উত্স এবং লক্ষ্যগুলি পেতে এবং প্রান্তের মালিকদের শার্ডিংগুলি পেতে এবং সেট করার পদ্ধতিগুলি সরবরাহ করে৷

def ShardableDataFlowOpInterface :
    OpInterface<"ShardableDataFlowOpInterface"> {
  (get|set)BlockArgumentEdgeOwnerShardings;
  (get|set)OpResultEdgeOwnerShardings;
  getBlockArgumentEdgeOwners;
  getOpResultEdgeOwners;
  getEdgeSources;
  // ...
}

আমরা কীভাবে ডেটা ফ্লো অপারেশনগুলি পরিচালনা করি তার একটি উচ্চ-স্তরের ওভারভিউয়ের জন্য ডেটা ফ্লো অপ্সগুলিও দেখুন৷

ইন্টারফেস এখনও বাস্তবায়িত হয়নি

ভবিষ্যতে, শার্ডিকে আরও নমনীয় এবং উপভাষা-অজ্ঞেয়বাদী করতে আরও ইন্টারফেস এবং বৈশিষ্ট্য যুক্ত করা হবে। আমরা নীচে তাদের তালিকা.

অবিরাম বিভাজন

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

উদাহরণস্বরূপ, নীচের চিত্রে, যদি add শার্ড করা হয় তবে এটি কীভাবে divide এবং subtract (গণনার বিভিন্ন অংশে) শার্ড করা হয় তা প্রভাবিত করবে না।

ধ্রুবক বিভাজন

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

এটি অর্জন করতে, Shardy ব্যবহারকারীদের সংজ্ঞায়িত করতে হবে: - A your_dialect.constant -> sdy.constant পাস; - একটি sdy::ConstantLike বৈশিষ্ট্য, যেমন iota ; - একটি mlir::Elementwise বৈশিষ্ট্য যেমন add এবং multiply ; - একটি sdy::ConstantFoldable স্লাইস / ব্রডকাস্টের মতো অপ্সের জন্য কনস্ট্যান্ট ফোল্ডেবল। এই অপ্সগুলি কম্পাইলের সময় টেকনিক্যালি গণনা করা যেতে পারে, যদি তাদের সমস্ত অপারেন্ড/ফলাফল স্থির হয়।

অপ অগ্রাধিকার

GSPMD-এ, উপাদান-ভিত্তিক অপ্সগুলি প্রথমে প্রচার করা হয়, তারপরে matmul মতো অপ্সগুলি প্রচার করা হয়। শার্ডিতে, আমরা ব্যবহারকারীদের তাদের নিজস্ব অগ্রাধিকার সেট করার অনুমতি দিতে চাই কারণ আমরা তাদের উপভাষাগুলিকে অগ্রাধিকার দিয়ে জানি না৷ সেই হিসেবে, আমরা তাদেরকে শার্ডি যে ক্রমানুসারে তাদের প্রচার করতে চান সেই ক্রমে অপারেশনের একটি তালিকা পাস করতে বলব।

নিচের চিত্রটি দেখায় কিভাবে GSPMD-এ অগ্রাধিকারগুলি সঠিক ক্রমে অপস প্রচারের জন্য ব্যবহার করা হয়।

অপ অগ্রাধিকার. কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা জানতে GSPMD কাগজ দেখুন

কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা নিয়ে আলোচনার জন্য GSPMD কাগজটি দেখুন।

উপভাষা-অজ্ঞেয়বাদী হওয়া

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

,

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

ভাগ করার নিয়ম

একটি শার্ডিং নিয়ম এনকোড করে যে আমরা একটি অপারেশনের মাধ্যমে কীভাবে প্রচার করি। যেহেতু Shardy এখন StableHLO-এর উপর নির্ভর করে, তাই এটি প্রতিটি stablehlo op-এর জন্য শার্ডিং নিয়ম সংজ্ঞায়িত করে। উপরন্তু, Shardy ShardingRuleOpInterface প্রদান করে যা উপভাষা মালিকরা তাদের ক্রিয়াকলাপগুলিতে তাদের নিজস্ব ক্রিয়াকলাপের জন্য শার্ডিং নিয়মগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারে। যতক্ষণ পর্যন্ত একটি অপারেশন এই ইন্টারফেস প্রয়োগ করে, Shardy এটির মাধ্যমে প্রচার করতে সক্ষম হবে।

def ShardingRuleOpInterface : OpInterface<"ShardingRuleOpInterface"> {
  let methods = [
    InterfaceMethod<
      /*desc=*/[{
        Returns the sharding rule of the op.
      }],
      /*retType=*/"mlir::sdy::OpShardingRuleAttr",
      /*methodName=*/"getShardingRule"
    >,
  ];
}

ডেটা প্রবাহ অপস

কিছু অপ্স, যেমন, অঞ্চল-ভিত্তিক অপ্স, একটি ভিন্ন পদ্ধতির প্রয়োজন যেখানে শার্ডিং নিয়ম, যা শুধুমাত্র সমস্ত অপারেন্ড এবং ফলাফল জুড়ে মাত্রার মধ্যে সঙ্গতি বর্ণনা করে, যথেষ্ট নয়। এই ক্ষেত্রে, Shardy একটি ShardableDataFlowOpInterface সংজ্ঞায়িত করে যাতে উপভাষা মালিকরা তাদের অপারেশনের মাধ্যমে শার্ডিংয়ের প্রচার বর্ণনা করতে পারে। এই ইন্টারফেসটি তাদের মালিকের মাধ্যমে প্রতিটি ডেটা প্রবাহ প্রান্তের উত্স এবং লক্ষ্যগুলি পেতে এবং প্রান্তের মালিকদের শার্ডিংগুলি পেতে এবং সেট করার পদ্ধতিগুলি সরবরাহ করে৷

def ShardableDataFlowOpInterface :
    OpInterface<"ShardableDataFlowOpInterface"> {
  (get|set)BlockArgumentEdgeOwnerShardings;
  (get|set)OpResultEdgeOwnerShardings;
  getBlockArgumentEdgeOwners;
  getOpResultEdgeOwners;
  getEdgeSources;
  // ...
}

আমরা কীভাবে ডেটা ফ্লো অপারেশনগুলি পরিচালনা করি তার একটি উচ্চ-স্তরের ওভারভিউয়ের জন্য ডেটা ফ্লো অপ্সগুলিও দেখুন৷

ইন্টারফেস এখনও বাস্তবায়িত হয়নি

ভবিষ্যতে, শার্ডিকে আরও নমনীয় এবং উপভাষা-অজ্ঞেয়বাদী করতে আরও ইন্টারফেস এবং বৈশিষ্ট্য যুক্ত করা হবে। আমরা নীচে তাদের তালিকা.

ক্রমাগত বিভাজন

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

উদাহরণস্বরূপ, নীচের চিত্রে, যদি add শার্ড করা হয় তবে এটি কীভাবে divide এবং subtract (গণনার বিভিন্ন অংশে) শার্ড করা হয় তা প্রভাবিত করবে না।

ধ্রুবক বিভাজন

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

এটি অর্জন করতে, Shardy ব্যবহারকারীদের সংজ্ঞায়িত করতে হবে: - A your_dialect.constant -> sdy.constant পাস; - একটি sdy::ConstantLike বৈশিষ্ট্য, যেমন iota ; - একটি mlir::Elementwise বৈশিষ্ট্য যেমন add এবং multiply ; - একটি sdy::ConstantFoldable স্লাইস / ব্রডকাস্টের মতো অপ্সের জন্য কনস্ট্যান্ট ফোল্ডেবল। এই অপ্সগুলি কম্পাইলের সময় টেকনিক্যালি গণনা করা যেতে পারে, যদি তাদের সমস্ত অপারেন্ড/ফলাফল স্থির হয়।

অপ অগ্রাধিকার

GSPMD-এ, উপাদান-ভিত্তিক অপ্সগুলি প্রথমে প্রচার করা হয়, তারপরে matmul মতো অপ্সগুলি প্রচার করা হয়। শার্ডিতে, আমরা ব্যবহারকারীদের তাদের নিজস্ব অগ্রাধিকার সেট করার অনুমতি দিতে চাই কারণ আমরা তাদের উপভাষাগুলিকে অগ্রাধিকার দিয়ে জানি না৷ সেই হিসেবে, আমরা তাদেরকে শার্ডি যে ক্রমানুসারে তাদের প্রচার করতে চান সেই ক্রমে অপারেশনের একটি তালিকা পাস করতে বলব।

নিচের চিত্রটি দেখায় কিভাবে GSPMD-এ অগ্রাধিকারগুলি সঠিক ক্রমে অপস প্রচারের জন্য ব্যবহার করা হয়।

অপের অগ্রাধিকার. কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা জানতে GSPMD কাগজ দেখুন

কেন অপ অগ্রাধিকারগুলি গুরুত্বপূর্ণ তা নিয়ে আলোচনার জন্য GSPMD কাগজটি দেখুন।

উপভাষা-অজ্ঞেয়বাদী হওয়া

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