LiteRT অপারেটর সংস্করণ

এই ডকুমেন্টটি LiterT এর অপ ভার্সনিং স্কিমা বর্ণনা করে। অপ ভার্সনিং ডেভেলপারদের বিদ্যমান অপসগুলিতে নতুন কার্যকারিতা এবং পরামিতি যুক্ত করতে সক্ষম করে। এছাড়াও, এটি নিম্নলিখিতগুলি নিশ্চিত করে:

  • পিছনের সামঞ্জস্য: নতুন LiterRT বাস্তবায়নে একটি পুরানো মডেলের ফাইল পরিচালনা করা উচিত।
  • ফরোয়ার্ড সামঞ্জস্যতা: পুরাতন LiterRT বাস্তবায়নে কনভার্টারের নতুন সংস্করণ দ্বারা উত্পাদিত একটি নতুন মডেল ফাইল পরিচালনা করা উচিত, যতক্ষণ না কোনও নতুন বৈশিষ্ট্য ব্যবহার করা হয়।
  • ফরোয়ার্ড ইন-কম্প্যাটিবিলিটি ডিটেকশন: যদি একটি পুরানো LiterRT বাস্তবায়ন এমন একটি নতুন মডেল পড়ে যার মধ্যে একটি op এর নতুন সংস্করণ রয়েছে যা সমর্থিত নয়, তাহলে এটি ত্রুটিটি রিপোর্ট করবে।

উদাহরণ: গভীরতার দিক দিয়ে কনভোলিউশনে প্রসারণ যোগ করা

এই নথির বাকি অংশে TFLite-এ op ভার্সনিং ব্যাখ্যা করা হয়েছে, যেখানে দেখানো হয়েছে কিভাবে depthwise convolution অপারেশনে dilation প্যারামিটার যোগ করতে হয়।

এই নথিটি বোঝার জন্য প্রসারণ সম্পর্কে জ্ঞান থাকা আবশ্যক নয়। মনে রাখবেন যে:

  • ২টি নতুন পূর্ণসংখ্যা প্যারামিটার যোগ করা হবে: dilation_width_factor এবং dilation_height_factor
  • পুরাতন গভীরতার দিক দিয়ে কনভোলিউশন কার্নেল যা প্রসারণ সমর্থন করে না, তা প্রসারণ গুণনীয়কগুলিকে 1 এ সেট করার সমতুল্য।

FlatBuffer স্কিমা পরিবর্তন করুন

একটি অপশনে নতুন প্যারামিটার যোগ করতে, lite/schema/schema.fbs এ অপশন টেবিলটি পরিবর্তন করুন।

উদাহরণস্বরূপ, depthwise convolution এর অপশন টেবিলটি এরকম দেখাচ্ছে:

table DepthwiseConv2DOptions {
  padding:Padding;
  stride_w:int;
  stride_h:int;
  depth_multiplier:int;
  fused_activation_function:ActivationFunctionType;
}

নতুন প্যারামিটার যোগ করার সময়:

  • কোন সংস্করণ কোন প্যারামিটারগুলি সমর্থিত তা নির্দেশ করে মন্তব্য যোগ করুন।
  • যখন নতুন বাস্তবায়ন নতুন যোগ করা প্যারামিটারের জন্য ডিফল্ট মান পায়, তখন এটি পুরাতন বাস্তবায়নের মতোই কাজ করবে।

নতুন প্যারামিটার যোগ করার পর টেবিলটি এরকম হবে:

table DepthwiseConv2DOptions {
  // Parameters for DepthwiseConv version 1 or above.
  padding:Padding;
  stride_w:int;
  stride_h:int;
  depth_multiplier:int;
  fused_activation_function:ActivationFunctionType;
  // Parameters for DepthwiseConv version 2 or above.
  dilation_w_factor:int = 1;
  dilation_h_factor:int = 1;
}

নতুন স্কিমার জন্য lite/schema/schema_generated.h ফাইলটি পুনরায় তৈরি করা উচিত।

