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

এই নথিটি LiteRT-এর অপ সংস্করণ স্কিমা বর্ণনা করে। অপ সংস্করণ ডেভেলপারদের বিদ্যমান অপারেশনগুলিতে নতুন কার্যকারিতা এবং পরামিতি যোগ করতে সক্ষম করে। উপরন্তু, এটি নিম্নলিখিত গ্যারান্টি দেয়:

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

উদাহরন: গভীরতার দিক থেকে আবর্তনের মধ্যে প্রসারণ যোগ করা

এই নথির বাকি অংশটি TFLite-এ অপ সংস্করণ ব্যাখ্যা করে কিভাবে গভীরতার দিক থেকে কনভোলিউশন অপারেশনে প্রসারণ পরামিতি যোগ করতে হয়।

এই নথিটি বোঝার জন্য প্রসারণের জ্ঞানের প্রয়োজন নেই। উল্লেখ্য যে:

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

ফ্ল্যাটবাফার স্কিমা পরিবর্তন করুন

অপশনে নতুন প্যারামিটার যোগ করতে, 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 নতুন স্কিমার জন্য পুনরায় তৈরি করা উচিত।

C কাঠামো এবং কার্নেল বাস্তবায়ন পরিবর্তন করুন

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

মূল depthwise convolution প্যারামিটারটি নিম্নরূপ:

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;

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

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

ফ্ল্যাটবাফার পড়ার এবং সি স্ট্রাকচার তৈরি করার যুক্তি হল 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;
}

এখানে অপ সংস্করণ চেক করার প্রয়োজন নেই। যখন নতুন বাস্তবায়ন একটি পুরানো মডেল ফাইল পড়ে যেখানে প্রসারণ কারণগুলি অনুপস্থিত থাকে, এটি ডিফল্ট মান হিসাবে 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 op সংস্করণ পরিবর্তন করুন

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

  • পপুলেট ভার্সন=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% tensorflow/core/public/version.h- এ সংজ্ঞায়িত বর্তমান রানটাইম সংস্করণের সাথে মিলে যায়।

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

LiteRT একটি প্রতিনিধি 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.
}

প্রতিনিধি দল শুধুমাত্র সংস্করণ 1 অপ্স সমর্থন করলেও এটি প্রয়োজনীয়, তাই উচ্চতর সংস্করণ অপস পাওয়ার সময় প্রতিনিধি দল অসঙ্গতি সনাক্ত করতে পারে।