diff --git a/apis/mlops/chainer/chainer.pb.go b/apis/mlops/chainer/chainer.pb.go index 80bcb11847..f45b5e3683 100644 --- a/apis/mlops/chainer/chainer.pb.go +++ b/apis/mlops/chainer/chainer.pb.go @@ -74,6 +74,7 @@ type PipelineStepUpdate_PipelineJoinType int32 const ( PipelineStepUpdate_Unknown PipelineStepUpdate_PipelineJoinType = 0 PipelineStepUpdate_Inner PipelineStepUpdate_PipelineJoinType = 1 + PipelineStepUpdate_Outer PipelineStepUpdate_PipelineJoinType = 2 ) // Enum value maps for PipelineStepUpdate_PipelineJoinType. @@ -81,10 +82,12 @@ var ( PipelineStepUpdate_PipelineJoinType_name = map[int32]string{ 0: "Unknown", 1: "Inner", + 2: "Outer", } PipelineStepUpdate_PipelineJoinType_value = map[string]int32{ "Unknown": 0, "Inner": 1, + "Outer": 2, } ) @@ -254,8 +257,8 @@ type PipelineStepUpdate struct { Ty PipelineStepUpdate_PipelineJoinType `protobuf:"varint,3,opt,name=ty,proto3,enum=seldon.mlops.chainer.PipelineStepUpdate_PipelineJoinType" json:"ty,omitempty"` PassEmptyResponses bool `protobuf:"varint,4,opt,name=passEmptyResponses,proto3" json:"passEmptyResponses,omitempty"` // Forward empty response to following steps, default false JoinWindowMs *uint32 `protobuf:"varint,5,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs, some nozero default (TBD) - TensorNames []string `protobuf:"bytes,6,rep,name=tensorNames,proto3" json:"tensorNames,omitempty"` // optional list of output tensors - must be same cardinality as tensors in inputs - TensorMap map[string]string `protobuf:"bytes,7,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings + TensorMap map[string]string `protobuf:"bytes,6,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings + Batch *Batch `protobuf:"bytes,7,opt,name=batch,proto3" json:"batch,omitempty"` // Batch settings } func (x *PipelineStepUpdate) Reset() { @@ -325,20 +328,83 @@ func (x *PipelineStepUpdate) GetJoinWindowMs() uint32 { return 0 } -func (x *PipelineStepUpdate) GetTensorNames() []string { +func (x *PipelineStepUpdate) GetTensorMap() map[string]string { if x != nil { - return x.TensorNames + return x.TensorMap } return nil } -func (x *PipelineStepUpdate) GetTensorMap() map[string]string { +func (x *PipelineStepUpdate) GetBatch() *Batch { if x != nil { - return x.TensorMap + return x.Batch } return nil } +type Batch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Size *uint32 `protobuf:"varint,1,opt,name=size,proto3,oneof" json:"size,omitempty"` + WindowMs *uint32 `protobuf:"varint,2,opt,name=windowMs,proto3,oneof" json:"windowMs,omitempty"` + Rolling bool `protobuf:"varint,3,opt,name=rolling,proto3" json:"rolling,omitempty"` +} + +func (x *Batch) Reset() { + *x = Batch{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Batch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Batch) ProtoMessage() {} + +func (x *Batch) ProtoReflect() protoreflect.Message { + mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Batch.ProtoReflect.Descriptor instead. +func (*Batch) Descriptor() ([]byte, []int) { + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{3} +} + +func (x *Batch) GetSize() uint32 { + if x != nil && x.Size != nil { + return *x.Size + } + return 0 +} + +func (x *Batch) GetWindowMs() uint32 { + if x != nil && x.WindowMs != nil { + return *x.WindowMs + } + return 0 +} + +func (x *Batch) GetRolling() bool { + if x != nil { + return x.Rolling + } + return false +} + type PipelineUpdateStatusMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -353,7 +419,7 @@ type PipelineUpdateStatusMessage struct { func (x *PipelineUpdateStatusMessage) Reset() { *x = PipelineUpdateStatusMessage{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + mi := &file_mlops_chainer_chainer_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +432,7 @@ func (x *PipelineUpdateStatusMessage) String() string { func (*PipelineUpdateStatusMessage) ProtoMessage() {} func (x *PipelineUpdateStatusMessage) ProtoReflect() protoreflect.Message { - mi := &file_mlops_chainer_chainer_proto_msgTypes[3] + mi := &file_mlops_chainer_chainer_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -379,7 +445,7 @@ func (x *PipelineUpdateStatusMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineUpdateStatusMessage.ProtoReflect.Descriptor instead. func (*PipelineUpdateStatusMessage) Descriptor() ([]byte, []int) { - return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{3} + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{4} } func (x *PipelineUpdateStatusMessage) GetUpdate() *PipelineUpdateMessage { @@ -412,7 +478,7 @@ type PipelineUpdateStatusResponse struct { func (x *PipelineUpdateStatusResponse) Reset() { *x = PipelineUpdateStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + mi := &file_mlops_chainer_chainer_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -425,7 +491,7 @@ func (x *PipelineUpdateStatusResponse) String() string { func (*PipelineUpdateStatusResponse) ProtoMessage() {} func (x *PipelineUpdateStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_chainer_chainer_proto_msgTypes[4] + mi := &file_mlops_chainer_chainer_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -438,7 +504,7 @@ func (x *PipelineUpdateStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineUpdateStatusResponse.ProtoReflect.Descriptor instead. func (*PipelineUpdateStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{4} + return file_mlops_chainer_chainer_proto_rawDescGZIP(), []int{5} } var File_mlops_chainer_chainer_proto protoreflect.FileDescriptor @@ -469,7 +535,7 @@ var file_mlops_chainer_chainer_proto_rawDesc = []byte{ 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xda, 0x03, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xf6, 0x03, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x6e, 0x6b, 0x18, 0x02, @@ -483,57 +549,66 @@ var file_mlops_chainer_chainer_proto_rawDesc = []byte{ 0x08, 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, - 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, - 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x55, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, - 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2a, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x10, - 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x4d, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x89, 0x02, 0x0a, 0x07, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x55, + 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0x32, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x57, 0x0a, 0x17, 0x69, 0x6f, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x73, - 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x53, 0x74, 0x65, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x35, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x6e, 0x6e, 0x65, 0x72, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x10, 0x02, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x71, + 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, + 0x73, 0x22, 0x94, 0x01, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x43, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x89, 0x02, 0x0a, 0x07, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x12, 0x7e, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x32, + 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x57, 0x0a, 0x17, 0x69, 0x6f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5a, + 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -549,32 +624,34 @@ func file_mlops_chainer_chainer_proto_rawDescGZIP() []byte { } var file_mlops_chainer_chainer_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_mlops_chainer_chainer_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_mlops_chainer_chainer_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_mlops_chainer_chainer_proto_goTypes = []interface{}{ (PipelineUpdateMessage_PipelineOperation)(0), // 0: seldon.mlops.chainer.PipelineUpdateMessage.PipelineOperation (PipelineStepUpdate_PipelineJoinType)(0), // 1: seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType (*PipelineSubscriptionRequest)(nil), // 2: seldon.mlops.chainer.PipelineSubscriptionRequest (*PipelineUpdateMessage)(nil), // 3: seldon.mlops.chainer.PipelineUpdateMessage (*PipelineStepUpdate)(nil), // 4: seldon.mlops.chainer.PipelineStepUpdate - (*PipelineUpdateStatusMessage)(nil), // 5: seldon.mlops.chainer.PipelineUpdateStatusMessage - (*PipelineUpdateStatusResponse)(nil), // 6: seldon.mlops.chainer.PipelineUpdateStatusResponse - nil, // 7: seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry + (*Batch)(nil), // 5: seldon.mlops.chainer.Batch + (*PipelineUpdateStatusMessage)(nil), // 6: seldon.mlops.chainer.PipelineUpdateStatusMessage + (*PipelineUpdateStatusResponse)(nil), // 7: seldon.mlops.chainer.PipelineUpdateStatusResponse + nil, // 8: seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry } var file_mlops_chainer_chainer_proto_depIdxs = []int32{ 0, // 0: seldon.mlops.chainer.PipelineUpdateMessage.op:type_name -> seldon.mlops.chainer.PipelineUpdateMessage.PipelineOperation 4, // 1: seldon.mlops.chainer.PipelineUpdateMessage.updates:type_name -> seldon.mlops.chainer.PipelineStepUpdate 1, // 2: seldon.mlops.chainer.PipelineStepUpdate.ty:type_name -> seldon.mlops.chainer.PipelineStepUpdate.PipelineJoinType - 7, // 3: seldon.mlops.chainer.PipelineStepUpdate.tensorMap:type_name -> seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry - 3, // 4: seldon.mlops.chainer.PipelineUpdateStatusMessage.update:type_name -> seldon.mlops.chainer.PipelineUpdateMessage - 2, // 5: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:input_type -> seldon.mlops.chainer.PipelineSubscriptionRequest - 5, // 6: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:input_type -> seldon.mlops.chainer.PipelineUpdateStatusMessage - 3, // 7: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:output_type -> seldon.mlops.chainer.PipelineUpdateMessage - 6, // 8: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:output_type -> seldon.mlops.chainer.PipelineUpdateStatusResponse - 7, // [7:9] is the sub-list for method output_type - 5, // [5:7] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 8, // 3: seldon.mlops.chainer.PipelineStepUpdate.tensorMap:type_name -> seldon.mlops.chainer.PipelineStepUpdate.TensorMapEntry + 5, // 4: seldon.mlops.chainer.PipelineStepUpdate.batch:type_name -> seldon.mlops.chainer.Batch + 3, // 5: seldon.mlops.chainer.PipelineUpdateStatusMessage.update:type_name -> seldon.mlops.chainer.PipelineUpdateMessage + 2, // 6: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:input_type -> seldon.mlops.chainer.PipelineSubscriptionRequest + 6, // 7: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:input_type -> seldon.mlops.chainer.PipelineUpdateStatusMessage + 3, // 8: seldon.mlops.chainer.Chainer.SubscribePipelineUpdates:output_type -> seldon.mlops.chainer.PipelineUpdateMessage + 7, // 9: seldon.mlops.chainer.Chainer.PipelineUpdateEvent:output_type -> seldon.mlops.chainer.PipelineUpdateStatusResponse + 8, // [8:10] is the sub-list for method output_type + 6, // [6:8] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_mlops_chainer_chainer_proto_init() } @@ -620,7 +697,7 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineUpdateStatusMessage); i { + switch v := v.(*Batch); i { case 0: return &v.state case 1: @@ -632,6 +709,18 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PipelineUpdateStatusMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_chainer_chainer_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PipelineUpdateStatusResponse); i { case 0: return &v.state @@ -645,13 +734,14 @@ func file_mlops_chainer_chainer_proto_init() { } } file_mlops_chainer_chainer_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_mlops_chainer_chainer_proto_msgTypes[3].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mlops_chainer_chainer_proto_rawDesc, NumEnums: 2, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/mlops/chainer/chainer.proto b/apis/mlops/chainer/chainer.proto index df66e04a7c..fef0877d33 100644 --- a/apis/mlops/chainer/chainer.proto +++ b/apis/mlops/chainer/chainer.proto @@ -26,6 +26,7 @@ message PipelineStepUpdate { enum PipelineJoinType { Unknown = 0; Inner = 1; + Outer = 2; } // https://docs.google.com/document/d/1tX-uaOvngx1RpEyWEZ4EbEcU8D0OgYuRWVb2UAi85n4/edit // Pipeline Resource example, e.g. transform.outputs.traffic @@ -35,8 +36,14 @@ message PipelineStepUpdate { PipelineJoinType ty = 3; bool passEmptyResponses = 4; // Forward empty response to following steps, default false optional uint32 joinWindowMs = 5; // Join window millisecs, some nozero default (TBD) - repeated string tensorNames = 6; // optional list of output tensors - must be same cardinality as tensors in inputs - map tensorMap = 7; // optional map of tensor name mappings + map tensorMap = 6; // optional map of tensor name mappings + Batch batch = 7; // Batch settings +} + +message Batch { + optional uint32 size = 1; + optional uint32 windowMs = 2; + bool rolling = 3; } message PipelineUpdateStatusMessage { diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt new file mode 100644 index 0000000000..b2a587ad19 --- /dev/null +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/BatchKt.kt @@ -0,0 +1,93 @@ +//Generated by the protocol buffer compiler. DO NOT EDIT! +// source: chainer.proto + +package io.seldon.mlops.chainer; + +@kotlin.jvm.JvmSynthetic +inline fun batch(block: io.seldon.mlops.chainer.BatchKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.Batch = + io.seldon.mlops.chainer.BatchKt.Dsl._create(io.seldon.mlops.chainer.ChainerOuterClass.Batch.newBuilder()).apply { block() }._build() +object BatchKt { + @kotlin.OptIn(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class) + @com.google.protobuf.kotlin.ProtoDslMarker + class Dsl private constructor( + private val _builder: io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder + ) { + companion object { + @kotlin.jvm.JvmSynthetic + @kotlin.PublishedApi + internal fun _create(builder: io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder): Dsl = Dsl(builder) + } + + @kotlin.jvm.JvmSynthetic + @kotlin.PublishedApi + internal fun _build(): io.seldon.mlops.chainer.ChainerOuterClass.Batch = _builder.build() + + /** + * optional uint32 size = 1; + */ + var size: kotlin.Int + @JvmName("getSize") + get() = _builder.getSize() + @JvmName("setSize") + set(value) { + _builder.setSize(value) + } + /** + * optional uint32 size = 1; + */ + fun clearSize() { + _builder.clearSize() + } + /** + * optional uint32 size = 1; + * @return Whether the size field is set. + */ + fun hasSize(): kotlin.Boolean { + return _builder.hasSize() + } + + /** + * optional uint32 windowMs = 2; + */ + var windowMs: kotlin.Int + @JvmName("getWindowMs") + get() = _builder.getWindowMs() + @JvmName("setWindowMs") + set(value) { + _builder.setWindowMs(value) + } + /** + * optional uint32 windowMs = 2; + */ + fun clearWindowMs() { + _builder.clearWindowMs() + } + /** + * optional uint32 windowMs = 2; + * @return Whether the windowMs field is set. + */ + fun hasWindowMs(): kotlin.Boolean { + return _builder.hasWindowMs() + } + + /** + * bool rolling = 3; + */ + var rolling: kotlin.Boolean + @JvmName("getRolling") + get() = _builder.getRolling() + @JvmName("setRolling") + set(value) { + _builder.setRolling(value) + } + /** + * bool rolling = 3; + */ + fun clearRolling() { + _builder.clearRolling() + } + } +} +@kotlin.jvm.JvmSynthetic +inline fun io.seldon.mlops.chainer.ChainerOuterClass.Batch.copy(block: io.seldon.mlops.chainer.BatchKt.Dsl.() -> kotlin.Unit): io.seldon.mlops.chainer.ChainerOuterClass.Batch = + io.seldon.mlops.chainer.BatchKt.Dsl._create(this.toBuilder()).apply { block() }._build() diff --git a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java index 49d49769c4..498069c795 100644 --- a/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java +++ b/apis/mlops/chainer/kotlin/io/seldon/mlops/chainer/ChainerOuterClass.java @@ -2074,53 +2074,12 @@ public interface PipelineStepUpdateOrBuilder extends */ int getJoinWindowMs(); - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @return A list containing the tensorNames. - */ - java.util.List - getTensorNamesList(); - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @return The count of tensorNames. - */ - int getTensorNamesCount(); - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param index The index of the element to return. - * @return The tensorNames at the given index. - */ - java.lang.String getTensorNames(int index); - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param index The index of the value to return. - * @return The bytes of the tensorNames at the given index. - */ - com.google.protobuf.ByteString - getTensorNamesBytes(int index); - /** *
      * optional map of tensor name mappings
      * 
* - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ int getTensorMapCount(); /** @@ -2128,7 +2087,7 @@ public interface PipelineStepUpdateOrBuilder extends * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ boolean containsTensorMap( java.lang.String key); @@ -2143,7 +2102,7 @@ boolean containsTensorMap( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ java.util.Map getTensorMapMap(); @@ -2152,7 +2111,7 @@ boolean containsTensorMap( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ java.lang.String getTensorMapOrDefault( @@ -2163,11 +2122,38 @@ java.lang.String getTensorMapOrDefault( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ java.lang.String getTensorMapOrThrow( java.lang.String key); + + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return Whether the batch field is set. + */ + boolean hasBatch(); + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return The batch. + */ + io.seldon.mlops.chainer.ChainerOuterClass.Batch getBatch(); + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder getBatchOrBuilder(); } /** * Protobuf type {@code seldon.mlops.chainer.PipelineStepUpdate} @@ -2185,7 +2171,6 @@ private PipelineStepUpdate() { sources_ = com.google.protobuf.LazyStringArrayList.EMPTY; sink_ = ""; ty_ = 0; - tensorNames_ = com.google.protobuf.LazyStringArrayList.EMPTY; } @java.lang.Override @@ -2251,19 +2236,10 @@ private PipelineStepUpdate( break; } case 50: { - java.lang.String s = input.readStringRequireUtf8(); if (!((mutable_bitField0_ & 0x00000004) != 0)) { - tensorNames_ = new com.google.protobuf.LazyStringArrayList(); - mutable_bitField0_ |= 0x00000004; - } - tensorNames_.add(s); - break; - } - case 58: { - if (!((mutable_bitField0_ & 0x00000008) != 0)) { tensorMap_ = com.google.protobuf.MapField.newMapField( TensorMapDefaultEntryHolder.defaultEntry); - mutable_bitField0_ |= 0x00000008; + mutable_bitField0_ |= 0x00000004; } com.google.protobuf.MapEntry tensorMap__ = input.readMessage( @@ -2272,6 +2248,19 @@ private PipelineStepUpdate( tensorMap__.getKey(), tensorMap__.getValue()); break; } + case 58: { + io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder subBuilder = null; + if (batch_ != null) { + subBuilder = batch_.toBuilder(); + } + batch_ = input.readMessage(io.seldon.mlops.chainer.ChainerOuterClass.Batch.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(batch_); + batch_ = subBuilder.buildPartial(); + } + + break; + } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { @@ -2290,9 +2279,6 @@ private PipelineStepUpdate( if (((mutable_bitField0_ & 0x00000001) != 0)) { sources_ = sources_.getUnmodifiableView(); } - if (((mutable_bitField0_ & 0x00000004) != 0)) { - tensorNames_ = tensorNames_.getUnmodifiableView(); - } this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } @@ -2307,7 +2293,7 @@ private PipelineStepUpdate( protected com.google.protobuf.MapField internalGetMapField( int number) { switch (number) { - case 7: + case 6: return internalGetTensorMap(); default: throw new RuntimeException( @@ -2335,6 +2321,10 @@ public enum PipelineJoinType * Inner = 1; */ Inner(1), + /** + * Outer = 2; + */ + Outer(2), UNRECOGNIZED(-1), ; @@ -2346,6 +2336,10 @@ public enum PipelineJoinType * Inner = 1; */ public static final int Inner_VALUE = 1; + /** + * Outer = 2; + */ + public static final int Outer_VALUE = 2; public final int getNumber() { @@ -2374,6 +2368,7 @@ public static PipelineJoinType forNumber(int value) { switch (value) { case 0: return Unknown; case 1: return Inner; + case 2: return Outer; default: return null; } } @@ -2589,58 +2584,7 @@ public int getJoinWindowMs() { return joinWindowMs_; } - public static final int TENSORNAMES_FIELD_NUMBER = 6; - private com.google.protobuf.LazyStringList tensorNames_; - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @return A list containing the tensorNames. - */ - public com.google.protobuf.ProtocolStringList - getTensorNamesList() { - return tensorNames_; - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @return The count of tensorNames. - */ - public int getTensorNamesCount() { - return tensorNames_.size(); - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param index The index of the element to return. - * @return The tensorNames at the given index. - */ - public java.lang.String getTensorNames(int index) { - return tensorNames_.get(index); - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param index The index of the value to return. - * @return The bytes of the tensorNames at the given index. - */ - public com.google.protobuf.ByteString - getTensorNamesBytes(int index) { - return tensorNames_.getByteString(index); - } - - public static final int TENSORMAP_FIELD_NUMBER = 7; + public static final int TENSORMAP_FIELD_NUMBER = 6; private static final class TensorMapDefaultEntryHolder { static final com.google.protobuf.MapEntry< java.lang.String, java.lang.String> defaultEntry = @@ -2671,7 +2615,7 @@ public int getTensorMapCount() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -2693,7 +2637,7 @@ public java.util.Map getTensorMap() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -2705,7 +2649,7 @@ public java.util.Map getTensorMapMap() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -2722,7 +2666,7 @@ public java.lang.String getTensorMapOrDefault( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -2737,6 +2681,44 @@ public java.lang.String getTensorMapOrThrow( return map.get(key); } + public static final int BATCH_FIELD_NUMBER = 7; + private io.seldon.mlops.chainer.ChainerOuterClass.Batch batch_; + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return Whether the batch field is set. + */ + @java.lang.Override + public boolean hasBatch() { + return batch_ != null; + } + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return The batch. + */ + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.Batch getBatch() { + return batch_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + } + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder getBatchOrBuilder() { + return getBatch(); + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -2766,15 +2748,15 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000001) != 0)) { output.writeUInt32(5, joinWindowMs_); } - for (int i = 0; i < tensorNames_.size(); i++) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 6, tensorNames_.getRaw(i)); - } com.google.protobuf.GeneratedMessageV3 .serializeStringMapTo( output, internalGetTensorMap(), TensorMapDefaultEntryHolder.defaultEntry, - 7); + 6); + if (batch_ != null) { + output.writeMessage(7, getBatch()); + } unknownFields.writeTo(output); } @@ -2807,14 +2789,6 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeUInt32Size(5, joinWindowMs_); } - { - int dataSize = 0; - for (int i = 0; i < tensorNames_.size(); i++) { - dataSize += computeStringSizeNoTag(tensorNames_.getRaw(i)); - } - size += dataSize; - size += 1 * getTensorNamesList().size(); - } for (java.util.Map.Entry entry : internalGetTensorMap().getMap().entrySet()) { com.google.protobuf.MapEntry @@ -2823,7 +2797,11 @@ public int getSerializedSize() { .setValue(entry.getValue()) .build(); size += com.google.protobuf.CodedOutputStream - .computeMessageSize(7, tensorMap__); + .computeMessageSize(6, tensorMap__); + } + if (batch_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, getBatch()); } size += unknownFields.getSerializedSize(); memoizedSize = size; @@ -2852,10 +2830,13 @@ public boolean equals(final java.lang.Object obj) { if (getJoinWindowMs() != other.getJoinWindowMs()) return false; } - if (!getTensorNamesList() - .equals(other.getTensorNamesList())) return false; if (!internalGetTensorMap().equals( other.internalGetTensorMap())) return false; + if (hasBatch() != other.hasBatch()) return false; + if (hasBatch()) { + if (!getBatch() + .equals(other.getBatch())) return false; + } if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -2882,14 +2863,14 @@ public int hashCode() { hash = (37 * hash) + JOINWINDOWMS_FIELD_NUMBER; hash = (53 * hash) + getJoinWindowMs(); } - if (getTensorNamesCount() > 0) { - hash = (37 * hash) + TENSORNAMES_FIELD_NUMBER; - hash = (53 * hash) + getTensorNamesList().hashCode(); - } if (!internalGetTensorMap().getMap().isEmpty()) { hash = (37 * hash) + TENSORMAP_FIELD_NUMBER; hash = (53 * hash) + internalGetTensorMap().hashCode(); } + if (hasBatch()) { + hash = (37 * hash) + BATCH_FIELD_NUMBER; + hash = (53 * hash) + getBatch().hashCode(); + } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -3001,7 +2982,7 @@ public static final class Builder extends protected com.google.protobuf.MapField internalGetMapField( int number) { switch (number) { - case 7: + case 6: return internalGetTensorMap(); default: throw new RuntimeException( @@ -3012,7 +2993,7 @@ protected com.google.protobuf.MapField internalGetMapField( protected com.google.protobuf.MapField internalGetMutableMapField( int number) { switch (number) { - case 7: + case 6: return internalGetMutableTensorMap(); default: throw new RuntimeException( @@ -3055,9 +3036,13 @@ public Builder clear() { joinWindowMs_ = 0; bitField0_ = (bitField0_ & ~0x00000002); - tensorNames_ = com.google.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000004); internalGetMutableTensorMap().clear(); + if (batchBuilder_ == null) { + batch_ = null; + } else { + batch_ = null; + batchBuilder_ = null; + } return this; } @@ -3098,13 +3083,13 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate buildPartial result.joinWindowMs_ = joinWindowMs_; to_bitField0_ |= 0x00000001; } - if (((bitField0_ & 0x00000004) != 0)) { - tensorNames_ = tensorNames_.getUnmodifiableView(); - bitField0_ = (bitField0_ & ~0x00000004); - } - result.tensorNames_ = tensorNames_; result.tensorMap_ = internalGetTensorMap(); result.tensorMap_.makeImmutable(); + if (batchBuilder_ == null) { + result.batch_ = batch_; + } else { + result.batch_ = batchBuilder_.build(); + } result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -3177,18 +3162,11 @@ public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepU if (other.hasJoinWindowMs()) { setJoinWindowMs(other.getJoinWindowMs()); } - if (!other.tensorNames_.isEmpty()) { - if (tensorNames_.isEmpty()) { - tensorNames_ = other.tensorNames_; - bitField0_ = (bitField0_ & ~0x00000004); - } else { - ensureTensorNamesIsMutable(); - tensorNames_.addAll(other.tensorNames_); - } - onChanged(); - } internalGetMutableTensorMap().mergeFrom( other.internalGetTensorMap()); + if (other.hasBatch()) { + mergeBatch(other.getBatch()); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -3611,152 +3589,6 @@ public Builder clearJoinWindowMs() { return this; } - private com.google.protobuf.LazyStringList tensorNames_ = com.google.protobuf.LazyStringArrayList.EMPTY; - private void ensureTensorNamesIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { - tensorNames_ = new com.google.protobuf.LazyStringArrayList(tensorNames_); - bitField0_ |= 0x00000004; - } - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @return A list containing the tensorNames. - */ - public com.google.protobuf.ProtocolStringList - getTensorNamesList() { - return tensorNames_.getUnmodifiableView(); - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @return The count of tensorNames. - */ - public int getTensorNamesCount() { - return tensorNames_.size(); - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param index The index of the element to return. - * @return The tensorNames at the given index. - */ - public java.lang.String getTensorNames(int index) { - return tensorNames_.get(index); - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param index The index of the value to return. - * @return The bytes of the tensorNames at the given index. - */ - public com.google.protobuf.ByteString - getTensorNamesBytes(int index) { - return tensorNames_.getByteString(index); - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param index The index to set the value at. - * @param value The tensorNames to set. - * @return This builder for chaining. - */ - public Builder setTensorNames( - int index, java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureTensorNamesIsMutable(); - tensorNames_.set(index, value); - onChanged(); - return this; - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param value The tensorNames to add. - * @return This builder for chaining. - */ - public Builder addTensorNames( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureTensorNamesIsMutable(); - tensorNames_.add(value); - onChanged(); - return this; - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param values The tensorNames to add. - * @return This builder for chaining. - */ - public Builder addAllTensorNames( - java.lang.Iterable values) { - ensureTensorNamesIsMutable(); - com.google.protobuf.AbstractMessageLite.Builder.addAll( - values, tensorNames_); - onChanged(); - return this; - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @return This builder for chaining. - */ - public Builder clearTensorNames() { - tensorNames_ = com.google.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000004); - onChanged(); - return this; - } - /** - *
-       * optional list of output tensors - must be same cardinality as tensors in inputs
-       * 
- * - * repeated string tensorNames = 6; - * @param value The bytes of the tensorNames to add. - * @return This builder for chaining. - */ - public Builder addTensorNamesBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - checkByteStringIsUtf8(value); - ensureTensorNamesIsMutable(); - tensorNames_.add(value); - onChanged(); - return this; - } - private com.google.protobuf.MapField< java.lang.String, java.lang.String> tensorMap_; private com.google.protobuf.MapField @@ -3788,7 +3620,7 @@ public int getTensorMapCount() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -3810,7 +3642,7 @@ public java.util.Map getTensorMap() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -3822,7 +3654,7 @@ public java.util.Map getTensorMapMap() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -3839,7 +3671,7 @@ public java.lang.String getTensorMapOrDefault( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @java.lang.Override @@ -3864,7 +3696,7 @@ public Builder clearTensorMap() { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ public Builder removeTensorMap( @@ -3887,7 +3719,7 @@ public Builder removeTensorMap( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ public Builder putTensorMap( java.lang.String key, @@ -3903,7 +3735,7 @@ public Builder putTensorMap( * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ public Builder putAllTensorMap( @@ -3912,54 +3744,902 @@ public Builder putAllTensorMap( .putAll(values); return this; } - @java.lang.Override - public final Builder setUnknownFields( - final com.google.protobuf.UnknownFieldSet unknownFields) { - return super.setUnknownFields(unknownFields); - } - @java.lang.Override - public final Builder mergeUnknownFields( - final com.google.protobuf.UnknownFieldSet unknownFields) { - return super.mergeUnknownFields(unknownFields); + private io.seldon.mlops.chainer.ChainerOuterClass.Batch batch_; + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> batchBuilder_; + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return Whether the batch field is set. + */ + public boolean hasBatch() { + return batchBuilder_ != null || batch_ != null; } - - - // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineStepUpdate) - } - - // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineStepUpdate) - private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate DEFAULT_INSTANCE; - static { - DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate(); - } - - public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstance() { - return DEFAULT_INSTANCE; - } - - private static final com.google.protobuf.Parser + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return The batch. + */ + public io.seldon.mlops.chainer.ChainerOuterClass.Batch getBatch() { + if (batchBuilder_ == null) { + return batch_ == null ? io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + } else { + return batchBuilder_.getMessage(); + } + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public Builder setBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { + if (batchBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + batch_ = value; + onChanged(); + } else { + batchBuilder_.setMessage(value); + } + + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public Builder setBatch( + io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder builderForValue) { + if (batchBuilder_ == null) { + batch_ = builderForValue.build(); + onChanged(); + } else { + batchBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public Builder mergeBatch(io.seldon.mlops.chainer.ChainerOuterClass.Batch value) { + if (batchBuilder_ == null) { + if (batch_ != null) { + batch_ = + io.seldon.mlops.chainer.ChainerOuterClass.Batch.newBuilder(batch_).mergeFrom(value).buildPartial(); + } else { + batch_ = value; + } + onChanged(); + } else { + batchBuilder_.mergeFrom(value); + } + + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public Builder clearBatch() { + if (batchBuilder_ == null) { + batch_ = null; + onChanged(); + } else { + batch_ = null; + batchBuilder_ = null; + } + + return this; + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder getBatchBuilder() { + + onChanged(); + return getBatchFieldBuilder().getBuilder(); + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + public io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder getBatchOrBuilder() { + if (batchBuilder_ != null) { + return batchBuilder_.getMessageOrBuilder(); + } else { + return batch_ == null ? + io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance() : batch_; + } + } + /** + *
+       * Batch settings
+       * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + private com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder> + getBatchFieldBuilder() { + if (batchBuilder_ == null) { + batchBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + io.seldon.mlops.chainer.ChainerOuterClass.Batch, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder, io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder>( + getBatch(), + getParentForChildren(), + isClean()); + batch_ = null; + } + return batchBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.PipelineStepUpdate) + } + + // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.PipelineStepUpdate) + private static final io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate(); + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override - public PipelineStepUpdate parsePartialFrom( + public PipelineStepUpdate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PipelineStepUpdate(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface BatchOrBuilder extends + // @@protoc_insertion_point(interface_extends:seldon.mlops.chainer.Batch) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint32 size = 1; + * @return Whether the size field is set. + */ + boolean hasSize(); + /** + * optional uint32 size = 1; + * @return The size. + */ + int getSize(); + + /** + * optional uint32 windowMs = 2; + * @return Whether the windowMs field is set. + */ + boolean hasWindowMs(); + /** + * optional uint32 windowMs = 2; + * @return The windowMs. + */ + int getWindowMs(); + + /** + * bool rolling = 3; + * @return The rolling. + */ + boolean getRolling(); + } + /** + * Protobuf type {@code seldon.mlops.chainer.Batch} + */ + public static final class Batch extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:seldon.mlops.chainer.Batch) + BatchOrBuilder { + private static final long serialVersionUID = 0L; + // Use Batch.newBuilder() to construct. + private Batch(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Batch() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Batch(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Batch( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + size_ = input.readUInt32(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + windowMs_ = input.readUInt32(); + break; + } + case 24: { + + rolling_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_Batch_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_Batch_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.Batch.class, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder.class); + } + + private int bitField0_; + public static final int SIZE_FIELD_NUMBER = 1; + private int size_; + /** + * optional uint32 size = 1; + * @return Whether the size field is set. + */ + @java.lang.Override + public boolean hasSize() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint32 size = 1; + * @return The size. + */ + @java.lang.Override + public int getSize() { + return size_; + } + + public static final int WINDOWMS_FIELD_NUMBER = 2; + private int windowMs_; + /** + * optional uint32 windowMs = 2; + * @return Whether the windowMs field is set. + */ + @java.lang.Override + public boolean hasWindowMs() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint32 windowMs = 2; + * @return The windowMs. + */ + @java.lang.Override + public int getWindowMs() { + return windowMs_; + } + + public static final int ROLLING_FIELD_NUMBER = 3; + private boolean rolling_; + /** + * bool rolling = 3; + * @return The rolling. + */ + @java.lang.Override + public boolean getRolling() { + return rolling_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, size_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt32(2, windowMs_); + } + if (rolling_ != false) { + output.writeBool(3, rolling_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, size_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, windowMs_); + } + if (rolling_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(3, rolling_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.seldon.mlops.chainer.ChainerOuterClass.Batch)) { + return super.equals(obj); + } + io.seldon.mlops.chainer.ChainerOuterClass.Batch other = (io.seldon.mlops.chainer.ChainerOuterClass.Batch) obj; + + if (hasSize() != other.hasSize()) return false; + if (hasSize()) { + if (getSize() + != other.getSize()) return false; + } + if (hasWindowMs() != other.hasWindowMs()) return false; + if (hasWindowMs()) { + if (getWindowMs() + != other.getWindowMs()) return false; + } + if (getRolling() + != other.getRolling()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSize()) { + hash = (37 * hash) + SIZE_FIELD_NUMBER; + hash = (53 * hash) + getSize(); + } + if (hasWindowMs()) { + hash = (37 * hash) + WINDOWMS_FIELD_NUMBER; + hash = (53 * hash) + getWindowMs(); + } + hash = (37 * hash) + ROLLING_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getRolling()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.seldon.mlops.chainer.ChainerOuterClass.Batch prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code seldon.mlops.chainer.Batch} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:seldon.mlops.chainer.Batch) + io.seldon.mlops.chainer.ChainerOuterClass.BatchOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_Batch_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_Batch_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.seldon.mlops.chainer.ChainerOuterClass.Batch.class, io.seldon.mlops.chainer.ChainerOuterClass.Batch.Builder.class); + } + + // Construct using io.seldon.mlops.chainer.ChainerOuterClass.Batch.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + size_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + windowMs_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + rolling_ = false; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.internal_static_seldon_mlops_chainer_Batch_descriptor; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.Batch getDefaultInstanceForType() { + return io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance(); + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.Batch build() { + io.seldon.mlops.chainer.ChainerOuterClass.Batch result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.seldon.mlops.chainer.ChainerOuterClass.Batch buildPartial() { + io.seldon.mlops.chainer.ChainerOuterClass.Batch result = new io.seldon.mlops.chainer.ChainerOuterClass.Batch(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.size_ = size_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.windowMs_ = windowMs_; + to_bitField0_ |= 0x00000002; + } + result.rolling_ = rolling_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.seldon.mlops.chainer.ChainerOuterClass.Batch) { + return mergeFrom((io.seldon.mlops.chainer.ChainerOuterClass.Batch)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.seldon.mlops.chainer.ChainerOuterClass.Batch other) { + if (other == io.seldon.mlops.chainer.ChainerOuterClass.Batch.getDefaultInstance()) return this; + if (other.hasSize()) { + setSize(other.getSize()); + } + if (other.hasWindowMs()) { + setWindowMs(other.getWindowMs()); + } + if (other.getRolling() != false) { + setRolling(other.getRolling()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + io.seldon.mlops.chainer.ChainerOuterClass.Batch parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (io.seldon.mlops.chainer.ChainerOuterClass.Batch) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int size_ ; + /** + * optional uint32 size = 1; + * @return Whether the size field is set. + */ + @java.lang.Override + public boolean hasSize() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint32 size = 1; + * @return The size. + */ + @java.lang.Override + public int getSize() { + return size_; + } + /** + * optional uint32 size = 1; + * @param value The size to set. + * @return This builder for chaining. + */ + public Builder setSize(int value) { + bitField0_ |= 0x00000001; + size_ = value; + onChanged(); + return this; + } + /** + * optional uint32 size = 1; + * @return This builder for chaining. + */ + public Builder clearSize() { + bitField0_ = (bitField0_ & ~0x00000001); + size_ = 0; + onChanged(); + return this; + } + + private int windowMs_ ; + /** + * optional uint32 windowMs = 2; + * @return Whether the windowMs field is set. + */ + @java.lang.Override + public boolean hasWindowMs() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint32 windowMs = 2; + * @return The windowMs. + */ + @java.lang.Override + public int getWindowMs() { + return windowMs_; + } + /** + * optional uint32 windowMs = 2; + * @param value The windowMs to set. + * @return This builder for chaining. + */ + public Builder setWindowMs(int value) { + bitField0_ |= 0x00000002; + windowMs_ = value; + onChanged(); + return this; + } + /** + * optional uint32 windowMs = 2; + * @return This builder for chaining. + */ + public Builder clearWindowMs() { + bitField0_ = (bitField0_ & ~0x00000002); + windowMs_ = 0; + onChanged(); + return this; + } + + private boolean rolling_ ; + /** + * bool rolling = 3; + * @return The rolling. + */ + @java.lang.Override + public boolean getRolling() { + return rolling_; + } + /** + * bool rolling = 3; + * @param value The rolling to set. + * @return This builder for chaining. + */ + public Builder setRolling(boolean value) { + + rolling_ = value; + onChanged(); + return this; + } + /** + * bool rolling = 3; + * @return This builder for chaining. + */ + public Builder clearRolling() { + + rolling_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:seldon.mlops.chainer.Batch) + } + + // @@protoc_insertion_point(class_scope:seldon.mlops.chainer.Batch) + private static final io.seldon.mlops.chainer.ChainerOuterClass.Batch DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.seldon.mlops.chainer.ChainerOuterClass.Batch(); + } + + public static io.seldon.mlops.chainer.ChainerOuterClass.Batch getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Batch parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return new PipelineStepUpdate(input, extensionRegistry); + return new Batch(input, extensionRegistry); } }; - public static com.google.protobuf.Parser parser() { + public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override - public io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate getDefaultInstanceForType() { + public io.seldon.mlops.chainer.ChainerOuterClass.Batch getDefaultInstanceForType() { return DEFAULT_INSTANCE; } @@ -5305,6 +5985,11 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateStatusResponse ge private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_seldon_mlops_chainer_PipelineStepUpdate_TensorMapEntry_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_seldon_mlops_chainer_Batch_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_seldon_mlops_chainer_Batch_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor internal_static_seldon_mlops_chainer_PipelineUpdateStatusMessage_descriptor; private static final @@ -5332,30 +6017,33 @@ public io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateStatusResponse ge "\t\022\017\n\007version\030\003 \001(\r\022\013\n\003uid\030\004 \001(\t\0229\n\007updat" + "es\030\005 \003(\0132(.seldon.mlops.chainer.Pipeline" + "StepUpdate\"8\n\021PipelineOperation\022\013\n\007Unkno" + - "wn\020\000\022\n\n\006Create\020\001\022\n\n\006Delete\020\002\"\201\003\n\022Pipelin" + + "wn\020\000\022\n\n\006Create\020\001\022\n\n\006Delete\020\002\"\243\003\n\022Pipelin" + "eStepUpdate\022\017\n\007sources\030\001 \003(\t\022\014\n\004sink\030\002 \001" + "(\t\022E\n\002ty\030\003 \001(\01629.seldon.mlops.chainer.Pi" + "pelineStepUpdate.PipelineJoinType\022\032\n\022pas" + "sEmptyResponses\030\004 \001(\010\022\031\n\014joinWindowMs\030\005 " + - "\001(\rH\000\210\001\001\022\023\n\013tensorNames\030\006 \003(\t\022J\n\ttensorM" + - "ap\030\007 \003(\01327.seldon.mlops.chainer.Pipeline" + - "StepUpdate.TensorMapEntry\0320\n\016TensorMapEn" + - "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"*\n\020P" + - "ipelineJoinType\022\013\n\007Unknown\020\000\022\t\n\005Inner\020\001B" + - "\017\n\r_joinWindowMs\"{\n\033PipelineUpdateStatus" + - "Message\022;\n\006update\030\001 \001(\0132+.seldon.mlops.c" + - "hainer.PipelineUpdateMessage\022\017\n\007success\030" + - "\002 \001(\010\022\016\n\006reason\030\003 \001(\t\"\036\n\034PipelineUpdateS" + - "tatusResponse2\211\002\n\007Chainer\022~\n\030SubscribePi" + - "pelineUpdates\0221.seldon.mlops.chainer.Pip" + - "elineSubscriptionRequest\032+.seldon.mlops." + - "chainer.PipelineUpdateMessage\"\0000\001\022~\n\023Pip" + - "elineUpdateEvent\0221.seldon.mlops.chainer." + - "PipelineUpdateStatusMessage\0322.seldon.mlo" + - "ps.chainer.PipelineUpdateStatusResponse\"" + - "\000BW\n\027io.seldon.mlops.chainerZ - * optional list of output tensors - must be same cardinality as tensors in inputs - * - * - * repeated string tensorNames = 6; - * @return A list containing the tensorNames. - */ - val tensorNames: com.google.protobuf.kotlin.DslList - @kotlin.OptIn(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class) - get() = com.google.protobuf.kotlin.DslList( - _builder.getTensorNamesList() - ) - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param value The tensorNames to add. - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("addTensorNames") - fun com.google.protobuf.kotlin.DslList.add(value: kotlin.String) { - _builder.addTensorNames(value) - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param value The tensorNames to add. - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("plusAssignTensorNames") - operator fun com.google.protobuf.kotlin.DslList.plusAssign(value: kotlin.String) { - _builder.addTensorNames(value) - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param values The tensorNames to add. - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("addAllTensorNames") - fun com.google.protobuf.kotlin.DslList.addAll(values: kotlin.collections.Iterable) { - _builder.addAllTensorNames(values) - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param values The tensorNames to add. - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("plusAssignAllTensorNames") - operator fun com.google.protobuf.kotlin.DslList.plusAssign(values: kotlin.collections.Iterable) { - _builder.addAllTensorNames(values) - } - /** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - * @param index The index to set the value at. - * @param value The tensorNames to set. - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("setTensorNames") - operator fun com.google.protobuf.kotlin.DslList.set(index: kotlin.Int, value: kotlin.String) { - _builder.setTensorNames(index, value) - }/** - *
-     * optional list of output tensors - must be same cardinality as tensors in inputs
-     * 
- * - * repeated string tensorNames = 6; - */ - @kotlin.jvm.JvmSynthetic - @kotlin.jvm.JvmName("clearTensorNames") - fun com.google.protobuf.kotlin.DslList.clear() { - _builder.clearTensorNames() - } /** * An uninstantiable, behaviorless type to represent the field in * generics. @@ -334,7 +238,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ val tensorMap: com.google.protobuf.kotlin.DslMap @kotlin.jvm.JvmSynthetic @@ -347,7 +251,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @JvmName("putTensorMap") fun com.google.protobuf.kotlin.DslMap @@ -359,7 +263,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @kotlin.jvm.JvmSynthetic @JvmName("setTensorMap") @@ -372,7 +276,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @kotlin.jvm.JvmSynthetic @JvmName("removeTensorMap") @@ -385,7 +289,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @kotlin.jvm.JvmSynthetic @JvmName("putAllTensorMap") @@ -398,7 +302,7 @@ object PipelineStepUpdateKt { * optional map of tensor name mappings * * - * map<string, string> tensorMap = 7; + * map<string, string> tensorMap = 6; */ @kotlin.jvm.JvmSynthetic @JvmName("clearTensorMap") @@ -406,6 +310,42 @@ object PipelineStepUpdateKt { .clear() { _builder.clearTensorMap() } + + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + var batch: io.seldon.mlops.chainer.ChainerOuterClass.Batch + @JvmName("getBatch") + get() = _builder.getBatch() + @JvmName("setBatch") + set(value) { + _builder.setBatch(value) + } + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + */ + fun clearBatch() { + _builder.clearBatch() + } + /** + *
+     * Batch settings
+     * 
+ * + * .seldon.mlops.chainer.Batch batch = 7; + * @return Whether the batch field is set. + */ + fun hasBatch(): kotlin.Boolean { + return _builder.hasBatch() + } } } @kotlin.jvm.JvmSynthetic diff --git a/apis/mlops/scheduler/scheduler.pb.go b/apis/mlops/scheduler/scheduler.pb.go index 31ea0ad1d2..ba9d95c204 100644 --- a/apis/mlops/scheduler/scheduler.pb.go +++ b/apis/mlops/scheduler/scheduler.pb.go @@ -219,7 +219,7 @@ func (x PipelineVersionState_PipelineStatus) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineVersionState_PipelineStatus.Descriptor instead. func (PipelineVersionState_PipelineStatus) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47, 0} } // ServerReference represents a unique server @@ -2415,11 +2415,12 @@ type PipelineStep struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Inputs []string `protobuf:"bytes,2,rep,name=inputs,proto3" json:"inputs,omitempty"` - PassEmptyResponses bool `protobuf:"varint,3,opt,name=passEmptyResponses,proto3" json:"passEmptyResponses,omitempty"` // Forward empty response to following steps, default false - JoinWindowMs *uint32 `protobuf:"varint,4,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs, some nozero default (TBD) - TensorMap map[string]string `protobuf:"bytes,5,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Inputs []string `protobuf:"bytes,2,rep,name=inputs,proto3" json:"inputs,omitempty"` + JoinWindowMs *uint32 `protobuf:"varint,3,opt,name=joinWindowMs,proto3,oneof" json:"joinWindowMs,omitempty"` // Join window millisecs, some nozero default (TBD) + TensorMap map[string]string `protobuf:"bytes,4,rep,name=tensorMap,proto3" json:"tensorMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // optional map of tensor name mappings + OuterJoin bool `protobuf:"varint,5,opt,name=outerJoin,proto3" json:"outerJoin,omitempty"` + Batch *Batch `protobuf:"bytes,6,opt,name=batch,proto3" json:"batch,omitempty"` } func (x *PipelineStep) Reset() { @@ -2468,13 +2469,6 @@ func (x *PipelineStep) GetInputs() []string { return nil } -func (x *PipelineStep) GetPassEmptyResponses() bool { - if x != nil { - return x.PassEmptyResponses - } - return false -} - func (x *PipelineStep) GetJoinWindowMs() uint32 { if x != nil && x.JoinWindowMs != nil { return *x.JoinWindowMs @@ -2489,19 +2483,97 @@ func (x *PipelineStep) GetTensorMap() map[string]string { return nil } +func (x *PipelineStep) GetOuterJoin() bool { + if x != nil { + return x.OuterJoin + } + return false +} + +func (x *PipelineStep) GetBatch() *Batch { + if x != nil { + return x.Batch + } + return nil +} + +type Batch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Size *uint32 `protobuf:"varint,1,opt,name=size,proto3,oneof" json:"size,omitempty"` + WindowMs *uint32 `protobuf:"varint,2,opt,name=windowMs,proto3,oneof" json:"windowMs,omitempty"` + Rolling bool `protobuf:"varint,3,opt,name=rolling,proto3" json:"rolling,omitempty"` +} + +func (x *Batch) Reset() { + *x = Batch{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Batch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Batch) ProtoMessage() {} + +func (x *Batch) ProtoReflect() protoreflect.Message { + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Batch.ProtoReflect.Descriptor instead. +func (*Batch) Descriptor() ([]byte, []int) { + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{38} +} + +func (x *Batch) GetSize() uint32 { + if x != nil && x.Size != nil { + return *x.Size + } + return 0 +} + +func (x *Batch) GetWindowMs() uint32 { + if x != nil && x.WindowMs != nil { + return *x.WindowMs + } + return 0 +} + +func (x *Batch) GetRolling() bool { + if x != nil { + return x.Rolling + } + return false +} + type PipelineOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Inputs []string `protobuf:"bytes,1,rep,name=inputs,proto3" json:"inputs,omitempty"` + Steps []string `protobuf:"bytes,1,rep,name=steps,proto3" json:"steps,omitempty"` JoinWindowMs uint32 `protobuf:"varint,2,opt,name=joinWindowMs,proto3" json:"joinWindowMs,omitempty"` // Join window millisecs for output, default 0 + OuterJoin bool `protobuf:"varint,3,opt,name=outerJoin,proto3" json:"outerJoin,omitempty"` } func (x *PipelineOutput) Reset() { *x = PipelineOutput{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2514,7 +2586,7 @@ func (x *PipelineOutput) String() string { func (*PipelineOutput) ProtoMessage() {} func (x *PipelineOutput) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2527,12 +2599,12 @@ func (x *PipelineOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineOutput.ProtoReflect.Descriptor instead. func (*PipelineOutput) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{38} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{39} } -func (x *PipelineOutput) GetInputs() []string { +func (x *PipelineOutput) GetSteps() []string { if x != nil { - return x.Inputs + return x.Steps } return nil } @@ -2544,6 +2616,13 @@ func (x *PipelineOutput) GetJoinWindowMs() uint32 { return 0 } +func (x *PipelineOutput) GetOuterJoin() bool { + if x != nil { + return x.OuterJoin + } + return false +} + type LoadPipelineResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2553,7 +2632,7 @@ type LoadPipelineResponse struct { func (x *LoadPipelineResponse) Reset() { *x = LoadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2566,7 +2645,7 @@ func (x *LoadPipelineResponse) String() string { func (*LoadPipelineResponse) ProtoMessage() {} func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2579,7 +2658,7 @@ func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadPipelineResponse.ProtoReflect.Descriptor instead. func (*LoadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{39} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{40} } type UnloadPipelineRequest struct { @@ -2593,7 +2672,7 @@ type UnloadPipelineRequest struct { func (x *UnloadPipelineRequest) Reset() { *x = UnloadPipelineRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2606,7 +2685,7 @@ func (x *UnloadPipelineRequest) String() string { func (*UnloadPipelineRequest) ProtoMessage() {} func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2619,7 +2698,7 @@ func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineRequest.ProtoReflect.Descriptor instead. func (*UnloadPipelineRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{40} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} } func (x *UnloadPipelineRequest) GetName() string { @@ -2638,7 +2717,7 @@ type UnloadPipelineResponse struct { func (x *UnloadPipelineResponse) Reset() { *x = UnloadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2651,7 +2730,7 @@ func (x *UnloadPipelineResponse) String() string { func (*UnloadPipelineResponse) ProtoMessage() {} func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2664,7 +2743,7 @@ func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineResponse.ProtoReflect.Descriptor instead. func (*UnloadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} } type PipelineStatusRequest struct { @@ -2679,7 +2758,7 @@ type PipelineStatusRequest struct { func (x *PipelineStatusRequest) Reset() { *x = PipelineStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2692,7 +2771,7 @@ func (x *PipelineStatusRequest) String() string { func (*PipelineStatusRequest) ProtoMessage() {} func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2705,7 +2784,7 @@ func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusRequest.ProtoReflect.Descriptor instead. func (*PipelineStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} } func (x *PipelineStatusRequest) GetName() string { @@ -2733,7 +2812,7 @@ type PipelineSubscriptionRequest struct { func (x *PipelineSubscriptionRequest) Reset() { *x = PipelineSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2746,7 +2825,7 @@ func (x *PipelineSubscriptionRequest) String() string { func (*PipelineSubscriptionRequest) ProtoMessage() {} func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2759,7 +2838,7 @@ func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineSubscriptionRequest.ProtoReflect.Descriptor instead. func (*PipelineSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} } func (x *PipelineSubscriptionRequest) GetSubscriberName() string { @@ -2781,7 +2860,7 @@ type PipelineStatusResponse struct { func (x *PipelineStatusResponse) Reset() { *x = PipelineStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2794,7 +2873,7 @@ func (x *PipelineStatusResponse) String() string { func (*PipelineStatusResponse) ProtoMessage() {} func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2807,7 +2886,7 @@ func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusResponse.ProtoReflect.Descriptor instead. func (*PipelineStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} } func (x *PipelineStatusResponse) GetPipelineName() string { @@ -2836,7 +2915,7 @@ type PipelineWithState struct { func (x *PipelineWithState) Reset() { *x = PipelineWithState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2849,7 +2928,7 @@ func (x *PipelineWithState) String() string { func (*PipelineWithState) ProtoMessage() {} func (x *PipelineWithState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2862,7 +2941,7 @@ func (x *PipelineWithState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineWithState.ProtoReflect.Descriptor instead. func (*PipelineWithState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} } func (x *PipelineWithState) GetPipeline() *Pipeline { @@ -2893,7 +2972,7 @@ type PipelineVersionState struct { func (x *PipelineVersionState) Reset() { *x = PipelineVersionState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2906,7 +2985,7 @@ func (x *PipelineVersionState) String() string { func (*PipelineVersionState) ProtoMessage() {} func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2919,7 +2998,7 @@ func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineVersionState.ProtoReflect.Descriptor instead. func (*PipelineVersionState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47} } func (x *PipelineVersionState) GetPipelineVersion() uint32 { @@ -3332,207 +3411,218 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x65, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xb5, 0x02, 0x0a, 0x0c, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xd8, 0x02, 0x0a, 0x0c, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x70, 0x61, 0x73, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, + 0x75, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x09, - 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, - 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x4c, - 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, - 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x16, 0x0a, 0x14, - 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x18, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, 0x15, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x45, 0x0a, 0x1b, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, - 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, + 0x1c, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x33, 0x0a, + 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, + 0x73, 0x22, 0x71, 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x68, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, + 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x22, 0x16, + 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, + 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, + 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x45, 0x0a, 0x1b, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x11, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x3c, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x42, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0xc2, 0x03, 0x0a, 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0xc4, 0x01, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, + 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x15, + 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x16, + 0x0a, 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x10, 0x07, 0x32, 0xd7, 0x0d, 0x0a, 0x09, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x1a, 0x2c, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, + 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0xc2, 0x03, 0x0a, 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc4, 0x01, - 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, - 0x14, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x64, 0x10, 0x07, 0x32, 0xd7, 0x0d, 0x0a, 0x09, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x12, 0x67, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x27, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x1a, 0x2c, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x09, 0x4c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x68, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, - 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, + 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, + 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6b, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x2b, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, + 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x15, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x77, 0x0a, - 0x10, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, - 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x77, 0x0a, 0x10, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x82, 0x01, 0x0a, 0x17, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, + 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x40, - 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x73, - 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x82, 0x01, 0x0a, 0x17, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, + 0x69, 0x73, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3548,7 +3638,7 @@ func file_mlops_scheduler_scheduler_proto_rawDescGZIP() []byte { } var file_mlops_scheduler_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 49) +var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 50) var file_mlops_scheduler_scheduler_proto_goTypes = []interface{}{ (ModelStatus_ModelState)(0), // 0: seldon.mlops.scheduler.ModelStatus.ModelState (ModelReplicaStatus_ModelReplicaState)(0), // 1: seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState @@ -3591,18 +3681,19 @@ var file_mlops_scheduler_scheduler_proto_goTypes = []interface{}{ (*ExperimentStatusRequest)(nil), // 38: seldon.mlops.scheduler.ExperimentStatusRequest (*Pipeline)(nil), // 39: seldon.mlops.scheduler.Pipeline (*PipelineStep)(nil), // 40: seldon.mlops.scheduler.PipelineStep - (*PipelineOutput)(nil), // 41: seldon.mlops.scheduler.PipelineOutput - (*LoadPipelineResponse)(nil), // 42: seldon.mlops.scheduler.LoadPipelineResponse - (*UnloadPipelineRequest)(nil), // 43: seldon.mlops.scheduler.UnloadPipelineRequest - (*UnloadPipelineResponse)(nil), // 44: seldon.mlops.scheduler.UnloadPipelineResponse - (*PipelineStatusRequest)(nil), // 45: seldon.mlops.scheduler.PipelineStatusRequest - (*PipelineSubscriptionRequest)(nil), // 46: seldon.mlops.scheduler.PipelineSubscriptionRequest - (*PipelineStatusResponse)(nil), // 47: seldon.mlops.scheduler.PipelineStatusResponse - (*PipelineWithState)(nil), // 48: seldon.mlops.scheduler.PipelineWithState - (*PipelineVersionState)(nil), // 49: seldon.mlops.scheduler.PipelineVersionState - nil, // 50: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry - nil, // 51: seldon.mlops.scheduler.PipelineStep.TensorMapEntry - (*timestamppb.Timestamp)(nil), // 52: google.protobuf.Timestamp + (*Batch)(nil), // 41: seldon.mlops.scheduler.Batch + (*PipelineOutput)(nil), // 42: seldon.mlops.scheduler.PipelineOutput + (*LoadPipelineResponse)(nil), // 43: seldon.mlops.scheduler.LoadPipelineResponse + (*UnloadPipelineRequest)(nil), // 44: seldon.mlops.scheduler.UnloadPipelineRequest + (*UnloadPipelineResponse)(nil), // 45: seldon.mlops.scheduler.UnloadPipelineResponse + (*PipelineStatusRequest)(nil), // 46: seldon.mlops.scheduler.PipelineStatusRequest + (*PipelineSubscriptionRequest)(nil), // 47: seldon.mlops.scheduler.PipelineSubscriptionRequest + (*PipelineStatusResponse)(nil), // 48: seldon.mlops.scheduler.PipelineStatusResponse + (*PipelineWithState)(nil), // 49: seldon.mlops.scheduler.PipelineWithState + (*PipelineVersionState)(nil), // 50: seldon.mlops.scheduler.PipelineVersionState + nil, // 51: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + nil, // 52: seldon.mlops.scheduler.PipelineStep.TensorMapEntry + (*timestamppb.Timestamp)(nil), // 53: google.protobuf.Timestamp } var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ 5, // 0: seldon.mlops.scheduler.LoadModelRequest.model:type_name -> seldon.mlops.scheduler.Model @@ -3616,13 +3707,13 @@ var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ 9, // 8: seldon.mlops.scheduler.UnloadModelRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta 17, // 9: seldon.mlops.scheduler.ModelStatusResponse.versions:type_name -> seldon.mlops.scheduler.ModelVersionStatus 9, // 10: seldon.mlops.scheduler.ModelVersionStatus.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 50, // 11: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + 51, // 11: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry 18, // 12: seldon.mlops.scheduler.ModelVersionStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus 5, // 13: seldon.mlops.scheduler.ModelVersionStatus.modelDefn:type_name -> seldon.mlops.scheduler.Model 0, // 14: seldon.mlops.scheduler.ModelStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus.ModelState - 52, // 15: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 53, // 15: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp 1, // 16: seldon.mlops.scheduler.ModelReplicaStatus.state:type_name -> seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState - 52, // 17: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 53, // 17: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp 21, // 18: seldon.mlops.scheduler.ServerStatusResponse.resources:type_name -> seldon.mlops.scheduler.ServerReplicaResources 9, // 19: seldon.mlops.scheduler.ServerStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta 13, // 20: seldon.mlops.scheduler.ModelStatusRequest.model:type_name -> seldon.mlops.scheduler.ModelReference @@ -3635,50 +3726,51 @@ var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ 9, // 27: seldon.mlops.scheduler.ExperimentStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta 39, // 28: seldon.mlops.scheduler.LoadPipelineRequest.pipeline:type_name -> seldon.mlops.scheduler.Pipeline 40, // 29: seldon.mlops.scheduler.Pipeline.steps:type_name -> seldon.mlops.scheduler.PipelineStep - 41, // 30: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput + 42, // 30: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput 9, // 31: seldon.mlops.scheduler.Pipeline.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 51, // 32: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry - 48, // 33: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState - 39, // 34: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline - 49, // 35: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState - 2, // 36: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus - 52, // 37: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 19, // 38: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus - 3, // 39: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerReference - 4, // 40: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest - 14, // 41: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest - 23, // 42: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest - 22, // 43: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest - 24, // 44: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest - 26, // 45: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest - 27, // 46: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest - 33, // 47: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest - 35, // 48: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest - 38, // 49: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest - 37, // 50: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest - 43, // 51: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest - 45, // 52: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest - 46, // 53: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest - 20, // 54: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 12, // 55: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse - 15, // 56: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse - 16, // 57: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 16, // 58: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 25, // 59: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse - 20, // 60: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 32, // 61: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse - 34, // 62: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse - 36, // 63: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 36, // 64: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 42, // 65: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse - 44, // 66: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse - 47, // 67: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 47, // 68: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 54, // [54:69] is the sub-list for method output_type - 39, // [39:54] is the sub-list for method input_type - 39, // [39:39] is the sub-list for extension type_name - 39, // [39:39] is the sub-list for extension extendee - 0, // [0:39] is the sub-list for field type_name + 52, // 32: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry + 41, // 33: seldon.mlops.scheduler.PipelineStep.batch:type_name -> seldon.mlops.scheduler.Batch + 49, // 34: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState + 39, // 35: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline + 50, // 36: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState + 2, // 37: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus + 53, // 38: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 19, // 39: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus + 3, // 40: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerReference + 4, // 41: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest + 14, // 42: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest + 23, // 43: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest + 22, // 44: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest + 24, // 45: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest + 26, // 46: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest + 27, // 47: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest + 33, // 48: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest + 35, // 49: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest + 38, // 50: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest + 37, // 51: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest + 44, // 52: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest + 46, // 53: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest + 47, // 54: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest + 20, // 55: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 12, // 56: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse + 15, // 57: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse + 16, // 58: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 16, // 59: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 25, // 60: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse + 20, // 61: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 32, // 62: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse + 34, // 63: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse + 36, // 64: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 36, // 65: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 43, // 66: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse + 45, // 67: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse + 48, // 68: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 48, // 69: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 55, // [55:70] is the sub-list for method output_type + 40, // [40:55] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name } func init() { file_mlops_scheduler_scheduler_proto_init() } @@ -4144,7 +4236,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineOutput); i { + switch v := v.(*Batch); i { case 0: return &v.state case 1: @@ -4156,7 +4248,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadPipelineResponse); i { + switch v := v.(*PipelineOutput); i { case 0: return &v.state case 1: @@ -4168,7 +4260,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadPipelineRequest); i { + switch v := v.(*LoadPipelineResponse); i { case 0: return &v.state case 1: @@ -4180,7 +4272,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadPipelineResponse); i { + switch v := v.(*UnloadPipelineRequest); i { case 0: return &v.state case 1: @@ -4192,7 +4284,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineStatusRequest); i { + switch v := v.(*UnloadPipelineResponse); i { case 0: return &v.state case 1: @@ -4204,7 +4296,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineSubscriptionRequest); i { + switch v := v.(*PipelineStatusRequest); i { case 0: return &v.state case 1: @@ -4216,7 +4308,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineStatusResponse); i { + switch v := v.(*PipelineSubscriptionRequest); i { case 0: return &v.state case 1: @@ -4228,7 +4320,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PipelineWithState); i { + switch v := v.(*PipelineStatusResponse); i { case 0: return &v.state case 1: @@ -4240,6 +4332,18 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PipelineWithState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_scheduler_scheduler_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PipelineVersionState); i { case 0: return &v.state @@ -4267,13 +4371,14 @@ func file_mlops_scheduler_scheduler_proto_init() { file_mlops_scheduler_scheduler_proto_msgTypes[33].OneofWrappers = []interface{}{} file_mlops_scheduler_scheduler_proto_msgTypes[36].OneofWrappers = []interface{}{} file_mlops_scheduler_scheduler_proto_msgTypes[37].OneofWrappers = []interface{}{} + file_mlops_scheduler_scheduler_proto_msgTypes[38].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mlops_scheduler_scheduler_proto_rawDesc, NumEnums: 3, - NumMessages: 49, + NumMessages: 50, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/mlops/scheduler/scheduler.proto b/apis/mlops/scheduler/scheduler.proto index 78c6ef3771..0dab449243 100644 --- a/apis/mlops/scheduler/scheduler.proto +++ b/apis/mlops/scheduler/scheduler.proto @@ -251,14 +251,22 @@ message Pipeline { message PipelineStep { string name = 1; repeated string inputs = 2; - bool passEmptyResponses = 3; // Forward empty response to following steps, default false - optional uint32 joinWindowMs = 4; // Join window millisecs, some nozero default (TBD) - map tensorMap = 5; // optional map of tensor name mappings + optional uint32 joinWindowMs = 3; // Join window millisecs, some nozero default (TBD) + map tensorMap = 4; // optional map of tensor name mappings + bool outerJoin = 5; + Batch batch = 6; +} + +message Batch { + optional uint32 size = 1; + optional uint32 windowMs = 2; + bool rolling = 3; } message PipelineOutput { - repeated string inputs = 1; + repeated string steps = 1; uint32 joinWindowMs = 2; // Join window millisecs for output, default 0 + bool outerJoin = 3; } message LoadPipelineResponse { diff --git a/operator/apis/mlops/v1alpha1/pipeline_types.go b/operator/apis/mlops/v1alpha1/pipeline_types.go index 1737531935..3f8dd51283 100644 --- a/operator/apis/mlops/v1alpha1/pipeline_types.go +++ b/operator/apis/mlops/v1alpha1/pipeline_types.go @@ -36,20 +36,26 @@ type PipelineStep struct { Name string `json:"name"` // Previous step to receive data from Inputs []string `json:"inputs,omitempty"` - // Whether empty tensors output should be passed to onwards - // Default: false - PassEmptyResponses bool `json:"passEmptyResponses,omitempty"` // msecs to wait for messages from multiple inputs to arrive before joining the inputs JoinWindowMs *uint32 `json:"joinWindowMs,omitempty"` // Map of tensor name conversions to use e.g. output1 -> input1 TensorMap map[string]string `json:"tensorMap,omitempty"` + OuterJoin bool `json:"outerJoin,omitempty"` + Batch *PipelineBatch `json:"batch,omitempty"` +} + +type PipelineBatch struct { + Size *uint32 `json:"size,omitempty"` + WindowMs *uint32 `json:"windowMs,omitempty"` + Rolling bool `json:"rolling,omitempty"` } type PipelineOutput struct { // Previous step to receive data from - Inputs []string `json:"inputs,omitempty"` + Steps []string `json:"steps,omitempty"` // msecs to wait for messages from multiple inputs to arrive before joining the inputs JoinWindowMs uint32 `json:"joinWindowMs,omitempty"` + OuterJoin bool `json:"outerJoin,omitempty"` } // PipelineStatus defines the observed state of Pipeline @@ -86,18 +92,27 @@ func (p Pipeline) AsSchedulerPipeline() *scheduler.Pipeline { var steps []*scheduler.PipelineStep var output *scheduler.PipelineOutput for _, step := range p.Spec.Steps { - steps = append(steps, &scheduler.PipelineStep{ - Name: step.Name, - Inputs: step.Inputs, - JoinWindowMs: step.JoinWindowMs, - PassEmptyResponses: step.PassEmptyResponses, - TensorMap: step.TensorMap, - }) + pipelineStep := &scheduler.PipelineStep{ + Name: step.Name, + Inputs: step.Inputs, + JoinWindowMs: step.JoinWindowMs, + TensorMap: step.TensorMap, + OuterJoin: step.OuterJoin, + } + if step.Batch != nil { + pipelineStep.Batch = &scheduler.Batch{ + Size: step.Batch.Size, + WindowMs: step.Batch.WindowMs, + Rolling: step.Batch.Rolling, + } + } + steps = append(steps, pipelineStep) } if p.Spec.Output != nil { output = &scheduler.PipelineOutput{ - Inputs: p.Spec.Output.Inputs, + Steps: p.Spec.Output.Steps, JoinWindowMs: p.Spec.Output.JoinWindowMs, + OuterJoin: p.Spec.Output.OuterJoin, } } return &scheduler.Pipeline{ diff --git a/operator/apis/mlops/v1alpha1/pipeline_types_test.go b/operator/apis/mlops/v1alpha1/pipeline_types_test.go index f2ab17e91e..cd6cfac585 100644 --- a/operator/apis/mlops/v1alpha1/pipeline_types_test.go +++ b/operator/apis/mlops/v1alpha1/pipeline_types_test.go @@ -37,15 +37,21 @@ func TestAsPipelineDetails(t *testing.T) { Inputs: []string{"a"}, }, { - Name: "c", - Inputs: []string{"b"}, - JoinWindowMs: getUintPtr(20), - PassEmptyResponses: true, + Name: "c", + Inputs: []string{"b"}, + JoinWindowMs: getUintPtr(20), + OuterJoin: true, + Batch: &PipelineBatch{ + Size: getUintPtr(100), + WindowMs: getUintPtr(1000), + Rolling: true, + }, }, }, Output: &PipelineOutput{ - Inputs: []string{"c"}, + Steps: []string{"c"}, JoinWindowMs: 2, + OuterJoin: true, }, }, }, @@ -60,15 +66,21 @@ func TestAsPipelineDetails(t *testing.T) { Inputs: []string{"a"}, }, { - Name: "c", - Inputs: []string{"b"}, - JoinWindowMs: getUintPtr(20), - PassEmptyResponses: true, + Name: "c", + Inputs: []string{"b"}, + JoinWindowMs: getUintPtr(20), + OuterJoin: true, + Batch: &scheduler.Batch{ + Size: getUintPtr(100), + WindowMs: getUintPtr(1000), + Rolling: true, + }, }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"c"}, + Steps: []string{"c"}, JoinWindowMs: 2, + OuterJoin: true, }, KubernetesMeta: &scheduler.KubernetesMeta{ Namespace: "default", diff --git a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go index 1c4a123259..4d8f48b63b 100644 --- a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go +++ b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go @@ -551,6 +551,31 @@ func (in *Pipeline) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PipelineBatch) DeepCopyInto(out *PipelineBatch) { + *out = *in + if in.Size != nil { + in, out := &in.Size, &out.Size + *out = new(uint32) + **out = **in + } + if in.WindowMs != nil { + in, out := &in.WindowMs, &out.WindowMs + *out = new(uint32) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineBatch. +func (in *PipelineBatch) DeepCopy() *PipelineBatch { + if in == nil { + return nil + } + out := new(PipelineBatch) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PipelineList) DeepCopyInto(out *PipelineList) { *out = *in @@ -586,8 +611,8 @@ func (in *PipelineList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PipelineOutput) DeepCopyInto(out *PipelineOutput) { *out = *in - if in.Inputs != nil { - in, out := &in.Inputs, &out.Inputs + if in.Steps != nil { + in, out := &in.Steps, &out.Steps *out = make([]string, len(*in)) copy(*out, *in) } @@ -666,6 +691,11 @@ func (in *PipelineStep) DeepCopyInto(out *PipelineStep) { (*out)[key] = val } } + if in.Batch != nil { + in, out := &in.Batch, &out.Batch + *out = new(PipelineBatch) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PipelineStep. diff --git a/samples/local-examples.ipynb b/samples/local-examples.ipynb index f371cb6f5e..84069b56c9 100644 --- a/samples/local-examples.ipynb +++ b/samples/local-examples.ipynb @@ -331,7 +331,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.9.10" } }, "nbformat": 4, diff --git a/samples/models/add10.yaml b/samples/models/add10.yaml new file mode 100644 index 0000000000..2272fe882f --- /dev/null +++ b/samples/models/add10.yaml @@ -0,0 +1,9 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Model +metadata: + name: add10 + namespace: seldon-mesh +spec: + storageUri: "gs://seldon-models/triton/add10" + requirements: + - triton-python diff --git a/samples/models/conditional.yaml b/samples/models/conditional.yaml new file mode 100644 index 0000000000..3b5b153f28 --- /dev/null +++ b/samples/models/conditional.yaml @@ -0,0 +1,9 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Model +metadata: + name: conditional + namespace: seldon-mesh +spec: + storageUri: "gs://seldon-models/triton/conditional" + requirements: + - triton-python diff --git a/samples/models/mul10.yaml b/samples/models/mul10.yaml new file mode 100644 index 0000000000..f8d513a7e3 --- /dev/null +++ b/samples/models/mul10.yaml @@ -0,0 +1,9 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Model +metadata: + name: mul10 + namespace: seldon-mesh +spec: + storageUri: "gs://seldon-models/triton/mul10" + requirements: + - triton-python diff --git a/samples/models/outlier-error.yaml b/samples/models/outlier-error.yaml new file mode 100644 index 0000000000..19ef79ec9a --- /dev/null +++ b/samples/models/outlier-error.yaml @@ -0,0 +1,9 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Model +metadata: + name: outlier-error + namespace: seldon-mesh +spec: + storageUri: "gs://seldon-models/triton/outlier" + requirements: + - triton-python diff --git a/samples/pipeline-examples.ipynb b/samples/pipeline-examples.ipynb index 12ac1fac9f..0555485f63 100644 --- a/samples/pipeline-examples.ipynb +++ b/samples/pipeline-examples.ipynb @@ -64,17 +64,6 @@ "!seldon model status --model-name tfsimple2 -w ModelAvailable | jq ." ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "dffce7ed", - "metadata": {}, - "outputs": [], - "source": [ - "!seldon model infer -m tfsimple1 \\\n", - " '{\"inputs\":[{\"name\":\"INPUT0\",\"data\": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]},{\"name\":\"INPUT1\",\"data\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],\"datatype\":\"INT32\",\"shape\":[1,16]}]}' " - ] - }, { "cell_type": "code", "execution_count": null, @@ -215,7 +204,9 @@ "cell_type": "code", "execution_count": null, "id": "2151ee4c", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "!seldon pipeline infer -p join --inference-mode grpc \\\n", @@ -243,6 +234,241 @@ "!seldon model unload --model-name tfsimple2\n", "!seldon model unload --model-name tfsimple3" ] + }, + { + "cell_type": "markdown", + "id": "b6666e04", + "metadata": {}, + "source": [ + "## Conditional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3a2c7f3", + "metadata": {}, + "outputs": [], + "source": [ + "!cat ./models/conditional.yaml\n", + "!cat ./models/add10.yaml\n", + "!cat ./models/mul10.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2104f9bf", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model load -f ./models/conditional.yaml \n", + "!seldon model load -f ./models/add10.yaml \n", + "!seldon model load -f ./models/mul10.yaml " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7af88e3a", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model status --model-name conditional -w ModelAvailable | jq .\n", + "!seldon model status --model-name add10 -w ModelAvailable | jq .\n", + "!seldon model status --model-name mul10 -w ModelAvailable | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f5bbe84d", + "metadata": {}, + "outputs": [], + "source": [ + "!cat ./pipelines/conditional.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "829f9b18", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline load -f ./pipelines/conditional.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae202d26", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline status -p tfsimple-conditional -w PipelineReady | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d03d5fe", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline infer -p tfsimple-conditional --inference-mode grpc \\\n", + " '{\"model_name\":\"outlier\",\"inputs\":[{\"name\":\"CHOICE\",\"contents\":{\"int_contents\":[0]},\"datatype\":\"INT32\",\"shape\":[1]},{\"name\":\"INPUT0\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]},{\"name\":\"INPUT1\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]}]}' | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "def4e8e1", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline infer -p tfsimple-conditional --inference-mode grpc \\\n", + " '{\"model_name\":\"outlier\",\"inputs\":[{\"name\":\"CHOICE\",\"contents\":{\"int_contents\":[1]},\"datatype\":\"INT32\",\"shape\":[1]},{\"name\":\"INPUT0\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]},{\"name\":\"INPUT1\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]}]}' | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3042fe42", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline unload -p tfsimple-conditional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bda8710", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model unload --model-name conditional" + ] + }, + { + "cell_type": "markdown", + "id": "99cfda82", + "metadata": {}, + "source": [ + "## Error\n", + "An example which errors is arguments sum to greater than 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f5f0f2e", + "metadata": {}, + "outputs": [], + "source": [ + "!cat ./models/outlier-error.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7ee6e78", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model load -f ./models/outlier-error.yaml " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e06593e4", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model status --model-name outlier-error -w ModelAvailable | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5057243c", + "metadata": {}, + "outputs": [], + "source": [ + "!cat ./pipelines/outlier-error.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee724055", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline load -f ./pipelines/outlier-error.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "338dfa4d", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline status -p outlier-error -w PipelineReady | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64cb9160", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline infer -p outlier-error --inference-mode grpc \\\n", + " '{\"model_name\":\"outlier\",\"inputs\":[{\"name\":\"INPUT0\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]},{\"name\":\"INPUT1\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]}]}' | jq ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "853da19a", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline infer -p outlier-error --inference-mode grpc \\\n", + " '{\"model_name\":\"outlier\",\"inputs\":[{\"name\":\"INPUT0\",\"contents\":{\"fp32_contents\":[100,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]},{\"name\":\"INPUT1\",\"contents\":{\"fp32_contents\":[1,2,3,4]},\"datatype\":\"FP32\",\"shape\":[4]}]}' " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59b296c5", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon pipeline unload -p outlier-error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abe4aa67", + "metadata": {}, + "outputs": [], + "source": [ + "!seldon model unload --model-name outlier-error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a16a6dd", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/samples/pipelines/conditional.yaml b/samples/pipelines/conditional.yaml new file mode 100644 index 0000000000..898d10b7bb --- /dev/null +++ b/samples/pipelines/conditional.yaml @@ -0,0 +1,23 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Pipeline +metadata: + name: tfsimple-conditional + namespace: seldon-mesh +spec: + steps: + - name: conditional + - name: mul10 + inputs: + - conditional.outputs.OUTPUT0 + tensorMap: + conditional.outputs.OUTPUT0: INPUT + - name: add10 + inputs: + - conditional.outputs.OUTPUT1 + tensorMap: + conditional.outputs.OUTPUT1: INPUT + output: + steps: + - mul10 + - add10 + outerJoin: true diff --git a/samples/pipelines/outlier-error.yaml b/samples/pipelines/outlier-error.yaml new file mode 100644 index 0000000000..5af84307c8 --- /dev/null +++ b/samples/pipelines/outlier-error.yaml @@ -0,0 +1,10 @@ +apiVersion: mlops.seldon.io/v1alpha1 +kind: Pipeline +metadata: + name: outlier-error +spec: + steps: + - name: outlier-error + output: + steps: + - outlier-error diff --git a/samples/pipelines/tfsimples-join.yaml b/samples/pipelines/tfsimples-join.yaml index 9d02492f10..d76ae93283 100644 --- a/samples/pipelines/tfsimples-join.yaml +++ b/samples/pipelines/tfsimples-join.yaml @@ -15,5 +15,5 @@ spec: tfsimple1.outputs.OUTPUT0: INPUT0 tfsimple2.outputs.OUTPUT1: INPUT1 output: - inputs: + steps: - tfsimple3 diff --git a/samples/pipelines/tfsimples.yaml b/samples/pipelines/tfsimples.yaml index 4c0e8255c5..cdec154a79 100644 --- a/samples/pipelines/tfsimples.yaml +++ b/samples/pipelines/tfsimples.yaml @@ -13,5 +13,5 @@ spec: tfsimple1.outputs.OUTPUT0: INPUT0 tfsimple1.outputs.OUTPUT1: INPUT1 output: - inputs: + steps: - tfsimple2 diff --git a/scheduler/Makefile b/scheduler/Makefile index 89aab0b8aa..a00c1b89ad 100644 --- a/scheduler/Makefile +++ b/scheduler/Makefile @@ -494,7 +494,7 @@ start-agent-local-triton: --server-type triton \ --log-level debug \ --config-path ${PWD}/config \ - --replica-config '{"inferenceSvc":"0.0.0.0","inferenceHttpPort":8080,"inferenceGrpcPort":8081,"memoryBytes":1000000,"capabilities":["tensorflow","onnx","pytorch"],"overCommitPercentage":20}' + --replica-config '{"inferenceSvc":"0.0.0.0","inferenceHttpPort":8080,"inferenceGrpcPort":8081,"memoryBytes":1000000,"capabilities":["tensorflow","onnx","pytorch","triton-python"],"overCommitPercentage":20}' .PHONY: start-envoy-local start-envoy-local: diff --git a/scheduler/all-mlserver.yaml b/scheduler/all-mlserver.yaml index f56e178804..b9a1f3f0ee 100644 --- a/scheduler/all-mlserver.yaml +++ b/scheduler/all-mlserver.yaml @@ -5,7 +5,7 @@ services: agent: environment: - SELDON_SERVER_TYPE=mlserver - - SELDON_SERVER_CAPABILITIES=sklearn,xgboost + - SELDON_SERVER_CAPABILITIES=sklearn,xgboost,python server: command: diff --git a/scheduler/all-triton.yaml b/scheduler/all-triton.yaml index eba17e7f94..470020a53d 100644 --- a/scheduler/all-triton.yaml +++ b/scheduler/all-triton.yaml @@ -5,7 +5,7 @@ services: agent: environment: - SELDON_SERVER_TYPE=triton - - SELDON_SERVER_CAPABILITIES=tensorflow,onnx,pytorch + - SELDON_SERVER_CAPABILITIES=tensorflow,onnx,pytorch,triton-python server: command: diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/PipelineSubscriber.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/PipelineSubscriber.kt index 1fb54aa933..0eedb1c3f2 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/PipelineSubscriber.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/PipelineSubscriber.kt @@ -12,6 +12,7 @@ import io.grpc.StatusRuntimeException import io.seldon.dataflow.kafka.* import io.seldon.mlops.chainer.ChainerGrpcKt import io.seldon.mlops.chainer.ChainerOuterClass.* +import io.seldon.mlops.chainer.ChainerOuterClass.PipelineStepUpdate.PipelineJoinType import io.seldon.mlops.chainer.ChainerOuterClass.PipelineUpdateMessage.PipelineOperation import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.asFlow @@ -124,6 +125,7 @@ class PipelineSubscriber( it.sourcesList, it.tensorMapMap, it.sink, + it.ty == PipelineJoinType.Outer, kafkaProperties, kafkaDomainParams, ) @@ -211,7 +213,6 @@ class PipelineSubscriber( transformer: Transformer, reason: String, ) { - logger.info("cancel pipeline ${metadata.name}") transformer.stop() } diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt index d7e497c1f6..55c23d1d9f 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Chainer.kt @@ -25,6 +25,8 @@ class Chainer( .filterForPipeline(pipelineName) .unmarshallInferenceV2() .convertToRequests(inputTopic, tensors, tensorRenaming) + // handle cases where there are no tensors we want + .filter { _, value -> value.inputsList.size != 0} .marshallInferenceV2() .to(outputTopic, producerSerde) } else { @@ -49,8 +51,9 @@ class Chainer( } override fun stop() { - logger.info("stopping chainer") + logger.info("stopping chainer ${inputTopic}->${outputTopic}") streams.close() + streams.cleanUp() } companion object { diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Configuration.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Configuration.kt index 469e5d5464..52c68e7252 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Configuration.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Configuration.kt @@ -1,5 +1,6 @@ package io.seldon.dataflow.kafka +import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.streams.StreamsConfig import java.util.* @@ -18,11 +19,12 @@ fun getKafkaProperties(params: KafkaStreamsParams): KafkaProperties { return Properties().apply { // TODO - add version to app ID? (From env var.) - this[StreamsConfig.APPLICATION_ID_CONFIG] = "seldon-dataflow-transformer" + this[StreamsConfig.APPLICATION_ID_CONFIG] = "seldon-dataflow" this[StreamsConfig.BOOTSTRAP_SERVERS_CONFIG] = params.bootstrapServers this[StreamsConfig.PROCESSING_GUARANTEE_CONFIG] = "at_least_once" this[StreamsConfig.NUM_STREAM_THREADS_CONFIG] = params.numCores * 16 this[StreamsConfig.SECURITY_PROTOCOL_CONFIG] = "PLAINTEXT" + this[ConsumerConfig.AUTO_OFFSET_RESET_CONFIG] = "latest" // Testing this[StreamsConfig.REPLICATION_FACTOR_CONFIG] = 1 @@ -34,8 +36,7 @@ fun KafkaProperties.withAppId(name: String): KafkaProperties { val properties = KafkaProperties() properties.putAll(this.toMap()) - val appIdPrefix = this[StreamsConfig.APPLICATION_ID_CONFIG] as String - this[StreamsConfig.APPLICATION_ID_CONFIG] = "$appIdPrefix-$name" + this[StreamsConfig.APPLICATION_ID_CONFIG] = "seldon-dataflow-$name" return properties } \ No newline at end of file diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt index 6fc190a7ef..f5d0abbcc6 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Joiner.kt @@ -18,6 +18,7 @@ class Joiner( internal val pipelineName: String, internal val tensorRenaming: Map, internal val kafkaDomainParams: KafkaDomainParams, + internal val outerJoin: Boolean, ) : Transformer { private val streams: KafkaStreams by lazy { val builder = StreamsBuilder() @@ -38,27 +39,56 @@ class Joiner( } val topic = inputTopics.first() - val nextStream = builder - .stream(topic, consumerSerde) - .filterForPipeline(pipelineName) - .unmarshallInferenceV2() - .convertToRequests(topic, tensorsByTopic?.get(topic), tensorRenaming) - .marshallInferenceV2() + val nextStream = if (outputTopic.endsWith("outputs")) { + builder + .stream(topic, consumerSerde) + .filterForPipeline(pipelineName) + } else { + builder + .stream(topic, consumerSerde) + .filterForPipeline(pipelineName) + .unmarshallInferenceV2() + .convertToRequests(topic, tensorsByTopic?.get(topic), tensorRenaming) + .marshallInferenceV2() + } + + if (outerJoin) { + val nextPending = pending + ?.outerJoin( + nextStream, + ::joinRequests, + //JoinWindows.ofTimeDifferenceAndGrace(Duration.ofMillis(1), Duration.ofMillis(1)), + // Required because this "fix" causes outer joins to wait for next record to come in if all streams + // don't produce a record during grace period. https://issues.apache.org/jira/browse/KAFKA-10847 + // Also see https://confluentcommunity.slack.com/archives/C6UJNMY67/p1649520904545229?thread_ts=1649324912.542999&cid=C6UJNMY67 + // Issue created at https://issues.apache.org/jira/browse/KAFKA-13813 + JoinWindows.of(Duration.ofMillis(1)), + joinSerde, + ) ?: nextStream - val nextPending = pending - ?.join( - nextStream, - ::joinRequests, - JoinWindows.ofTimeDifferenceWithNoGrace( - Duration.ofMillis(kafkaDomainParams.joinWindowMillis), - ), - joinSerde, - ) ?: nextStream + return buildTopology(builder, inputTopics.minus(topic), nextPending) + } else { + val nextPending = pending + ?.join( + nextStream, + ::joinRequests, + JoinWindows.ofTimeDifferenceWithNoGrace( + Duration.ofMillis(kafkaDomainParams.joinWindowMillis), + ), + joinSerde, + ) ?: nextStream - return buildTopology(builder, inputTopics.minus(topic), nextPending) + return buildTopology(builder, inputTopics.minus(topic), nextPending) + } } - private fun joinRequests(left: ByteArray, right: ByteArray): ByteArray { + private fun joinRequests(left: ByteArray?, right: ByteArray?): ByteArray { + if (left == null) { + return right!! + } + if (right == null) { + return left + } val leftRequest = V2Dataplane.ModelInferRequest.parseFrom(left) val rightRequest = V2Dataplane.ModelInferRequest.parseFrom(right) val request = V2Dataplane.ModelInferRequest @@ -77,13 +107,15 @@ class Joiner( if (kafkaDomainParams.useCleanState) { streams.cleanUp() } - logger.info("starting for ($inputTopics) -> ($outputTopic)") + logger.info("starting for ($inputTopics) -> ($outputTopic) outerJoin:${outerJoin}") streams.start() } override fun stop() { - logger.info("stopping joiner") + logger.info("stopping joiner ${outputTopic}") streams.close() + // Does not clean up everything see https://issues.apache.org/jira/browse/KAFKA-13787 + streams.cleanUp() } companion object { diff --git a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Transformer.kt b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Transformer.kt index 03193dfdf6..16848cc689 100644 --- a/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Transformer.kt +++ b/scheduler/data-flow/src/main/kotlin/io/seldon/dataflow/kafka/Transformer.kt @@ -18,6 +18,7 @@ fun transformerFor( sources: List, tensorMap: Map, sink: TopicName, + outerJoin: Boolean, baseKafkaProperties: KafkaProperties, kafkaDomainParams: KafkaDomainParams, ): Transformer? { @@ -49,6 +50,7 @@ fun transformerFor( pipelineName, tensorMap, kafkaDomainParams, + outerJoin, ) is SourceProjection.ManySubsets -> Joiner( baseKafkaProperties.withAppId(nameFor(sources, sink, "joiner")), @@ -58,6 +60,7 @@ fun transformerFor( pipelineName, tensorMap, kafkaDomainParams, + outerJoin, ) } } diff --git a/scheduler/data-flow/src/main/resources/local.properties b/scheduler/data-flow/src/main/resources/local.properties index 880679d123..d9af8e69c4 100644 --- a/scheduler/data-flow/src/main/resources/local.properties +++ b/scheduler/data-flow/src/main/resources/local.properties @@ -2,7 +2,7 @@ kafka.bootstrap.servers=localhost:9092 kafka.partitions.default=1 kafka.replication.factor=1 kafka.state.clean=true -kafka.join.window.millis=300000 +kafka.join.window.millis=500 upstream.host=0.0.0.0 upstream.port=9008 cores.count=4 \ No newline at end of file diff --git a/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/TransformerTest.kt b/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/TransformerTest.kt index c6c9be398d..31ea364ad1 100644 --- a/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/TransformerTest.kt +++ b/scheduler/data-flow/src/test/kotlin/io/seldon/dataflow/kafka/TransformerTest.kt @@ -32,6 +32,7 @@ internal class TransformerTest { sources, emptyMap(), defaultSink, + false, baseKafkaProperties, kafkaDomainParams, ) @@ -171,6 +172,7 @@ internal class TransformerTest { properties = KafkaProperties(), tensorRenaming = emptyMap(), kafkaDomainParams = kafkaDomainParams, + outerJoin = false, ) } } diff --git a/scheduler/pkg/kafka/dataflow/server.go b/scheduler/pkg/kafka/dataflow/server.go index fe4640f330..5f7923e1fa 100644 --- a/scheduler/pkg/kafka/dataflow/server.go +++ b/scheduler/pkg/kafka/dataflow/server.go @@ -158,18 +158,38 @@ func (c *ChainerServer) createPipelineMessage(pv *pipeline.PipelineVersion) *cha Ty: chainer.PipelineStepUpdate_Inner, TensorMap: c.topicNamer.GetFullyQualifiedTensorMap(step.TensorMap), } + if step.OuterJoin { + stepUpdate.Ty = chainer.PipelineStepUpdate_Outer + } + if step.Batch != nil { + stepUpdate.Batch = &chainer.Batch{ + Size: step.Batch.Size, + WindowMs: step.Batch.WindowMs, + Rolling: step.Batch.Rolling, + } + } c.logger.Infof("Adding sources %v to %s", stepUpdate.Sources, stepUpdate.Sink) stepUpdates = append(stepUpdates, &stepUpdate) } if pv.Output != nil { stepUpdate := chainer.PipelineStepUpdate{ - Sources: c.createTopicSources(pv.Output.Inputs, pv.Name), + Sources: c.createTopicSources(pv.Output.Steps, pv.Name), Sink: c.topicNamer.GetPipelineTopicOutputs(pv.Name), Ty: chainer.PipelineStepUpdate_Inner, } + if pv.Output.OuterJoin { + stepUpdate.Ty = chainer.PipelineStepUpdate_Outer + } c.logger.Infof("Adding sources %v to %s", stepUpdate.Sources, stepUpdate.Sink) stepUpdates = append(stepUpdates, &stepUpdate) } + //Append an error step to send any errors to pipeline output + stepUpdates = append(stepUpdates, &chainer.PipelineStepUpdate{ + Sources: []string{c.topicNamer.GetModelErrorTopic()}, + Sink: c.topicNamer.GetPipelineTopicOutputs(pv.Name), + Ty: chainer.PipelineStepUpdate_Inner, + }) + op := chainer.PipelineUpdateMessage_Create if pv.State.Status != pipeline.PipelineCreate { op = chainer.PipelineUpdateMessage_Delete diff --git a/scheduler/pkg/kafka/gateway/manager.go b/scheduler/pkg/kafka/gateway/manager.go index 1141fec01d..3b230b19c4 100644 --- a/scheduler/pkg/kafka/gateway/manager.go +++ b/scheduler/pkg/kafka/gateway/manager.go @@ -89,7 +89,7 @@ func (km *KafkaManager) AddModel(modelName string, streamSpec *scheduler.StreamS ModelName: modelName, InputTopic: km.topicNamer.GetModelTopicInputs(modelName), OutputTopic: km.topicNamer.GetModelTopicOutputs(modelName), - ErrorTopic: "seldon-errors", + ErrorTopic: km.topicNamer.GetModelErrorTopic(), } if streamSpec != nil { if streamSpec.InputTopic != "" { diff --git a/scheduler/pkg/kafka/gateway/manager_test.go b/scheduler/pkg/kafka/gateway/manager_test.go index 11dc3d590b..cdad4c2b25 100644 --- a/scheduler/pkg/kafka/gateway/manager_test.go +++ b/scheduler/pkg/kafka/gateway/manager_test.go @@ -27,7 +27,7 @@ func TestManagerAddModel(t *testing.T) { streamSpec: nil, expectedInputTopic: "seldon.default.model.foo.inputs", expectedOutputTopic: "seldon.default.model.foo.outputs", - expectedErrorTopic: "seldon-errors", + expectedErrorTopic: "seldon.default.errors.outputs", }, { name: "basic with stream spec", @@ -38,7 +38,7 @@ func TestManagerAddModel(t *testing.T) { }, expectedInputTopic: "input", expectedOutputTopic: "output", - expectedErrorTopic: "seldon-errors", + expectedErrorTopic: "seldon.default.errors.outputs", }, } for _, test := range tests { diff --git a/scheduler/pkg/kafka/gateway/worker.go b/scheduler/pkg/kafka/gateway/worker.go index de2964ce86..88b92d6cb1 100644 --- a/scheduler/pkg/kafka/gateway/worker.go +++ b/scheduler/pkg/kafka/gateway/worker.go @@ -11,6 +11,8 @@ import ( "strconv" "time" + kafka2 "github.com/seldonio/seldon-core/scheduler/pkg/kafka" + "github.com/seldonio/seldon-core/scheduler/pkg/envoy/resources" "google.golang.org/grpc/metadata" @@ -143,7 +145,7 @@ func (iw *InferWorker) processRequest(job *InferWork) error { } } -func (iw *InferWorker) produce(job *InferWork, b []byte, headerType string) error { +func (iw *InferWorker) produce(job *InferWork, topic string, b []byte) error { logger := iw.logger.WithField("func", "produce") var kafkaHeaders []kafka.Header //kafkaHeaders = append(kafkaHeaders, kafka.Header{Key: HeaderKeyType, Value: []byte(headerType)}) @@ -151,21 +153,25 @@ func (iw *InferWorker) produce(job *InferWork, b []byte, headerType string) erro logger.Debugf("Adding pipeline header %s:%s", resources.SeldonPipelineHeader, pipelineName) kafkaHeaders = append(kafkaHeaders, kafka.Header{Key: resources.SeldonPipelineHeaderSuffix, Value: []byte(pipelineName)}) } - logger.Infof("Produce response to topic %s with header %s", iw.consumer.modelConfig.OutputTopic, headerType) + if topic == iw.consumer.modelConfig.ErrorTopic { + kafkaHeaders = append(kafkaHeaders, kafka.Header{Key: kafka2.TopicErrorHeader, Value: []byte("")}) + } + logger.Infof("Produce response to topic %s", topic) err := iw.consumer.producer.Produce(&kafka.Message{ - TopicPartition: kafka.TopicPartition{Topic: &iw.consumer.modelConfig.OutputTopic, Partition: kafka.PartitionAny}, + TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Key: job.key, Value: b, Headers: kafkaHeaders, }, nil) if err != nil { - iw.logger.WithError(err).Errorf("Failed to produce response for model %s", iw.consumer.modelConfig.ModelName) + iw.logger.WithError(err).Errorf("Failed to produce response for model %s", topic) return err } return nil } func (iw *InferWorker) restRequest(job *InferWork, maybeConvert bool) error { + logger := iw.logger.WithField("func", "restRequest") if maybeConvert { job.value = maybeChainRest(job.value) } @@ -189,12 +195,14 @@ func (iw *InferWorker) restRequest(job *InferWork, maybeConvert bool) error { } iw.logger.Infof("v2 server response: %s", b) if response.StatusCode != http.StatusOK { - return fmt.Errorf("Failed infer call code:%d", response.StatusCode) + logger.Warnf("Failed infer request with status code %d and payload %s", response.StatusCode, string(b)) + return iw.produce(job, iw.consumer.modelConfig.ErrorTopic, b) } - return iw.produce(job, b, HeaderValueJsonRes) + return iw.produce(job, iw.consumer.modelConfig.OutputTopic, b) } func (iw *InferWorker) grpcRequest(job *InferWork, req *v2.ModelInferRequest) error { + logger := iw.logger.WithField("func", "grpcRequest") //Update req with correct modelName req.ModelName = iw.consumer.modelConfig.ModelName req.ModelVersion = fmt.Sprintf("%d", util.GetPinnedModelVersion()) @@ -202,11 +210,12 @@ func (iw *InferWorker) grpcRequest(job *InferWork, req *v2.ModelInferRequest) er ctx = metadata.AppendToOutgoingContext(ctx, resources.SeldonModelHeader, iw.consumer.modelConfig.ModelName) resp, err := iw.grpcClient.ModelInfer(ctx, req) if err != nil { - return err + logger.WithError(err).Warnf("Failed infer request") + return iw.produce(job, iw.consumer.modelConfig.ErrorTopic, []byte(err.Error())) } b, err := proto.Marshal(resp) if err != nil { return err } - return iw.produce(job, b, HeaderValueProtoRes) + return iw.produce(job, iw.consumer.modelConfig.OutputTopic, b) } diff --git a/scheduler/pkg/kafka/pipeline/kafkamanager.go b/scheduler/pkg/kafka/pipeline/kafkamanager.go index 3ceb6f574b..e93769e93e 100644 --- a/scheduler/pkg/kafka/pipeline/kafkamanager.go +++ b/scheduler/pkg/kafka/pipeline/kafkamanager.go @@ -47,6 +47,7 @@ type Request struct { active bool wg *sync.WaitGroup response []byte + isError bool } func NewKafkaManager(logger logrus.FieldLogger, namespace string) *KafkaManager { @@ -197,9 +198,21 @@ func (km *KafkaManager) Infer(resourceName string, isModel bool, data []byte) ([ return nil, err } request.wg.Wait() + if request.isError { + return nil, fmt.Errorf("%s", string(request.response)) + } return request.response, nil } +func hasErrorHeader(headers []kafka.Header) bool { + for _, header := range headers { + if header.Key == kafka2.TopicErrorHeader { + return true + } + } + return false +} + func (km *KafkaManager) consume(pipeline *Pipeline) error { logger := km.logger.WithField("func", "consume") topicName := km.topicNamer.GetPipelineTopicOutputs(pipeline.resourceName) @@ -230,6 +243,7 @@ func (km *KafkaManager) consume(pipeline *Pipeline) error { request := val.(*Request) request.mu.Lock() if request.active { + request.isError = hasErrorHeader(e.Headers) request.response = e.Value request.wg.Done() request.active = false diff --git a/scheduler/pkg/kafka/topics.go b/scheduler/pkg/kafka/topics.go index 7e719dc4bd..5de1154f1d 100644 --- a/scheduler/pkg/kafka/topics.go +++ b/scheduler/pkg/kafka/topics.go @@ -8,8 +8,10 @@ const ( seldonTopicPrefix = "seldon" modelTopic = "model" pipelineTopic = "pipeline" + errorsTopic = "errors" inputsSuffix = "inputs" outputsSuffix = "outputs" + TopicErrorHeader = "seldon-pipeline-errors" ) type TopicNamer struct { @@ -25,6 +27,10 @@ func NewTopicNamer(namespace string) *TopicNamer { } } +func (tn *TopicNamer) GetModelErrorTopic() string { + return fmt.Sprintf("%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, errorsTopic, outputsSuffix) +} + func (tn *TopicNamer) GetModelTopicInputs(modelName string) string { return fmt.Sprintf("%s.%s.%s.%s.%s", seldonTopicPrefix, tn.namespace, modelTopic, modelName, inputsSuffix) } diff --git a/scheduler/pkg/server/server_test.go b/scheduler/pkg/server/server_test.go index 75b160e155..0ba427811b 100644 --- a/scheduler/pkg/server/server_test.go +++ b/scheduler/pkg/server/server_test.go @@ -282,7 +282,7 @@ func TestLoadPipeline(t *testing.T) { }, }, Output: &pb.PipelineOutput{ - Inputs: []string{"b.outputs"}, + Steps: []string{"b.outputs"}, }, }, }, diff --git a/scheduler/pkg/store/pipeline/errors.go b/scheduler/pkg/store/pipeline/errors.go index 6338b79093..62013537b7 100644 --- a/scheduler/pkg/store/pipeline/errors.go +++ b/scheduler/pkg/store/pipeline/errors.go @@ -129,3 +129,20 @@ type PipelineMultiStepNoOutput struct { func (por *PipelineMultiStepNoOutput) Error() string { return fmt.Sprintf("multi step pipeline %s must specify output", por.pipeline) } + +type PipelineStepRepeatedErr struct { + pipeline string + step string +} + +func (psr *PipelineStepRepeatedErr) Error() string { + return fmt.Sprintf("pipeline %s has repeated step %s", psr.pipeline, psr.step) +} + +type PipelineCycleErr struct { + pipeline string +} + +func (psr *PipelineCycleErr) Error() string { + return fmt.Sprintf("pipeline %s has a cycle", psr.pipeline) +} diff --git a/scheduler/pkg/store/pipeline/pipeline.go b/scheduler/pkg/store/pipeline/pipeline.go index e96b9cc348..52c81dbe81 100644 --- a/scheduler/pkg/store/pipeline/pipeline.go +++ b/scheduler/pkg/store/pipeline/pipeline.go @@ -84,14 +84,22 @@ func (ps *PipelineState) setState(status PipelineStatus, reason string) { } type PipelineStep struct { - Name string - Inputs []string - TensorMap map[string]string - JoinWindowMs *uint32 - PassEmptyOutputs bool + Name string + Inputs []string + TensorMap map[string]string + JoinWindowMs *uint32 + OuterJoin bool + Batch *Batch +} + +type Batch struct { + Size *uint32 + WindowMs *uint32 + Rolling bool } type PipelineOutput struct { - Inputs []string + Steps []string JoinWindowMs uint32 + OuterJoin bool } diff --git a/scheduler/pkg/store/pipeline/store_test.go b/scheduler/pkg/store/pipeline/store_test.go index 5628b3848f..0576864b05 100644 --- a/scheduler/pkg/store/pipeline/store_test.go +++ b/scheduler/pkg/store/pipeline/store_test.go @@ -31,7 +31,7 @@ func TestAddPipeline(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"step1.outputs"}, + Steps: []string{"step1.outputs"}, }, }, store: &PipelineStore{ @@ -51,7 +51,7 @@ func TestAddPipeline(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"step1.outputs"}, + Steps: []string{"step1.outputs"}, }, KubernetesMeta: &scheduler.KubernetesMeta{ Namespace: "default", @@ -75,7 +75,7 @@ func TestAddPipeline(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"step1.outputs"}, + Steps: []string{"step1.outputs"}, }, }, store: &PipelineStore{ diff --git a/scheduler/pkg/store/pipeline/utils.go b/scheduler/pkg/store/pipeline/utils.go index abcc62eb30..5bee2f5236 100644 --- a/scheduler/pkg/store/pipeline/utils.go +++ b/scheduler/pkg/store/pipeline/utils.go @@ -20,18 +20,26 @@ func CreateProtoFromPipeline(pv *PipelineVersion) *scheduler.Pipeline { for _, stepName := range keys { step := pv.Steps[stepName] protoStep := &scheduler.PipelineStep{ - Name: step.Name, - Inputs: step.Inputs, - TensorMap: step.TensorMap, - PassEmptyResponses: step.PassEmptyOutputs, - JoinWindowMs: step.JoinWindowMs, + Name: step.Name, + Inputs: step.Inputs, + TensorMap: step.TensorMap, + JoinWindowMs: step.JoinWindowMs, + OuterJoin: step.OuterJoin, + } + if step.Batch != nil { + protoStep.Batch = &scheduler.Batch{ + Size: step.Batch.Size, + WindowMs: step.Batch.WindowMs, + Rolling: step.Batch.Rolling, + } } protoSteps = append(protoSteps, protoStep) } if pv.Output != nil { protoOutput = &scheduler.PipelineOutput{ - Inputs: pv.Output.Inputs, + Steps: pv.Output.Steps, JoinWindowMs: pv.Output.JoinWindowMs, + OuterJoin: pv.Output.OuterJoin, } } var kubernetesMeta *scheduler.KubernetesMeta @@ -53,11 +61,21 @@ func CreatePipelineFromProto(pipelineProto *scheduler.Pipeline, version uint32) steps := make(map[string]*PipelineStep) for _, stepProto := range pipelineProto.Steps { step := &PipelineStep{ - Name: stepProto.GetName(), - Inputs: updateInputSteps(stepProto.Inputs), - TensorMap: stepProto.TensorMap, - PassEmptyOutputs: stepProto.PassEmptyResponses, - JoinWindowMs: stepProto.JoinWindowMs, + Name: stepProto.GetName(), + Inputs: updateInputSteps(stepProto.Inputs), + TensorMap: stepProto.TensorMap, + JoinWindowMs: stepProto.JoinWindowMs, + OuterJoin: stepProto.OuterJoin, + } + if stepProto.Batch != nil { + step.Batch = &Batch{ + Size: stepProto.Batch.Size, + WindowMs: stepProto.Batch.WindowMs, + Rolling: stepProto.Batch.Rolling, + } + } + if _, ok := steps[stepProto.Name]; ok { + return nil, &PipelineStepRepeatedErr{pipeline: pipelineProto.GetName(), step: stepProto.GetName()} } steps[stepProto.Name] = step } @@ -65,8 +83,9 @@ func CreatePipelineFromProto(pipelineProto *scheduler.Pipeline, version uint32) var output *PipelineOutput if pipelineProto.Output != nil { output = &PipelineOutput{ - Inputs: updateInputSteps(pipelineProto.Output.Inputs), + Steps: updateInputSteps(pipelineProto.Output.Steps), JoinWindowMs: pipelineProto.Output.JoinWindowMs, + OuterJoin: pipelineProto.Output.OuterJoin, } } var kubernetesMeta *KubernetesMeta diff --git a/scheduler/pkg/store/pipeline/utils_test.go b/scheduler/pkg/store/pipeline/utils_test.go index 901cd9cb71..5b33665ed9 100644 --- a/scheduler/pkg/store/pipeline/utils_test.go +++ b/scheduler/pkg/store/pipeline/utils_test.go @@ -1,7 +1,6 @@ package pipeline import ( - "errors" "testing" . "github.com/onsi/gomega" @@ -41,6 +40,7 @@ func TestCreatePipelineFromProto(t *testing.T) { err error } + getUintPtr := func(val uint32) *uint32 { return &val } tests := []test{ { name: "simple", @@ -58,7 +58,7 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"b"}, + Steps: []string{"b"}, }, }, pipeline: &PipelineVersion{ @@ -75,7 +75,7 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &PipelineOutput{ - Inputs: []string{"b"}, + Steps: []string{"b"}, }, State: &PipelineState{}, }, @@ -97,7 +97,7 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"b"}, + Steps: []string{"b"}, }, }, pipeline: &PipelineVersion{ @@ -115,7 +115,61 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &PipelineOutput{ - Inputs: []string{"b"}, + Steps: []string{"b"}, + }, + State: &PipelineState{}, + }, + }, + { + name: "simple with join and batch", + version: 1, + proto: &scheduler.Pipeline{ + Name: "pipeline", + Steps: []*scheduler.PipelineStep{ + { + Name: "a", + Inputs: []string{}, + }, + { + Name: "b", + Inputs: []string{"a.outputs"}, + TensorMap: map[string]string{"output1": "input1"}, + OuterJoin: true, + Batch: &scheduler.Batch{ + Size: getUintPtr(100), + WindowMs: getUintPtr(1000), + Rolling: true, + }, + }, + }, + Output: &scheduler.PipelineOutput{ + Steps: []string{"b"}, + OuterJoin: true, + }, + }, + pipeline: &PipelineVersion{ + Name: "pipeline", + Version: 1, + Steps: map[string]*PipelineStep{ + "a": { + Name: "a", + Inputs: []string{}, + }, + "b": { + Name: "b", + Inputs: []string{"a.outputs"}, + TensorMap: map[string]string{"output1": "input1"}, + OuterJoin: true, + Batch: &Batch{ + Size: getUintPtr(100), + WindowMs: getUintPtr(1000), + Rolling: true, + }, + }, + }, + Output: &PipelineOutput{ + Steps: []string{"b"}, + OuterJoin: true, }, State: &PipelineState{}, }, @@ -164,7 +218,7 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &scheduler.PipelineOutput{ - Inputs: []string{"step1"}, + Steps: []string{"step1"}, }, }, pipeline: &PipelineVersion{ @@ -177,11 +231,32 @@ func TestCreatePipelineFromProto(t *testing.T) { }, }, Output: &PipelineOutput{ - Inputs: []string{"b"}, + Steps: []string{"b"}, }, State: &PipelineState{}, }, }, + { + name: "pipeline step repeated", + version: 1, + proto: &scheduler.Pipeline{ + Name: "pipeline", + Steps: []*scheduler.PipelineStep{ + { + Name: "foo", + Inputs: []string{}, + }, + { + Name: "foo", + Inputs: []string{}, + }, + }, + Output: &scheduler.PipelineOutput{ + Steps: []string{"b"}, + }, + }, + err: &PipelineStepRepeatedErr{pipeline: "pipeline", step: "foo"}, + }, } for _, test := range tests { @@ -194,7 +269,7 @@ func TestCreatePipelineFromProto(t *testing.T) { g.Expect(test.pipeline.Steps[k]).To(Equal(v)) } } else { - g.Expect(errors.Is(err, test.err)).To(BeTrue()) + g.Expect(err.Error()).To(Equal(test.err.Error())) } }) } diff --git a/scheduler/pkg/store/pipeline/validate.go b/scheduler/pkg/store/pipeline/validate.go index 4033deaedd..8f7db1b9c4 100644 --- a/scheduler/pkg/store/pipeline/validate.go +++ b/scheduler/pkg/store/pipeline/validate.go @@ -22,9 +22,9 @@ func validate(pv *PipelineVersion) error { if err := checkStepInputs(pv); err != nil { return err } - //if err := checkOnlyOneInput(pv); err != nil { - // return err - //} + if err := checkForCycles(pv); err != nil { + return err + } return nil } @@ -32,6 +32,42 @@ func getStepNameFromInput(stepName string) string { return strings.Split(stepName, StepNameSeperator)[0] } +func checkForCyclesFromStep(step *PipelineStep, pv *PipelineVersion, visited map[string]bool) error { + visited[step.Name] = true + stepNames := make(map[string]bool) + for _, inp := range step.Inputs { + stepNames[getStepNameFromInput(inp)] = true + } + for stepName := range stepNames { + if _, ok := visited[stepName]; ok { + return &PipelineCycleErr{pipeline: pv.Name} + } + err := checkForCyclesFromStep(pv.Steps[stepName], pv, visited) + if err != nil { + return err + } + } + return nil +} + +func checkForCycles(pv *PipelineVersion) error { + checked := make(map[string]bool) + for k, v := range pv.Steps { + if _, ok := checked[k]; ok { + continue + } + visited := make(map[string]bool) + err := checkForCyclesFromStep(v, pv, visited) + if err != nil { + return err + } + for k := range visited { + checked[k] = true + } + } + return nil +} + func checkStepReferencesExist(pv *PipelineVersion) error { for k, v := range pv.Steps { for _, inp := range v.Inputs { @@ -41,6 +77,14 @@ func checkStepReferencesExist(pv *PipelineVersion) error { } } } + if pv.Output != nil { + for _, step := range pv.Output.Steps { + stepName := getStepNameFromInput(step) + if _, ok := pv.Steps[stepName]; !ok { + return &PipelineOutputStepNotFoundErr{pipeline: pv.Name, step: stepName} + } + } + } return nil } @@ -68,17 +112,3 @@ func checkStepInputs(pv *PipelineVersion) error { } return nil } - -func checkOnlyOneInput(pv *PipelineVersion) error { - foundInputStep := false - for _, v := range pv.Steps { - if len(v.Inputs) == 0 { - if foundInputStep { - return &PipelineMultipleInputsErr{pipeline: pv.Name} - } else { - foundInputStep = true - } - } - } - return nil -} diff --git a/scheduler/pkg/store/pipeline/validate_test.go b/scheduler/pkg/store/pipeline/validate_test.go index ba9a770851..6cc870c425 100644 --- a/scheduler/pkg/store/pipeline/validate_test.go +++ b/scheduler/pkg/store/pipeline/validate_test.go @@ -33,7 +33,7 @@ func TestCheckStepReferencesExist(t *testing.T) { }, }, Output: &PipelineOutput{ - Inputs: []string{"c.outputs"}, + Steps: []string{"c.outputs"}, }, }, }, @@ -57,6 +57,25 @@ func TestCheckStepReferencesExist(t *testing.T) { }, err: &PipelineStepNotFoundErr{pipeline: "test", step: "c", badRef: "f"}, }, + { + name: "output step does not exist", + pipelineVersion: &PipelineVersion{ + Name: "test", + Steps: map[string]*PipelineStep{ + "a": { + Name: "a", + }, + "b": { + Name: "b", + Inputs: []string{"a.outputs.out1"}, + }, + }, + Output: &PipelineOutput{ + Steps: []string{"a", "b", "foo"}, + }, + }, + err: &PipelineOutputStepNotFoundErr{pipeline: "test", step: "foo"}, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -148,3 +167,88 @@ func TestCheckStepInputsSpecifier(t *testing.T) { }) } } + +func TestCheckForCycles(t *testing.T) { + g := NewGomegaWithT(t) + tests := []validateTest{ + { + name: "no loops", + pipelineVersion: &PipelineVersion{ + Name: "test", + Steps: map[string]*PipelineStep{ + "a": { + Name: "a", + }, + "b": { + Name: "b", + Inputs: []string{"a.outputs.t1", "a.inputs", "a.outputs"}, + }, + "c": { + Name: "c", + Inputs: []string{"a.outputs.t1"}, + }, + }, + }, + }, + { + name: "loop", + pipelineVersion: &PipelineVersion{ + Name: "test", + Steps: map[string]*PipelineStep{ + "a": { + Name: "a", + }, + "b": { + Name: "b", + Inputs: []string{"a.outputs", "c.outputs"}, + }, + "c": { + Name: "c", + Inputs: []string{"b.outputs"}, + }, + }, + }, + err: &PipelineCycleErr{pipeline: "test"}, + }, + { + name: "separate loop", + pipelineVersion: &PipelineVersion{ + Name: "test", + Steps: map[string]*PipelineStep{ + "a": { + Name: "a", + }, + "b": { + Name: "b", + Inputs: []string{"a.outputs"}, + }, + "c": { + Name: "c", + Inputs: []string{"a.outputs", "d.outputs"}, + }, + "d": { + Name: "c", + Inputs: []string{"c.outputs"}, + }, + }, + }, + err: &PipelineCycleErr{pipeline: "test"}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := checkForCycles(test.pipelineVersion) + if test.err == nil { + g.Expect(err).To(BeNil()) + } else { + g.Expect(err.Error()).To(Equal(test.err.Error())) + } + err = validate(test.pipelineVersion) + if test.err == nil { + g.Expect(err).To(BeNil()) + } else { + g.Expect(err.Error()).To(Equal(test.err.Error())) + } + }) + } +}