Bu belgede, LiteRT'nin işlem sürümlendirme şeması açıklanmaktadır. İşlem sürümlendirmesi, geliştiricilerin mevcut işlemlere yeni işlevler ve parametreler eklemesine olanak tanır. Ayrıca aşağıdakileri de garanti eder:
- Geriye dönük uyumluluk: Yeni LiteRT uygulaması eski bir model dosyasını işlemelidir.
- İleriye dönük uyumluluk: Yeni özellik kullanılmadığı sürece eski LiteRT uygulaması, dönüştürücünün yeni sürümü tarafından üretilen yeni bir model dosyasını işlemelidir.
- Uyumsuzluğu ileriye dönük algılama: Eski bir LiteRT uygulaması, desteklenmeyen bir işlemin yeni sürümünü içeren yeni bir model okur ve hatayı bildirmelidir.
Örnek: Derinlik boyutlu toplamaya genişleme ekleme
Bu belgenin geri kalanında, derinlik boyutlu konvolusyon işlemine genişleme parametrelerinin nasıl ekleneceğini göstererek TFLite'ta işlem sürümlendirmesi açıklanmaktadır.
Bu dokümanı anlamak için genişletme hakkında bilgi sahibi olmanız gerekmez. Unutmayın:
- 2 yeni tam sayı parametresi eklenecek:
dilation_width_factor
vedilation_height_factor
. - Genişlemeyi desteklemeyen eski derinlik boyutlu konvolüsyon çekirdekleri, genişleme faktörlerini 1 olarak ayarlamaya eşdeğerdir.
FlatBuffer şemasını değiştirme
Bir işleme yeni parametreler eklemek için lite/schema/schema.fbs
'teki seçenekler tablosunu değiştirin.
Örneğin, derinlik boyutlu toplama işleminin seçenek 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 tam olarak aynı şekilde çalışır.
Yeni parametreler eklendikten sonra tablo şu şekilde 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ılır. Çekirdekler, parametreyi lite/c/builtin_op_data.h
içinde tanımlanan C yapılarından okur.
Orijinal derinlik boyutlu konvolusyon 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 yeni eklenen parametreleri C yapılarından okuyacak şekilde değiştirin. Ayrıntılar burada atlanmıştır.
FlatBuffer okuma kodunu değiştirme
FlatBuffer'ı okuma ve C yapısı oluşturma mantığı lite/core/api/flatbuffer_conversions.cc
içindedir.
Dosyayı, yeni parametreleri işleyecek şekilde 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 işletim sistemi 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
MutableOpResolver (lite/mutable_op_resolver.h
içinde tanımlanır), op çekirdeklerini kaydetmek için birkaç işlev sağlar. Varsayılan minimum ve maksimum sürüm 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
'e kaydedilir. Bu örnekte, DepthwiseConv2D
1 ve 2 sürümünü işleyebilecek 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 op sürümünü değiştirme
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şleme faktörlerinin tümü 1 olduğunda version=1 değerini doldurun.
- Aksi takdirde version=2 değerini doldurun.
DepthwiseConv2D
durumuna yeni sürümü ekleyerek lite/tools/versioning/op_version.cc
'teki 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ü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 gereklidir.
Bunu yapmak için lite/tools/versioning/runtime_version.cc
alanına yeni bir harita girişi eklemeniz gerekir.
Bu örnekte, op_version_map
alanına aşağıdaki girişi eklemeniz gerekir:
{ {BuiltinOperator_DEPTHWISE_CONV_2D, 2}, %CURRENT_RUNTIME_VERSION%}
Burada %CURRENT_RUNTIME_VERSION%
, release_version.h dosyasında tanımlanan mevcut çalışma zamanı sürümüne karşılık gelir.
Yetkilendirme uygulaması
LiteRT, işlemleri donanım arka uçlarına devretmeyi sağlayan bir yetkilendirme API'si sağlar. Temsilcinin Prepare
işlevinde, sürümün Temsilcilik 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.
}
Yetkilendirme yalnızca 1. sürüm işlemleri destekliyor olsa bile bu gereklidir. Böylece yetkilendirme, daha yüksek sürüm işlemi alırken uyumsuzluğu algılayabilir.