diff --git a/tensorflow/compiler/mlir/lite/schema/schema.fbs b/tensorflow/compiler/mlir/lite/schema/schema.fbs index d9da8f0a331..1d5d6b1c95e 100644 --- a/tensorflow/compiler/mlir/lite/schema/schema.fbs +++ b/tensorflow/compiler/mlir/lite/schema/schema.fbs @@ -24,6 +24,8 @@ // Version 3c: Move constant tensor buffers & custom op buffers outside from // Flatbuffers. Has backward compatibility with version 3, 3a and // 3b. +// Version 3d: Add ExternalBuffer tables and tensor.external_buffer field for +// referencing immutable data stored in external files. namespace tflite; @@ -263,6 +265,11 @@ table Tensor { // Currently only 1 subtype is supported. The field is defined as an array for // flexibility of supporting multiple subtypes in the future. variant_tensors:[VariantSubType]; + + // Optional reference to an ExternalBuffer entry that stores constant tensor + // data outside of the FlatBuffer. A value of 0 indicates that the tensor uses + // the traditional embedded buffer field instead. + external_buffer:uint; } // A list of builtin operators. Builtin operators are slightly faster than custom @@ -1613,6 +1620,22 @@ table Buffer { size: ulong; } +// Groups external buffers by file/URI. +table ExternalBufferGroup { + name:string; +} + +// Describes an immutable data slice stored in an external file. +table ExternalBuffer { + // Unique identifier for this external buffer. + id:uint; + // Index into the external_buffer_groups array. + group:uint; + offset:ulong; + length:ulong; + packing:string; +} + table Metadata { // A human readable string to uniquely identify a Metadata. name:string; @@ -1680,6 +1703,12 @@ table Model { // Optional SignatureDefs for the model. signature_defs:[SignatureDef]; + + // Optional groups for external weight buffers. + external_buffer_groups:[ExternalBufferGroup]; + + // Optional list of external weight buffers referenced by tensors. + external_buffers:[ExternalBuffer]; } root_type Model; diff --git a/tensorflow/lite/python/schema_py_generated.py b/tensorflow/lite/python/schema_py_generated.py index 648cfd043af..03cca34f037 100755 --- a/tensorflow/lite/python/schema_py_generated.py +++ b/tensorflow/lite/python/schema_py_generated.py @@ -2407,8 +2407,15 @@ def VariantTensorsIsNone(self): o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) return o == 0 + # Tensor + def ExternalBuffer(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) + return 0 + def TensorStart(builder): - builder.StartObject(10) + builder.StartObject(11) def TensorAddShape(builder, shape): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(shape), 0) @@ -2449,6 +2456,9 @@ def TensorAddVariantTensors(builder, variantTensors): def TensorStartVariantTensorsVector(builder, numElems): return builder.StartVector(4, numElems, 4) +def TensorAddExternalBuffer(builder, externalBuffer): + builder.PrependUint32Slot(10, externalBuffer, 0) + def TensorEnd(builder): return builder.EndObject() @@ -2472,6 +2482,7 @@ def __init__(self): self.shapeSignature = None # type: List[int] self.hasRank = False # type: bool self.variantTensors = None # type: List[VariantSubTypeT] + self.externalBuffer = 0 # type: int @classmethod def InitFromBuf(cls, buf, pos): @@ -2525,6 +2536,7 @@ def _UnPack(self, tensor): else: variantSubType_ = VariantSubTypeT.InitFromObj(tensor.VariantTensors(i)) self.variantTensors.append(variantSubType_) + self.externalBuffer = tensor.ExternalBuffer() # TensorT def Pack(self, builder): @@ -2575,6 +2587,7 @@ def Pack(self, builder): TensorAddHasRank(builder, self.hasRank) if self.variantTensors is not None: TensorAddVariantTensors(builder, variantTensors) + TensorAddExternalBuffer(builder, self.externalBuffer) tensor = TensorEnd(builder) return tensor @@ -17892,6 +17905,218 @@ def Pack(self, builder): return buffer +class ExternalBufferGroup(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset=0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = ExternalBufferGroup() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsExternalBufferGroup(cls, buf, offset=0): + """This method is deprecated. Please switch to GetRootAs.""" + return cls.GetRootAs(buf, offset) + @classmethod + def ExternalBufferGroupBufferHasIdentifier(cls, buf, offset, size_prefixed=False): + return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) + + # ExternalBufferGroup + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # ExternalBufferGroup + def Name(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + +def ExternalBufferGroupStart(builder): + builder.StartObject(1) + +def ExternalBufferGroupAddName(builder, name): + builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0) + +def ExternalBufferGroupEnd(builder): + return builder.EndObject() + + + +class ExternalBufferGroupT(object): + + # ExternalBufferGroupT + def __init__(self): + self.name = None # type: str + + @classmethod + def InitFromBuf(cls, buf, pos): + externalBufferGroup = ExternalBufferGroup() + externalBufferGroup.Init(buf, pos) + return cls.InitFromObj(externalBufferGroup) + + @classmethod + def InitFromPackedBuf(cls, buf, pos=0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos) + return cls.InitFromBuf(buf, pos+n) + + @classmethod + def InitFromObj(cls, externalBufferGroup): + x = ExternalBufferGroupT() + x._UnPack(externalBufferGroup) + return x + + # ExternalBufferGroupT + def _UnPack(self, externalBufferGroup): + if externalBufferGroup is None: + return + self.name = externalBufferGroup.Name() + + # ExternalBufferGroupT + def Pack(self, builder): + if self.name is not None: + name = builder.CreateString(self.name) + ExternalBufferGroupStart(builder) + if self.name is not None: + ExternalBufferGroupAddName(builder, name) + externalBufferGroup = ExternalBufferGroupEnd(builder) + return externalBufferGroup + + +class ExternalBuffer(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset=0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = ExternalBuffer() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsExternalBuffer(cls, buf, offset=0): + """This method is deprecated. Please switch to GetRootAs.""" + return cls.GetRootAs(buf, offset) + @classmethod + def ExternalBufferBufferHasIdentifier(cls, buf, offset, size_prefixed=False): + return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x54\x46\x4C\x33", size_prefixed=size_prefixed) + + # ExternalBuffer + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # ExternalBuffer + def Id(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) + return 0 + + # ExternalBuffer + def Group(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint32Flags, o + self._tab.Pos) + return 0 + + # ExternalBuffer + def Offset(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # ExternalBuffer + def Length(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # ExternalBuffer + def Packing(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + +def ExternalBufferStart(builder): + builder.StartObject(5) + +def ExternalBufferAddId(builder, id): + builder.PrependUint32Slot(0, id, 0) + +def ExternalBufferAddGroup(builder, group): + builder.PrependUint32Slot(1, group, 0) + +def ExternalBufferAddOffset(builder, offset): + builder.PrependUint64Slot(2, offset, 0) + +def ExternalBufferAddLength(builder, length): + builder.PrependUint64Slot(3, length, 0) + +def ExternalBufferAddPacking(builder, packing): + builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(packing), 0) + +def ExternalBufferEnd(builder): + return builder.EndObject() + + + +class ExternalBufferT(object): + + # ExternalBufferT + def __init__(self): + self.id = 0 # type: int + self.group = 0 # type: int + self.offset = 0 # type: int + self.length = 0 # type: int + self.packing = None # type: str + + @classmethod + def InitFromBuf(cls, buf, pos): + externalBuffer = ExternalBuffer() + externalBuffer.Init(buf, pos) + return cls.InitFromObj(externalBuffer) + + @classmethod + def InitFromPackedBuf(cls, buf, pos=0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos) + return cls.InitFromBuf(buf, pos+n) + + @classmethod + def InitFromObj(cls, externalBuffer): + x = ExternalBufferT() + x._UnPack(externalBuffer) + return x + + # ExternalBufferT + def _UnPack(self, externalBuffer): + if externalBuffer is None: + return + self.id = externalBuffer.Id() + self.group = externalBuffer.Group() + self.offset = externalBuffer.Offset() + self.length = externalBuffer.Length() + self.packing = externalBuffer.Packing() + + # ExternalBufferT + def Pack(self, builder): + if self.packing is not None: + packing = builder.CreateString(self.packing) + ExternalBufferStart(builder) + ExternalBufferAddId(builder, self.id) + ExternalBufferAddGroup(builder, self.group) + ExternalBufferAddOffset(builder, self.offset) + ExternalBufferAddLength(builder, self.length) + if self.packing is not None: + ExternalBufferAddPacking(builder, packing) + externalBuffer = ExternalBufferEnd(builder) + return externalBuffer + + class Metadata(object): __slots__ = ['_tab'] @@ -18456,8 +18681,56 @@ def SignatureDefsIsNone(self): o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) return o == 0 + # Model + def ExternalBufferGroups(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + obj = ExternalBufferGroup() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Model + def ExternalBufferGroupsLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Model + def ExternalBufferGroupsIsNone(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + return o == 0 + + # Model + def ExternalBuffers(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + obj = ExternalBuffer() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Model + def ExternalBuffersLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Model + def ExternalBuffersIsNone(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + return o == 0 + def ModelStart(builder): - builder.StartObject(8) + builder.StartObject(10) def ModelAddVersion(builder, version): builder.PrependUint32Slot(0, version, 0) @@ -18501,6 +18774,18 @@ def ModelAddSignatureDefs(builder, signatureDefs): def ModelStartSignatureDefsVector(builder, numElems): return builder.StartVector(4, numElems, 4) +def ModelAddExternalBufferGroups(builder, externalBufferGroups): + builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(externalBufferGroups), 0) + +def ModelStartExternalBufferGroupsVector(builder, numElems): + return builder.StartVector(4, numElems, 4) + +def ModelAddExternalBuffers(builder, externalBuffers): + builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(externalBuffers), 0) + +def ModelStartExternalBuffersVector(builder, numElems): + return builder.StartVector(4, numElems, 4) + def ModelEnd(builder): return builder.EndObject() @@ -18522,6 +18807,8 @@ def __init__(self): self.metadataBuffer = None # type: List[int] self.metadata = None # type: List[MetadataT] self.signatureDefs = None # type: List[SignatureDefT] + self.externalBufferGroups = None # type: List[ExternalBufferGroupT] + self.externalBuffers = None # type: List[ExternalBufferT] @classmethod def InitFromBuf(cls, buf, pos): @@ -18593,6 +18880,22 @@ def _UnPack(self, model): else: signatureDef_ = SignatureDefT.InitFromObj(model.SignatureDefs(i)) self.signatureDefs.append(signatureDef_) + if not model.ExternalBufferGroupsIsNone(): + self.externalBufferGroups = [] + for i in range(model.ExternalBufferGroupsLength()): + if model.ExternalBufferGroups(i) is None: + self.externalBufferGroups.append(None) + else: + externalBufferGroup_ = ExternalBufferGroupT.InitFromObj(model.ExternalBufferGroups(i)) + self.externalBufferGroups.append(externalBufferGroup_) + if not model.ExternalBuffersIsNone(): + self.externalBuffers = [] + for i in range(model.ExternalBuffersLength()): + if model.ExternalBuffers(i) is None: + self.externalBuffers.append(None) + else: + externalBuffer_ = ExternalBufferT.InitFromObj(model.ExternalBuffers(i)) + self.externalBuffers.append(externalBuffer_) # ModelT def Pack(self, builder): @@ -18646,6 +18949,22 @@ def Pack(self, builder): for i in reversed(range(len(self.signatureDefs))): builder.PrependUOffsetTRelative(signatureDefslist[i]) signatureDefs = builder.EndVector() + if self.externalBufferGroups is not None: + externalBufferGroupslist = [] + for i in range(len(self.externalBufferGroups)): + externalBufferGroupslist.append(self.externalBufferGroups[i].Pack(builder)) + ModelStartExternalBufferGroupsVector(builder, len(self.externalBufferGroups)) + for i in reversed(range(len(self.externalBufferGroups))): + builder.PrependUOffsetTRelative(externalBufferGroupslist[i]) + externalBufferGroups = builder.EndVector() + if self.externalBuffers is not None: + externalBufferslist = [] + for i in range(len(self.externalBuffers)): + externalBufferslist.append(self.externalBuffers[i].Pack(builder)) + ModelStartExternalBuffersVector(builder, len(self.externalBuffers)) + for i in reversed(range(len(self.externalBuffers))): + builder.PrependUOffsetTRelative(externalBufferslist[i]) + externalBuffers = builder.EndVector() ModelStart(builder) ModelAddVersion(builder, self.version) if self.operatorCodes is not None: @@ -18662,6 +18981,10 @@ def Pack(self, builder): ModelAddMetadata(builder, metadata) if self.signatureDefs is not None: ModelAddSignatureDefs(builder, signatureDefs) + if self.externalBufferGroups is not None: + ModelAddExternalBufferGroups(builder, externalBufferGroups) + if self.externalBuffers is not None: + ModelAddExternalBuffers(builder, externalBuffers) model = ModelEnd(builder) return model diff --git a/tensorflow/lite/schema/schema_generated.h b/tensorflow/lite/schema/schema_generated.h index 35dd124b367..67c8279d83d 100755 --- a/tensorflow/lite/schema/schema_generated.h +++ b/tensorflow/lite/schema/schema_generated.h @@ -667,6 +667,14 @@ struct Buffer; struct BufferBuilder; struct BufferT; +struct ExternalBufferGroup; +struct ExternalBufferGroupBuilder; +struct ExternalBufferGroupT; + +struct ExternalBuffer; +struct ExternalBufferBuilder; +struct ExternalBufferT; + struct Metadata; struct MetadataBuilder; struct MetadataT; @@ -5938,6 +5946,7 @@ struct TensorT : public ::flatbuffers::NativeTable { std::vector shape_signature{}; bool has_rank = false; std::vector> variant_tensors{}; + uint32_t external_buffer = 0; TensorT() = default; TensorT(const TensorT &o); TensorT(TensorT&&) FLATBUFFERS_NOEXCEPT = default; @@ -5957,7 +5966,8 @@ struct Tensor FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_SPARSITY = 16, VT_SHAPE_SIGNATURE = 18, VT_HAS_RANK = 20, - VT_VARIANT_TENSORS = 22 + VT_VARIANT_TENSORS = 22, + VT_EXTERNAL_BUFFER = 24 }; const ::flatbuffers::Vector *shape() const { return GetPointer *>(VT_SHAPE); @@ -5989,6 +5999,9 @@ struct Tensor FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const ::flatbuffers::Vector<::flatbuffers::Offset> *variant_tensors() const { return GetPointer> *>(VT_VARIANT_TENSORS); } + uint32_t external_buffer() const { + return GetField(VT_EXTERNAL_BUFFER, 0); + } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_SHAPE) && @@ -6008,6 +6021,7 @@ struct Tensor FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VerifyOffset(verifier, VT_VARIANT_TENSORS) && verifier.VerifyVector(variant_tensors()) && verifier.VerifyVectorOfTables(variant_tensors()) && + VerifyField(verifier, VT_EXTERNAL_BUFFER, 4) && verifier.EndTable(); } TensorT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -6049,6 +6063,9 @@ struct TensorBuilder { void add_variant_tensors(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> variant_tensors) { fbb_.AddOffset(Tensor::VT_VARIANT_TENSORS, variant_tensors); } + void add_external_buffer(uint32_t external_buffer) { + fbb_.AddElement(Tensor::VT_EXTERNAL_BUFFER, external_buffer, 0); + } explicit TensorBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -6071,8 +6088,10 @@ inline ::flatbuffers::Offset CreateTensor( ::flatbuffers::Offset sparsity = 0, ::flatbuffers::Offset<::flatbuffers::Vector> shape_signature = 0, bool has_rank = false, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> variant_tensors = 0) { + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> variant_tensors = 0, + uint32_t external_buffer = 0) { TensorBuilder builder_(_fbb); + builder_.add_external_buffer(external_buffer); builder_.add_variant_tensors(variant_tensors); builder_.add_shape_signature(shape_signature); builder_.add_sparsity(sparsity); @@ -6097,7 +6116,8 @@ inline ::flatbuffers::Offset CreateTensorDirect( ::flatbuffers::Offset sparsity = 0, const std::vector *shape_signature = nullptr, bool has_rank = false, - const std::vector<::flatbuffers::Offset> *variant_tensors = nullptr) { + const std::vector<::flatbuffers::Offset> *variant_tensors = nullptr, + uint32_t external_buffer = 0) { auto shape__ = shape ? _fbb.CreateVector(*shape) : 0; auto name__ = name ? _fbb.CreateString(name) : 0; auto shape_signature__ = shape_signature ? _fbb.CreateVector(*shape_signature) : 0; @@ -6113,7 +6133,8 @@ inline ::flatbuffers::Offset CreateTensorDirect( sparsity, shape_signature__, has_rank, - variant_tensors__); + variant_tensors__, + external_buffer); } ::flatbuffers::Offset CreateTensor(::flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); @@ -16517,6 +16538,182 @@ inline ::flatbuffers::Offset CreateBufferDirect( ::flatbuffers::Offset CreateBuffer(::flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +struct ExternalBufferGroupT : public ::flatbuffers::NativeTable { + typedef ExternalBufferGroup TableType; + std::string name{}; +}; + +struct ExternalBufferGroup FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef ExternalBufferGroupT NativeTableType; + typedef ExternalBufferGroupBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4 + }; + const ::flatbuffers::String *name() const { + return GetPointer(VT_NAME); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + verifier.EndTable(); + } + ExternalBufferGroupT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ExternalBufferGroupT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + static ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferGroupT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ExternalBufferGroupBuilder { + typedef ExternalBufferGroup Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { + fbb_.AddOffset(ExternalBufferGroup::VT_NAME, name); + } + explicit ExternalBufferGroupBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateExternalBufferGroup( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0) { + ExternalBufferGroupBuilder builder_(_fbb); + builder_.add_name(name); + return builder_.Finish(); +} + +inline ::flatbuffers::Offset CreateExternalBufferGroupDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr) { + auto name__ = name ? _fbb.CreateString(name) : 0; + return tflite::CreateExternalBufferGroup( + _fbb, + name__); +} + +::flatbuffers::Offset CreateExternalBufferGroup(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferGroupT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ExternalBufferT : public ::flatbuffers::NativeTable { + typedef ExternalBuffer TableType; + uint32_t id = 0; + uint32_t group = 0; + uint64_t offset = 0; + uint64_t length = 0; + std::string packing{}; +}; + +struct ExternalBuffer FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef ExternalBufferT NativeTableType; + typedef ExternalBufferBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ID = 4, + VT_GROUP = 6, + VT_OFFSET = 8, + VT_LENGTH = 10, + VT_PACKING = 12 + }; + uint32_t id() const { + return GetField(VT_ID, 0); + } + uint32_t group() const { + return GetField(VT_GROUP, 0); + } + uint64_t offset() const { + return GetField(VT_OFFSET, 0); + } + uint64_t length() const { + return GetField(VT_LENGTH, 0); + } + const ::flatbuffers::String *packing() const { + return GetPointer(VT_PACKING); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ID, 4) && + VerifyField(verifier, VT_GROUP, 4) && + VerifyField(verifier, VT_OFFSET, 8) && + VerifyField(verifier, VT_LENGTH, 8) && + VerifyOffset(verifier, VT_PACKING) && + verifier.VerifyString(packing()) && + verifier.EndTable(); + } + ExternalBufferT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ExternalBufferT *_o, const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; + static ::flatbuffers::Offset Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferT* _o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ExternalBufferBuilder { + typedef ExternalBuffer Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_id(uint32_t id) { + fbb_.AddElement(ExternalBuffer::VT_ID, id, 0); + } + void add_group(uint32_t group) { + fbb_.AddElement(ExternalBuffer::VT_GROUP, group, 0); + } + void add_offset(uint64_t offset) { + fbb_.AddElement(ExternalBuffer::VT_OFFSET, offset, 0); + } + void add_length(uint64_t length) { + fbb_.AddElement(ExternalBuffer::VT_LENGTH, length, 0); + } + void add_packing(::flatbuffers::Offset<::flatbuffers::String> packing) { + fbb_.AddOffset(ExternalBuffer::VT_PACKING, packing); + } + explicit ExternalBufferBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateExternalBuffer( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint32_t id = 0, + uint32_t group = 0, + uint64_t offset = 0, + uint64_t length = 0, + ::flatbuffers::Offset<::flatbuffers::String> packing = 0) { + ExternalBufferBuilder builder_(_fbb); + builder_.add_length(length); + builder_.add_offset(offset); + builder_.add_packing(packing); + builder_.add_group(group); + builder_.add_id(id); + return builder_.Finish(); +} + +inline ::flatbuffers::Offset CreateExternalBufferDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint32_t id = 0, + uint32_t group = 0, + uint64_t offset = 0, + uint64_t length = 0, + const char *packing = nullptr) { + auto packing__ = packing ? _fbb.CreateString(packing) : 0; + return tflite::CreateExternalBuffer( + _fbb, + id, + group, + offset, + length, + packing__); +} + +::flatbuffers::Offset CreateExternalBuffer(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); + struct MetadataT : public ::flatbuffers::NativeTable { typedef Metadata TableType; std::string name{}; @@ -16788,6 +16985,8 @@ struct ModelT : public ::flatbuffers::NativeTable { std::vector metadata_buffer{}; std::vector> metadata{}; std::vector> signature_defs{}; + std::vector> external_buffer_groups{}; + std::vector> external_buffers{}; ModelT() = default; ModelT(const ModelT &o); ModelT(ModelT&&) FLATBUFFERS_NOEXCEPT = default; @@ -16805,7 +17004,9 @@ struct Model FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_BUFFERS = 12, VT_METADATA_BUFFER = 14, VT_METADATA = 16, - VT_SIGNATURE_DEFS = 18 + VT_SIGNATURE_DEFS = 18, + VT_EXTERNAL_BUFFER_GROUPS = 20, + VT_EXTERNAL_BUFFERS = 22 }; uint32_t version() const { return GetField(VT_VERSION, 0); @@ -16831,6 +17032,12 @@ struct Model FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const ::flatbuffers::Vector<::flatbuffers::Offset> *signature_defs() const { return GetPointer> *>(VT_SIGNATURE_DEFS); } + const ::flatbuffers::Vector<::flatbuffers::Offset> *external_buffer_groups() const { + return GetPointer> *>(VT_EXTERNAL_BUFFER_GROUPS); + } + const ::flatbuffers::Vector<::flatbuffers::Offset> *external_buffers() const { + return GetPointer> *>(VT_EXTERNAL_BUFFERS); + } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_VERSION, 4) && @@ -16853,6 +17060,12 @@ struct Model FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VerifyOffset(verifier, VT_SIGNATURE_DEFS) && verifier.VerifyVector(signature_defs()) && verifier.VerifyVectorOfTables(signature_defs()) && + VerifyOffset(verifier, VT_EXTERNAL_BUFFER_GROUPS) && + verifier.VerifyVector(external_buffer_groups()) && + verifier.VerifyVectorOfTables(external_buffer_groups()) && + VerifyOffset(verifier, VT_EXTERNAL_BUFFERS) && + verifier.VerifyVector(external_buffers()) && + verifier.VerifyVectorOfTables(external_buffers()) && verifier.EndTable(); } ModelT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -16888,6 +17101,12 @@ struct ModelBuilder { void add_signature_defs(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signature_defs) { fbb_.AddOffset(Model::VT_SIGNATURE_DEFS, signature_defs); } + void add_external_buffer_groups(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> external_buffer_groups) { + fbb_.AddOffset(Model::VT_EXTERNAL_BUFFER_GROUPS, external_buffer_groups); + } + void add_external_buffers(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> external_buffers) { + fbb_.AddOffset(Model::VT_EXTERNAL_BUFFERS, external_buffers); + } explicit ModelBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -16908,8 +17127,12 @@ inline ::flatbuffers::Offset CreateModel( ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> buffers = 0, ::flatbuffers::Offset<::flatbuffers::Vector> metadata_buffer = 0, ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> metadata = 0, - ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signature_defs = 0) { + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signature_defs = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> external_buffer_groups = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> external_buffers = 0) { ModelBuilder builder_(_fbb); + builder_.add_external_buffers(external_buffers); + builder_.add_external_buffer_groups(external_buffer_groups); builder_.add_signature_defs(signature_defs); builder_.add_metadata(metadata); builder_.add_metadata_buffer(metadata_buffer); @@ -16930,7 +17153,9 @@ inline ::flatbuffers::Offset CreateModelDirect( const std::vector<::flatbuffers::Offset> *buffers = nullptr, const std::vector *metadata_buffer = nullptr, const std::vector<::flatbuffers::Offset> *metadata = nullptr, - const std::vector<::flatbuffers::Offset> *signature_defs = nullptr) { + const std::vector<::flatbuffers::Offset> *signature_defs = nullptr, + const std::vector<::flatbuffers::Offset> *external_buffer_groups = nullptr, + const std::vector<::flatbuffers::Offset> *external_buffers = nullptr) { auto operator_codes__ = operator_codes ? _fbb.CreateVector<::flatbuffers::Offset>(*operator_codes) : 0; auto subgraphs__ = subgraphs ? _fbb.CreateVector<::flatbuffers::Offset>(*subgraphs) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; @@ -16938,6 +17163,8 @@ inline ::flatbuffers::Offset CreateModelDirect( auto metadata_buffer__ = metadata_buffer ? _fbb.CreateVector(*metadata_buffer) : 0; auto metadata__ = metadata ? _fbb.CreateVector<::flatbuffers::Offset>(*metadata) : 0; auto signature_defs__ = signature_defs ? _fbb.CreateVector<::flatbuffers::Offset>(*signature_defs) : 0; + auto external_buffer_groups__ = external_buffer_groups ? _fbb.CreateVector<::flatbuffers::Offset>(*external_buffer_groups) : 0; + auto external_buffers__ = external_buffers ? _fbb.CreateVector<::flatbuffers::Offset>(*external_buffers) : 0; return tflite::CreateModel( _fbb, version, @@ -16947,7 +17174,9 @@ inline ::flatbuffers::Offset CreateModelDirect( buffers__, metadata_buffer__, metadata__, - signature_defs__); + signature_defs__, + external_buffer_groups__, + external_buffers__); } ::flatbuffers::Offset CreateModel(::flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr); @@ -17263,7 +17492,8 @@ inline TensorT::TensorT(const TensorT &o) is_variable(o.is_variable), sparsity((o.sparsity) ? new tflite::SparsityParametersT(*o.sparsity) : nullptr), shape_signature(o.shape_signature), - has_rank(o.has_rank) { + has_rank(o.has_rank), + external_buffer(o.external_buffer) { variant_tensors.reserve(o.variant_tensors.size()); for (const auto &variant_tensors_ : o.variant_tensors) { variant_tensors.emplace_back((variant_tensors_) ? new tflite::VariantSubTypeT(*variant_tensors_) : nullptr); } } @@ -17279,6 +17509,7 @@ inline TensorT &TensorT::operator=(TensorT o) FLATBUFFERS_NOEXCEPT { std::swap(shape_signature, o.shape_signature); std::swap(has_rank, o.has_rank); std::swap(variant_tensors, o.variant_tensors); + std::swap(external_buffer, o.external_buffer); return *this; } @@ -17301,6 +17532,7 @@ inline void Tensor::UnPackTo(TensorT *_o, const ::flatbuffers::resolver_function { auto _e = shape_signature(); if (_e) { _o->shape_signature.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->shape_signature[_i] = _e->Get(_i); } } else { _o->shape_signature.resize(0); } } { auto _e = has_rank(); _o->has_rank = _e; } { auto _e = variant_tensors(); if (_e) { _o->variant_tensors.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->variant_tensors[_i]) { _e->Get(_i)->UnPackTo(_o->variant_tensors[_i].get(), _resolver); } else { _o->variant_tensors[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->variant_tensors.resize(0); } } + { auto _e = external_buffer(); _o->external_buffer = _e; } } inline ::flatbuffers::Offset Tensor::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const TensorT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { @@ -17321,6 +17553,7 @@ inline ::flatbuffers::Offset CreateTensor(::flatbuffers::FlatBufferBuild auto _shape_signature = _o->shape_signature.size() ? _fbb.CreateVector(_o->shape_signature) : 0; auto _has_rank = _o->has_rank; auto _variant_tensors = _o->variant_tensors.size() ? _fbb.CreateVector<::flatbuffers::Offset> (_o->variant_tensors.size(), [](size_t i, _VectorArgs *__va) { return CreateVariantSubType(*__va->__fbb, __va->__o->variant_tensors[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _external_buffer = _o->external_buffer; return tflite::CreateTensor( _fbb, _shape, @@ -17332,7 +17565,8 @@ inline ::flatbuffers::Offset CreateTensor(::flatbuffers::FlatBufferBuild _sparsity, _shape_signature, _has_rank, - _variant_tensors); + _variant_tensors, + _external_buffer); } inline StablehloGatherOptionsT *StablehloGatherOptions::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { @@ -21626,6 +21860,70 @@ inline ::flatbuffers::Offset CreateBuffer(::flatbuffers::FlatBufferBuild _size); } +inline ExternalBufferGroupT *ExternalBufferGroup::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { + auto _o = std::unique_ptr(new ExternalBufferGroupT()); + UnPackTo(_o.get(), _resolver); + return _o.release(); +} + +inline void ExternalBufferGroup::UnPackTo(ExternalBufferGroupT *_o, const ::flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = name(); if (_e) _o->name = _e->str(); } +} + +inline ::flatbuffers::Offset ExternalBufferGroup::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferGroupT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { + return CreateExternalBufferGroup(_fbb, _o, _rehasher); +} + +inline ::flatbuffers::Offset CreateExternalBufferGroup(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferGroupT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ExternalBufferGroupT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); + return tflite::CreateExternalBufferGroup( + _fbb, + _name); +} + +inline ExternalBufferT *ExternalBuffer::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { + auto _o = std::unique_ptr(new ExternalBufferT()); + UnPackTo(_o.get(), _resolver); + return _o.release(); +} + +inline void ExternalBuffer::UnPackTo(ExternalBufferT *_o, const ::flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = id(); _o->id = _e; } + { auto _e = group(); _o->group = _e; } + { auto _e = offset(); _o->offset = _e; } + { auto _e = length(); _o->length = _e; } + { auto _e = packing(); if (_e) _o->packing = _e->str(); } +} + +inline ::flatbuffers::Offset ExternalBuffer::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { + return CreateExternalBuffer(_fbb, _o, _rehasher); +} + +inline ::flatbuffers::Offset CreateExternalBuffer(::flatbuffers::FlatBufferBuilder &_fbb, const ExternalBufferT *_o, const ::flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { ::flatbuffers::FlatBufferBuilder *__fbb; const ExternalBufferT* __o; const ::flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _id = _o->id; + auto _group = _o->group; + auto _offset = _o->offset; + auto _length = _o->length; + auto _packing = _o->packing.empty() ? 0 : _fbb.CreateString(_o->packing); + return tflite::CreateExternalBuffer( + _fbb, + _id, + _group, + _offset, + _length, + _packing); +} + inline MetadataT *Metadata::UnPack(const ::flatbuffers::resolver_function_t *_resolver) const { auto _o = std::unique_ptr(new MetadataT()); UnPackTo(_o.get(), _resolver); @@ -21750,6 +22048,10 @@ inline ModelT::ModelT(const ModelT &o) for (const auto &metadata_ : o.metadata) { metadata.emplace_back((metadata_) ? new tflite::MetadataT(*metadata_) : nullptr); } signature_defs.reserve(o.signature_defs.size()); for (const auto &signature_defs_ : o.signature_defs) { signature_defs.emplace_back((signature_defs_) ? new tflite::SignatureDefT(*signature_defs_) : nullptr); } + external_buffer_groups.reserve(o.external_buffer_groups.size()); + for (const auto &external_buffer_groups_ : o.external_buffer_groups) { external_buffer_groups.emplace_back((external_buffer_groups_) ? new tflite::ExternalBufferGroupT(*external_buffer_groups_) : nullptr); } + external_buffers.reserve(o.external_buffers.size()); + for (const auto &external_buffers_ : o.external_buffers) { external_buffers.emplace_back((external_buffers_) ? new tflite::ExternalBufferT(*external_buffers_) : nullptr); } } inline ModelT &ModelT::operator=(ModelT o) FLATBUFFERS_NOEXCEPT { @@ -21761,6 +22063,8 @@ inline ModelT &ModelT::operator=(ModelT o) FLATBUFFERS_NOEXCEPT { std::swap(metadata_buffer, o.metadata_buffer); std::swap(metadata, o.metadata); std::swap(signature_defs, o.signature_defs); + std::swap(external_buffer_groups, o.external_buffer_groups); + std::swap(external_buffers, o.external_buffers); return *this; } @@ -21781,6 +22085,8 @@ inline void Model::UnPackTo(ModelT *_o, const ::flatbuffers::resolver_function_t { auto _e = metadata_buffer(); if (_e) { _o->metadata_buffer.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->metadata_buffer[_i] = _e->Get(_i); } } else { _o->metadata_buffer.resize(0); } } { auto _e = metadata(); if (_e) { _o->metadata.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->metadata[_i]) { _e->Get(_i)->UnPackTo(_o->metadata[_i].get(), _resolver); } else { _o->metadata[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->metadata.resize(0); } } { auto _e = signature_defs(); if (_e) { _o->signature_defs.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->signature_defs[_i]) { _e->Get(_i)->UnPackTo(_o->signature_defs[_i].get(), _resolver); } else { _o->signature_defs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->signature_defs.resize(0); } } + { auto _e = external_buffer_groups(); if (_e) { _o->external_buffer_groups.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->external_buffer_groups[_i]) { _e->Get(_i)->UnPackTo(_o->external_buffer_groups[_i].get(), _resolver); } else { _o->external_buffer_groups[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->external_buffer_groups.resize(0); } } + { auto _e = external_buffers(); if (_e) { _o->external_buffers.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if(_o->external_buffers[_i]) { _e->Get(_i)->UnPackTo(_o->external_buffers[_i].get(), _resolver); } else { _o->external_buffers[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); }; } } else { _o->external_buffers.resize(0); } } } inline ::flatbuffers::Offset Model::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const ModelT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) { @@ -21799,6 +22105,8 @@ inline ::flatbuffers::Offset CreateModel(::flatbuffers::FlatBufferBuilder auto _metadata_buffer = _o->metadata_buffer.size() ? _fbb.CreateVector(_o->metadata_buffer) : 0; auto _metadata = _o->metadata.size() ? _fbb.CreateVector<::flatbuffers::Offset> (_o->metadata.size(), [](size_t i, _VectorArgs *__va) { return CreateMetadata(*__va->__fbb, __va->__o->metadata[i].get(), __va->__rehasher); }, &_va ) : 0; auto _signature_defs = _o->signature_defs.size() ? _fbb.CreateVector<::flatbuffers::Offset> (_o->signature_defs.size(), [](size_t i, _VectorArgs *__va) { return CreateSignatureDef(*__va->__fbb, __va->__o->signature_defs[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _external_buffer_groups = _o->external_buffer_groups.size() ? _fbb.CreateVector<::flatbuffers::Offset> (_o->external_buffer_groups.size(), [](size_t i, _VectorArgs *__va) { return CreateExternalBufferGroup(*__va->__fbb, __va->__o->external_buffer_groups[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _external_buffers = _o->external_buffers.size() ? _fbb.CreateVector<::flatbuffers::Offset> (_o->external_buffers.size(), [](size_t i, _VectorArgs *__va) { return CreateExternalBuffer(*__va->__fbb, __va->__o->external_buffers[i].get(), __va->__rehasher); }, &_va ) : 0; return tflite::CreateModel( _fbb, _version, @@ -21808,7 +22116,9 @@ inline ::flatbuffers::Offset CreateModel(::flatbuffers::FlatBufferBuilder _buffers, _metadata_buffer, _metadata, - _signature_defs); + _signature_defs, + _external_buffer_groups, + _external_buffers); } inline bool VerifyQuantizationDetails(::flatbuffers::Verifier &verifier, const void *obj, QuantizationDetails type) {