সি স্ট্রাকচার এবং কার্নেল বাস্তবায়ন পরিবর্তন করুন

LiterRT-তে, কার্নেল বাস্তবায়ন FlatBuffer সংজ্ঞা থেকে আলাদা করা হয়। কার্নেলগুলি lite/c/builtin_op_data.h এ সংজ্ঞায়িত C কাঠামো থেকে প্যারামিটারটি পড়ে।

মূল গভীরতা অনুসারে কনভোলিউশন প্যারামিটারটি নিম্নরূপ:

typedef struct {
  TfLitePadding padding;
  int stride_width;
  int stride_height;
  int depth_multiplier;
  TfLiteFusedActivation activation;
} TfLiteDepthwiseConvParams;

FlatBuffer স্কিমার মতো, কোন সংস্করণ থেকে কোন প্যারামিটারগুলি সমর্থিত তা নির্দেশ করে মন্তব্য যোগ করুন। ফলাফলটি নীচে দেখা যাচ্ছে:

typedef struct {
  // Parameters for DepthwiseConv version 1 or above.
  TfLitePadding padding;
  int stride_width;
  int stride_height;
  int depth_multiplier;
  TfLiteFusedActivation activation;
  // Parameters for DepthwiseConv version 2 or above.
  int dilation_width_factor;
  int dilation_height_factor;
} TfLiteDepthwiseConvParams;

C স্ট্রাকচার থেকে নতুন যোগ করা প্যারামিটারগুলি পড়ার জন্য দয়া করে কার্নেল বাস্তবায়নও পরিবর্তন করুন। এখানে বিস্তারিত বাদ দেওয়া হয়েছে।

FlatBuffer রিডিং কোড পরিবর্তন করুন

FlatBuffer পড়ার এবং C স্ট্রাকচার তৈরি করার যুক্তি হল lite/core/api/flatbuffer_conversions.cc

নতুন প্যারামিটারগুলি পরিচালনা করার জন্য ফাইলটি আপডেট করুন, যেমনটি নীচে দেখানো হয়েছে:

TfLiteStatus ParseDepthwiseConv2D(const Operator* op,
                                  ErrorReporter* error_reporter,
                                  BuiltinDataAllocator* allocator,
                                  void** builtin_data) {
  CheckParsePointerParams(op, error_reporter, allocator, builtin_data);

  SafeBuiltinDataAllocator safe_allocator(allocator);

  std::unique_ptr<TfLiteDepthwiseConvParams,
                  SafeBuiltinDataAllocator::BuiltinDataDeleter>
      params = safe_allocator.Allocate<TfLiteDepthwiseConvParams>();
  TF_LITE_ENSURE(error_reporter, params != nullptr);

  const DepthwiseConv2DOptions* schema_params =
      op->builtin_options_as_DepthwiseConv2DOptions();

  if (schema_params != nullptr) {
    params->padding = ConvertPadding(schema_params->padding());
    params->stride_width = schema_params->stride_w();
    params->stride_height = schema_params->stride_h();
    params->depth_multiplier = schema_params->depth_multiplier();
    params->activation =
        ConvertActivation(schema_params->fused_activation_function());

    params->dilation_width_factor = schema_params->dilation_w_factor();
    params->dilation_height_factor = schema_params->dilation_h_factor();
  }

  *builtin_data = params.release();
  return kTfLiteOk;
}

এখানে op সংস্করণটি পরীক্ষা করার প্রয়োজন নেই। যখন নতুন বাস্তবায়ন একটি পুরানো মডেল ফাইল পড়ে যেখানে প্রসারণ ফ্যাক্টর অনুপস্থিত, তখন এটি ডিফল্ট মান হিসাবে 1 ব্যবহার করবে এবং নতুন কার্নেলটি পুরানো কার্নেলের সাথে সামঞ্জস্যপূর্ণভাবে কাজ করবে।

কার্নেল নিবন্ধন পরিবর্তন করুন

