TensorFlow Lite operatör versiyonları

Bu belge TensorFlow Lite'ın işlem sürümü oluşturma şemasını açıklamaktadır. Operasyon sürümü oluşturma, geliştiricilerin mevcut operasyonlara yeni işlevler ve parametreler eklemesine olanak tanır. Ayrıca aşağıdakileri de garanti eder:

  • Geriye dönük uyumluluk: Yeni TensorFlow Lite uygulaması eski bir model dosyasını işlemelidir.
  • İleriye dönük uyumluluk: Eski TensorFlow Lite uygulaması, yeni özellikler kullanılmadığı sürece dönüştürücünün yeni sürümü tarafından üretilen yeni bir model dosyasını işlemelidir.
  • İleriye yönelik uyumsuzluk tespiti: Eski bir TensorFlow Lite uygulaması, desteklenmeyen bir operasyonun yeni bir sürümünü içeren yeni bir model okursa hatayı bildirmelidir.

Örnek: Derinlemesine evrişime genişleme ekleme

Bu belgenin geri kalanı, derinlemesine evrişim işlemine genişletme parametrelerinin nasıl ekleneceğini göstererek TFLite'daki işlem sürümlendirmeyi açıklamaktadır.

Bu belgeyi anlamak için dilatasyon bilgisine gerek yoktur. Dikkat:

  • 2 yeni tam sayı parametresi eklenecektir: dilation_width_factor ve dilation_height_factor .
  • Genişlemeyi desteklemeyen eski derinlemesine evrişim çekirdekleri, genişleme faktörlerini 1'e ayarlamaya eşdeğerdir.

FlatBuffer şemasını değiştir

Bir operasyona yeni parametreler eklemek için lite/schema/schema.fbs dosyasındaki seçenekler tablosunu değiştirin.

Örneğin, derinlemesine evrişimin seçenekler tablosu şuna benzer:

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üm tarafından desteklendiğini belirten yorumlar ekleyin.
  • Yeni uygulama, yeni eklenen parametreler için varsayılan değerleri aldığında, eski uygulamayla tamamen aynı şekilde çalışmalıdır.

Yeni parametreler eklendikten sonra tablo şu şekilde 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;
}

Yeni şema için lite/schema/schema_generated.h dosyası yeniden oluşturulmalıdır.

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

TensorFlow Lite'ta çekirdek uygulaması FlatBuffer tanımından ayrılmıştır. Çekirdekler parametreyi lite/c/builtin_op_data.h dosyasında tanımlanan C yapılarından okur.

Orijinal derinlemesine evrişim 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 versiyondan itibaren hangi parametrelerin desteklendiğini belirten yorumlar ekleyin. Sonuç aşağıda görülmektedir:

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;

Lütfen ayrıca C yapılarından yeni eklenen parametreleri okumak için çekirdek uygulamasını da değiştirin. Ayrıntılar burada atlanmıştır.

FlatBuffer okuma kodunu değiştirin

FlatBuffer'ı okuma ve C yapısını üretme mantığı lite/core/api/flatbuffer_conversions.cc dosyasındadır.

Yeni parametreleri işlemek için dosyayı aşağıda gösterildiği gibi 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;
}

Burada op sürümünü kontrol etmenize gerek yoktur. Yeni uygulama, genişleme faktörlerinin eksik olduğu eski bir model dosyasını okuduğunda, varsayılan değer olarak 1'i kullanacak ve yeni çekirdek, eski çekirdekle tutarlı bir şekilde çalışacaktır.

Çekirdek kaydını değiştir

MutableOpResolver ( lite/mutable_op_resolver.h tanımlanmıştır) op çekirdeklerini kaydetmek için birkaç işlev sağlar. Minimum ve maksimum sürüm varsayılan olarak 1'dir:

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 dosyasında kayıtlıdır. Bu örnekte, DepthwiseConv2D sürüm 1 ve 2'yi işleyebilecek yeni bir op çekirdeği uyguladık, dolayısıyla bu satırı değiştirmemiz gerekiyor:

AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, Register_DEPTHWISE_CONV_2D());

ile:

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

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

Bir sonraki adım, TFLite'ın operasyonu yürütmek için gereken minimum sürümü doldurmasını sağlamaktır. Bu örnekte şu anlama gelir:

  • Genişleme faktörlerinin tümü 1 olduğunda sürüm=1'i doldurun.
  • Aksi takdirde version=2'yi doldurun.

DepthwiseConv2D durumuna yeni sürümü ekleyerek lite/tools/versioning/op_version.cc dosyasındaki operatör için GetBuiltinOperatorVersion işlevini değiştirin:

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 haritasına eklemektir. Bu adım gereklidir çünkü modelin minimum gerekli çalışma zamanı sürümünü bu sürüm haritasına göre oluşturmamız gerekir.

Bunu yapmak için lite/tools/versioning/runtime_version.cc dosyasına yeni bir harita girişi eklemeniz gerekir.

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

{ {BuiltinOperator_DEPTHWISE_CONV_2D, 2}, %CURRENT_RUNTIME_VERSION%}

burada %CURRENT_RUNTIME_VERSION% tensorflow/core/public/version.h dosyasında tanımlanan geçerli çalışma zamanı sürümüne karşılık gelir.

Yetkilendirme uygulaması

TensorFlow Lite, operasyonların donanım arka uçlarına devredilmesini sağlayan bir yetkilendirme API'si sağlar. Temsilcinin Prepare işlevinde, Temsilci kodundaki her düğüm için sürümün desteklenip desteklenmediğini kontrol edin.

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

Yetkilendirme yalnızca sürüm 1 işlemlerini desteklese bile bu gereklidir, böylece temsilci daha yüksek bir sürüm işlemi alındığında uyumsuzluğu tespit edebilir.