Bu belgede, LiteRT'nin işlem sürümü oluşturma şeması açıklanmaktadır. Op sürüm oluşturma, geliştiricilerin mevcut işlemlere yeni işlevler ve parametreler eklemesine olanak tanır. Ayrıca, aşağıdaki garantileri de sunar:
- Geriye dönük uyumluluk: Yeni LiteRT uygulaması, eski bir model dosyasını işlemelidir.
- İleriye dönük uyumluluk: Yeni özellikler kullanılmadığı sürece eski LiteRT uygulaması, dönüştürücünün yeni sürümü tarafından oluşturulan yeni model dosyasını işlemelidir.
- İleriye dönük uyumsuzluk algılama: Eski bir LiteRT uygulaması, desteklenmeyen bir op'un yeni sürümünü içeren yeni bir modeli okursa hatayı bildirmelidir.
Örnek: Derinlemesine evrişime genişleme ekleme
Bu belgenin kalan kısmında, derinlemesine evrişim işlemine genişleme parametrelerinin nasıl ekleneceği gösterilerek TFLite'ta işlem sürümü oluşturma açıklanmaktadır.
Bu belgeyi anlamak için genişleme bilgisi gerekmez. Unutmayın:
- 2 yeni tam sayı parametresi eklenecek:
dilation_width_factorvedilation_height_factor. - Dilatasyonu desteklemeyen eski derinlik yönlü evrişim çekirdekleri, dilatasyon faktörlerini 1'e ayarlamaya eşdeğerdir.
FlatBuffer şemasını değiştirme
Bir işleme yeni parametreler eklemek için lite/schema/schema.fbs bölümündeki seçenekler tablosunu değiştirin.
Örneğin, derinlemesine sarmalama işleminin seçenekler 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üm tarafından desteklendiğini belirten yorumlar ekleyin.
- Yeni uygulama, yeni eklenen parametrelerin varsayılan değerlerini aldığında eski uygulamayla tamamen aynı şekilde çalışmalıdır.
Yeni parametreler eklendikten sonra tablo aşağıdaki gibi görünü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 için yeniden oluşturulmalıdır.
C yapılarını ve çekirdek uygulamasını değiştirme
LiteRT'de çekirdek uygulaması, FlatBuffer tanımından ayrılmıştır.
Çekirdekler, parametreyi lite/c/builtin_op_data.h içinde tanımlanan C yapılarından okur.
Orijinal derinlemesine sarmalama parametresi şu şekildedir:
typedef struct {
TfLitePadding padding;
int stride_width;
int stride_height;
int depth_multiplier;
TfLiteFusedActivation activation;
} TfLiteDepthwiseConvParams;
FlatBuffer şemasında olduğu gibi, hangi parametrelerin hangi sürümden itibaren desteklendiğini belirten yorumlar ekleyin. 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;
Lütfen çekirdek uygulamasını da değiştirerek yeni eklenen parametreleri C yapılarından okuyun. Ayrıntılar burada verilmemiştir.
FlatBuffer okuma kodunu değiştirme
FlatBuffer'ı okuma ve C yapısı oluşturma mantığı lite/core/api/flatbuffer_conversions.cc içinde yer alır.
Dosyayı, yeni parametreleri işleyecek şekilde aşağıdaki 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 etmeniz gerekmez. Yeni uygulama, genişleme faktörlerinin eksik olduğu eski bir model dosyasını okuduğunda varsayılan değer olarak 1'i kullanır ve yeni çekirdek, eski çekirdekle tutarlı bir şekilde çalışır.
Çekirdek kaydını değiştirme
lite/mutable_op_resolver.h içinde tanımlanan MutableOpResolver, işlem ç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 içinde kaydedilir. Bu örnekte, DepthwiseConv2D sürüm 1 ve 2'yi işleyebilen yeni bir op çekirdeği uyguladık. Bu nedenle, şu satırı değiştirmemiz gerekiyor:
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, TFLite'ın işlemi yürütmek için gereken minimum sürümü doldurmasını sağlamaktır. Bu örnekte bu şu anlama gelir:
- Genişletme faktörlerinin tümü 1 olduğunda version=1 değerini girin.
- Aksi takdirde version=2 değerini doldurun.
GetBuiltinOperatorVersion işlevini, lite/tools/versioning/op_version.cc operatörü için DepthwiseConv2D durumuna yeni sürümü ekleyerek 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üncelleme
Son adım, yeni sürüm bilgilerini operatör sürümü haritasına eklemektir. Bu sürüm haritasına göre modelin minimum gerekli çalışma zamanı sürümünü oluşturmamız gerektiğinden bu adım zorunludur.
Bunu yapmak için lite/tools/versioning/runtime_version.cc bölümüne yeni bir harita girişi eklemeniz gerekir.
Bu örnekte, op_version_map öğesine aşağıdaki girişi eklemeniz gerekir:
{ {BuiltinOperator_DEPTHWISE_CONV_2D, 2}, %CURRENT_RUNTIME_VERSION%}
Burada %CURRENT_RUNTIME_VERSION%, release_version.h içinde tanımlanan mevcut çalışma zamanı sürümüne karşılık gelir.
Yetki uygulama
LiteRT, işlemleri donanım arka uçlarına devretmeyi sağlayan bir temsilci API'si sunar. Temsilcinin Prepare işlevinde, sürümün temsilci kodundaki her düğüm için desteklenip desteklenmediğini kontrol edin.
const int kMaxVersion = 1;
TfLiteNode* node;
TfLiteRegistration* registration = nullptr;
TF_LITE_ENSURE_STATUS(context->GetNodeAndRegistration(context, node_index, &node, ®istration));
if (registration->version > kMaxVersion) {
// Reject the node if the version isn't supported.
}
Bu, temsilci yalnızca sürüm 1 işlemlerini desteklese bile gereklidir. Böylece temsilci, daha yüksek sürümde bir işlem aldığında uyumsuzluğu algılayabilir.