MutableOpResolver ( lite/mutable_op_resolver.h তে সংজ্ঞায়িত) অপ কার্নেল নিবন্ধনের জন্য কয়েকটি ফাংশন প্রদান করে। ডিফল্টরূপে সর্বনিম্ন এবং সর্বোচ্চ সংস্করণ 1:

void AddBuiltin(tflite::BuiltinOperator op, TfLiteRegistration* registration,
                int min_version = 1, int max_version = 1);
void AddCustom(const char* name, TfLiteRegistration* registration,
               int min_version = 1, int max_version = 1);

বিল্ট-ইন অপশনগুলি lite/kernels/register.cc তে নিবন্ধিত। এই উদাহরণে, আমরা একটি নতুন অপশন কার্নেল বাস্তবায়ন করেছি যা DepthwiseConv2D সংস্করণ 1 এবং 2 পরিচালনা করতে পারে, তাই আমাদের এই লাইনটি পরিবর্তন করতে হবে:

AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, Register_DEPTHWISE_CONV_2D());

থেকে:

AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, Register_DEPTHWISE_CONV_2D(),
             /* min_version = */ 1,
             /* max_version = */ 2);

TFLite অপশন ভার্সন পরিবর্তন করুন

পরবর্তী ধাপ হল TFLite কে op চালানোর জন্য প্রয়োজনীয় সর্বনিম্ন সংস্করণটি পূরণ করা। এই উদাহরণে, এর অর্থ হল:

  • যখন প্রসারণ গুণনীয়কগুলি সমস্ত 1 হয় তখন সংস্করণ=1 পপুলেট করুন।
  • অন্যথায় সংস্করণ=2 পূরণ করুন।

DepthwiseConv2D এর ক্ষেত্রে নতুন সংস্করণ যোগ করে lite/tools/versioning/op_version.cc এ অপারেটরের জন্য GetBuiltinOperatorVersion ফাংশনটি পরিবর্তন করুন:

case BuiltinOperator_DEPTHWISE_CONV_2D:
  auto depthwise_conv_params =
      reinterpret_cast<TfLiteDepthwiseConvParams*>(op_sig.builtin_data);
  TFLITE_DCHECK(depthwise_conv_params != nullptr);
  if (depthwise_conv_params->dilation_width_factor != 1 ||
       depthwise_conv_params->dilation_height_factor != 1) {
    return 2;
  }
  return 1;

অপারেটর সংস্করণ মানচিত্র আপডেট করুন

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

এটি করার জন্য, আপনাকে lite/tools/versioning/runtime_version.cc এ একটি নতুন মানচিত্র এন্ট্রি যুক্ত করতে হবে।

এই উদাহরণে, আপনাকে op_version_map এ নিম্নলিখিত এন্ট্রি যোগ করতে হবে:

{ {BuiltinOperator_DEPTHWISE_CONV_2D, 2}, %CURRENT_RUNTIME_VERSION%}

যেখানে %CURRENT_RUNTIME_VERSION% release_version.h এ সংজ্ঞায়িত বর্তমান রানটাইম সংস্করণের সাথে মিলে যায়।

প্রতিনিধিত্ব বাস্তবায়ন

LiterRT একটি ডেলিগেশান API প্রদান করে যা হার্ডওয়্যার ব্যাকএন্ডে অপস ডেলিগেটিং সক্ষম করে। ডেলিগেশানের Prepare ফাংশনে, ডেলিগেশান কোডের প্রতিটি নোডের জন্য সংস্করণটি সমর্থিত কিনা তা পরীক্ষা করুন।

const int kMaxVersion = 1;
TfLiteNode* node;
TfLiteRegistration* registration = nullptr;
TF_LITE_ENSURE_STATUS(context->GetNodeAndRegistration(context, node_index, &node, &registration));

if (registration->version > kMaxVersion) {
  // Reject the node if the version isn't supported.
}

ডেলিগেশন শুধুমাত্র ভার্সন ১ অপশন সমর্থন করলেও এটি প্রয়োজন, যাতে ডেলিগেশন উচ্চতর ভার্সন অপশন পাওয়ার সময় অসঙ্গতি সনাক্ত করতে পারে।