LiteRT operatör sürümleri

Bu dokümanda, LiteRT'in işlem sürümü şeması açıklanmaktadır. İşletim sistemi sürümü oluşturma Geliştiricilerin mevcut işlemlere yeni işlevler ve parametreler eklemesini sağlar. Ayrıca aşağıdakileri de garanti eder:

  • Geriye dönük uyumluluk: Yeni LiteRT uygulaması, eski model dosyanız olabilir.
  • İleriye dönük uyumluluk: Eski LiteRT uygulaması, dönüştürücünün yeni sürümü tarafından üretilen yeni model dosyası (yeni model dosyası, nasıl kullanıldığını anlatacağım.
  • Uyumsuzluk algılamasını yönlendir: Eski bir LiteRT uygulaması söz konusuysa bir işletim sisteminin yeni sürümünü içeren yeni bir model okursa destekleniyorsa hatayı bildirecektir.

Örnek: Derinlikli konvolüsyona genişletme ekleme

Bu belgenin geri kalanında, TFLite'ta işlem sürümü oluşturma işleminin nasıl genişletme parametreleri ekleyin.

Bu belgeyi anlamak için genişleme hakkında bilgi sahibi olmak gerekmez. Unutmayın:

  • 2 yeni tam sayı parametresi eklenecek: dilation_width_factor ve dilation_height_factor.
  • Genişletmeyi desteklemeyen eski derinlik konvolüsyon çekirdekleri eşdeğerdir 1'e ayarlamaktır.

FlatBuffer şemasını değiştirme

Bir işleme yeni parametreler eklemek için lite/schema/schema.fbs

Örneğin, derinlikli kıvrım seçenekleri tablosu aşağıdaki gibi görünür:

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

Yeni parametreler eklerken:

  • Hangi parametrelerin hangi sürümde desteklendiğini belirten yorumlar ekleyin.
  • Yeni uygulama, yeni eklenen için varsayılan değerleri aldığında parametrelerinden sonra, eski uygulama ile tam olarak aynı şekilde çalışmalıdır.

Yeni parametreler eklendikten sonra tablo aşağıdaki gibi olacaktır:

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 dosyası, yeni şema.

C yapılarını ve çekirdek uygulamasını değiştirme

LiteRT'te, çekirdek uygulaması FlatBuffer'dan ayrıştırılır. belirler. Çekirdekler parametreyi lite/c/builtin_op_data.h

Orijinal derinlikli konvolüsyon parametresi aşağıdaki gibidir:

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

FlatBuffer şemasında olduğu gibi, hangi parametrelerin desteklenir. Sonuç aşağıda gösterilmiştir:

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;

Yeni eklenen parametreleri okumak için lütfen çekirdek uygulamasını da değiştirin. C yapılarından farklıdır. Ayrıntılar burada atlanmıştır.

FlatBuffer okuma kodunu değiştirme

FlatBuffer okuma ve C yapısını oluşturma mantığı şu şekilde: lite/core/api/flatbuffer_conversions.cc

Dosyayı, aşağıda gösterildiği gibi yeni parametreleri işleyecek şekilde güncelleyin:

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;
}

İşletim sistemi sürümünü buradan kontrol etmeniz gerekmez. Yeni uygulama genişletme faktörlerinin eksik olduğu eski bir model dosyasını okuması durumunda yeni çekirdek, eski çekirdekle tutarlı şekilde çalışacaktır.

Çekirdek kaydını değiştirme

MutableOpresolver (lite/mutable_op_resolver.h içinde tanımlanmıştır) işlevlerini kullanarak işlem çekirdeklerini kaydedin. Minimum ve maksimum sürümler varsayılan:

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);

Yerleşik işlemler lite/kernels/register.cc bölgesinde kayıtlıdır. Bu örnekte DepthwiseConv2D sürüm 1 ve sonraki sürümleri işleyebilen yeni bir işlem çekirdeği 2. Satırı değiştirmemiz gerekir:

AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, Register_DEPTHWISE_CONV_2D());

karşılaştırma yapılacak öğe:

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

TFLite işlem sürümünü değiştirme

Bir sonraki adım, operasyonu yürütme Bu örnekte ne anlama gelir?

  • Genişletme faktörlerinin tümü 1 olduğunda sürüm=1'i doldurun.
  • Aksi takdirde sürüm=2 değerini doldurun.

Şuradaki operatör için GetBuiltinOperatorVersion işlevini değiştirin: lite/tools/versioning/op_version.cc DepthwiseConv2D:

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;

Operatör sürümü haritasını güncelleyin

Son adım, yeni sürüm bilgisini operatör sürümü eşlemesine eklemektir. Bu adım gereklidir çünkü modelin gereken minimum çalışma zamanı sürümünü gösterir.

Bunu yapmak için, şuraya yeni bir harita girişi eklemeniz gerekir: lite/tools/versioning/runtime_version.cc

Bu örnekte, aşağıdaki girişi op_version_map alanına eklemeniz gerekir:

{ {BuiltinOperator_DEPTHWISE_CONV_2D, 2}, %CURRENT_RUNTIME_VERSION%}

burada %CURRENT_RUNTIME_VERSION%, mevcut çalışma zamanı sürümüne karşılık gelir tensorflow/core/public/version.h içinde tanımlanmıştır.

Yetki uygulaması

LiteRT, kullanıcılara işlem ataması yapılmasını sağlayan bir Delegasyon API'si sunar. donanım arka uçları. Yetki verilen kullanıcının Prepare işlevinde, sürümün her düğüm için desteklenir.

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.
}

Bu, yetki yalnızca sürüm 1 işlemlerini desteklese bile gereklidir. Dolayısıyla yetkilendirme, daha yüksek bir sürüm işlemi alınırken uyumsuzluğu tespit edebilir.