OK, I think there was plenty of time to comment on this FLIP.
I'll move it to the ACCEPTED status.

@Stavros, please consider the feedback regarding the metrics.
I agree with Chesnay that metrics should be primarily exposed via the
metrics system.
Storing them in state makes them fault-tolerant and queryable if the state
is properly configured.

Thanks,
Fabian

2018-01-22 17:19 GMT+01:00 Chesnay Schepler <ches...@apache.org>:

> I'm currently looking over it, but one thing that stood out was that the
> FLIP proposes to use queryable state
> as a monitoring solution. Given that we have a metric system that
> integrates with plenty of commonly used
> metric backends this doesn't really make sense to me.
>
> Storing them in state still has value in terms of fault-tolerance though,
> since this is something that the metric
> system doesn't provide by itself.
>
>
> On 18.01.2018 13:57, Fabian Hueske wrote:
>
>> Are there any more comments on the FLIP?
>>
>> Otherwise, I'd suggest to move the FLIP to the accepted FLIPs [1] and
>> continue with the implementation.
>>
>> Also, is there a committer who'd like to shepherd the FLIP and review the
>> corresponding PRs?
>> Of course, everybody is welcome to review the code but we need at least
>> one
>> committer who will eventually merge the changes.
>>
>> Best,
>> Fabian
>>
>> [1]
>> https://cwiki.apache.org/confluence/display/FLINK/Flink+
>> Improvement+Proposals
>>
>> 2017-12-04 10:54 GMT+01:00 Fabian Hueske <fhue...@gmail.com>:
>>
>> Hi,
>>>
>>> Sorry for the late follow up.
>>>
>>> I think I understand the motivation for choosing ProtoBuf as the
>>> representation and serialization format and this makes sense to me.
>>>
>>> However, it might be a good idea to provide tooling to convert Flink
>>> types
>>> (described as TypeInformation) to ProtoBuf.
>>> Otherwise, users of the model serving library would need to manually
>>> convert their data types (say Scala tuples, case classes, or Avro Pojos)
>>> to
>>> ProtoBuf messages.
>>> I don't think that this needs to be included in the first version but it
>>> might be a good extension to make the library easier to use.
>>>
>>> Best,
>>> Fabian
>>>
>>>
>>>
>>> 2017-11-28 17:22 GMT+01:00 Boris Lublinsky <
>>> boris.lublin...@lightbend.com>
>>> :
>>>
>>> Thanks Fabian,
>>>> More below
>>>>
>>>>
>>>>
>>>> Boris Lublinsky
>>>> FDP Architect
>>>> boris.lublin...@lightbend.com
>>>> https://www.lightbend.com/
>>>>
>>>> On Nov 28, 2017, at 8:21 AM, Fabian Hueske <fhue...@gmail.com> wrote:
>>>>
>>>> Hi Boris and Stavros,
>>>>
>>>> Thanks for the responses.
>>>>
>>>> Ad 1) Thanks for the clarification. I think I misunderstood this part of
>>>> the proposal.
>>>> I interpreted the argument why to chose ProtoBuf for network encoding
>>>> ("ability
>>>> to represent different data types") such that different a model pipeline
>>>> should work on different data types.
>>>> I agree that it should be possible to give records of the same type (but
>>>> with different keys) to different models. The key-based join approach
>>>> looks
>>>> good to me.
>>>>
>>>> Ad 2) I understand that ProtoBuf is a good choice to serialize models
>>>> for
>>>> the given reasons.
>>>> However, the choice of ProtoBuf serialization for the records might make
>>>> the integration with existing libraries and also regular DataStream
>>>> programs more difficult.
>>>> They all use Flink's TypeSerializer system to serialize and deserialize
>>>> records by default. Hence, we would need to add a conversion step before
>>>> records can be passed to a model serving operator.
>>>> Are you expecting some common format that all records follow (such as a
>>>> Row or Vector type) or do you plan to support arbitrary records such as
>>>> Pojos?
>>>> If you plan for a specific type, you could add a TypeInformation for
>>>> this
>>>> type with a TypeSerializer that is based on ProtoBuf.
>>>>
>>>> The way I look at it is slightly different. The common format for
>>>> records, supported by Flink, is Byte array with a little bit of header,
>>>> describing data type and is used for routing. The actual unmarshalling
>>>> is
>>>> done by the model implementation itself. This provides the maximum
>>>> flexibility and gives user the freedom to create his own types without
>>>> breaking underlying framework.
>>>>
>>>> Ad 4) @Boris: I made this point not about the serialization format but
>>>> how the library would integrate with Flink's DataStream API.
>>>> I thought I had seen a code snippet that showed a new method on the
>>>> DataStream object but cannot find this anymore.
>>>> So, I just wanted to make the point that we should not change the
>>>> DataStream API (unless it lacks support for some features) and built the
>>>> model serving library on top of it.
>>>> But I get from Stavros answer that this is your design anyway.
>>>>
>>>> Ad 5) The metrics system is the default way to expose system and job
>>>> metrics in Flink. Due to the pluggable reporter interface and various
>>>> reporters, they can be easily integrated in many production
>>>> environments.
>>>> A solution based on queryable state will always need custom code to
>>>> access the information. Of course this can be an optional feature.
>>>>
>>>> What do others think about this proposal?
>>>>
>>>> We had agreement among work group - Eron, Bas, Andrea, etc, but you are
>>>> the first one outside of it. My book https://www.lightbend.com
>>>> /blog/serving-machine-learning-models-free-oreilly-ebook-from-lightbend
>>>> has
>>>>
>>>> a reasonably good reviews, so we are hoping this will work
>>>>
>>>>
>>>> Best, Fabian
>>>>
>>>>
>>>> 2017-11-28 13:53 GMT+01:00 Stavros Kontopoulos <
>>>> st.kontopou...@gmail.com>
>>>> :
>>>>
>>>> Hi Fabian thanx!
>>>>>
>>>>>
>>>>> 1) Is it a strict requirement that a ML pipeline must be able to handle
>>>>>> different input types?
>>>>>> I understand that it makes sense to have different models for
>>>>>> different
>>>>>> instances of the same type, i.e., same data type but different keys.
>>>>>>
>>>>> Hence,
>>>>>
>>>>>> the key-based joins make sense to me. However, couldn't completely
>>>>>> different types be handled by different ML pipelines or would there be
>>>>>> major drawbacks?
>>>>>>
>>>>>
>>>>> Could you elaborate more on this? Right now we only use keys when we do
>>>>> the
>>>>> join. A given pipeline can handle only a well defined type (the type
>>>>> can
>>>>> be
>>>>> a simple string with a custom value, no need to be a
>>>>> class type) which serves as a key.
>>>>>
>>>>> 2)
>>>>>
>>>>> I think from an API point of view it would be better to not require
>>>>>
>>>>>> input records to be encoded as ProtoBuf messages. Instead, the model
>>>>>>
>>>>> server
>>>>>
>>>>>> could accept strongly-typed objects (Java/Scala) and (if necessary)
>>>>>>
>>>>> convert
>>>>>
>>>>>> them to ProtoBuf messages internally. In case we need to support
>>>>>>
>>>>> different
>>>>>
>>>>>> types of records (see my first point), we can introduce a Union type
>>>>>>
>>>>> (i.e.,
>>>>>
>>>>>> an n-ary Either type). I see that we need some kind of binary encoding
>>>>>> format for the models but maybe also this can be designed to be
>>>>>>
>>>>> pluggable
>>>>>
>>>>>> such that later other encodings can be added.
>>>>>>
>>>>>>   We do uses scala classes (strongly typed classes), protobuf is only
>>>>> used
>>>>> on the wire. For on the wire encoding we prefer protobufs for size,
>>>>> expressiveness and ability to represent different data types.
>>>>>
>>>>> 3)
>>>>>
>>>>> I think the DataStream Java API should be supported as a first class
>>>>>
>>>>>> citizens for this library.
>>>>>>
>>>>>
>>>>> I agree. It should be either first priority or a next thing to do.
>>>>>
>>>>>
>>>>> 4)
>>>>>
>>>>> For the integration with the DataStream API, we could provide an API
>>>>> that
>>>>>
>>>>>> receives (typed) DataStream objects, internally constructs the
>>>>>>
>>>>> DataStream
>>>>>
>>>>>> operators, and returns one (or more) result DataStreams. The benefit
>>>>>> is
>>>>>> that we don't need to change the DataStream API directly, but put a
>>>>>>
>>>>> library
>>>>>
>>>>>> on top. The other libraries (CEP, Table, Gelly) follow this approach.
>>>>>>
>>>>>
>>>>>   We will provide a DSL which will do jsut this. But even without the
>>>>> DSL
>>>>> this is what we do with low level joins.
>>>>>
>>>>>
>>>>> 5)
>>>>>
>>>>> I'm skeptical about using queryable state to expose metrics. Did you
>>>>>> consider using Flink's metrics system [1]? It is easily configurable
>>>>>>
>>>>> and we
>>>>>
>>>>>> provided several reporters that export the metrics.
>>>>>>
>>>>>> This of course is an option. The choice of queryable state was mostly
>>>>> driven by a simplicity of real time integration.  Any reason why
>>>>> metrics
>>>>> system is netter?
>>>>>
>>>>>
>>>>> Best,
>>>>> Stavros
>>>>>
>>>>> On Mon, Nov 27, 2017 at 4:23 PM, Fabian Hueske <fhue...@gmail.com>
>>>>> wrote:
>>>>>
>>>>> Hi Stavros,
>>>>>>
>>>>>> thanks for the detailed FLIP!
>>>>>> Model serving is an important use case and it's great to see efforts
>>>>>>
>>>>> to add
>>>>>
>>>>>> a library for this to Flink!
>>>>>>
>>>>>> I've read the FLIP and would like to ask a few questions and make some
>>>>>> suggestions.
>>>>>>
>>>>>> 1) Is it a strict requirement that a ML pipeline must be able to
>>>>>> handle
>>>>>> different input types?
>>>>>> I understand that it makes sense to have different models for
>>>>>> different
>>>>>> instances of the same type, i.e., same data type but different keys.
>>>>>>
>>>>> Hence,
>>>>>
>>>>>> the key-based joins make sense to me. However, couldn't completely
>>>>>> different types be handled by different ML pipelines or would there be
>>>>>> major drawbacks?
>>>>>>
>>>>>> 2) I think from an API point of view it would be better to not require
>>>>>> input records to be encoded as ProtoBuf messages. Instead, the model
>>>>>>
>>>>> server
>>>>>
>>>>>> could accept strongly-typed objects (Java/Scala) and (if necessary)
>>>>>>
>>>>> convert
>>>>>
>>>>>> them to ProtoBuf messages internally. In case we need to support
>>>>>>
>>>>> different
>>>>>
>>>>>> types of records (see my first point), we can introduce a Union type
>>>>>>
>>>>> (i.e.,
>>>>>
>>>>>> an n-ary Either type). I see that we need some kind of binary encoding
>>>>>> format for the models but maybe also this can be designed to be
>>>>>>
>>>>> pluggable
>>>>>
>>>>>> such that later other encodings can be added.
>>>>>>
>>>>>> 3) I think the DataStream Java API should be supported as a first
>>>>>> class
>>>>>> citizens for this library.
>>>>>>
>>>>>> 4) For the integration with the DataStream API, we could provide an
>>>>>> API
>>>>>> that receives (typed) DataStream objects, internally constructs the
>>>>>> DataStream operators, and returns one (or more) result DataStreams.
>>>>>> The
>>>>>> benefit is that we don't need to change the DataStream API directly,
>>>>>>
>>>>> but
>>>>>
>>>>>> put a library on top. The other libraries (CEP, Table, Gelly) follow
>>>>>>
>>>>> this
>>>>>
>>>>>> approach.
>>>>>>
>>>>>> 5) I'm skeptical about using queryable state to expose metrics. Did
>>>>>> you
>>>>>> consider using Flink's metrics system [1]? It is easily configurable
>>>>>>
>>>>> and we
>>>>>
>>>>>> provided several reporters that export the metrics.
>>>>>>
>>>>>> What do you think?
>>>>>> Best, Fabian
>>>>>>
>>>>>> [1]
>>>>>> https://ci.apache.org/projects/flink/flink-docs-release-1.3/
>>>>>>
>>>>> monitoring/
>>>>>
>>>>>> metrics.html
>>>>>>
>>>>>> 2017-11-23 12:32 GMT+01:00 Stavros Kontopoulos <
>>>>>>
>>>>> st.kontopou...@gmail.com>:
>>>>>
>>>>>> Hi guys,
>>>>>>>
>>>>>>> Let's discuss the new FLIP proposal for model serving over Flink. The
>>>>>>>
>>>>>> idea
>>>>>>
>>>>>>> is to combine previous efforts there and provide a library on top of
>>>>>>>
>>>>>> Flink
>>>>>>
>>>>>>> for serving models.
>>>>>>>
>>>>>>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-
>>>>>>>
>>>>>> 23+-+Model+Serving
>>>>>>
>>>>>>> Code from previous efforts can be found here:
>>>>>>>
>>>>>> https://github.com/FlinkML
>>>>>
>>>>>> Best,
>>>>>>> Stavros
>>>>>>>
>>>>>>>
>>>>
>>>>
>

Reply via email to