Add specification for Watcher Scoring Module
This specification defines a Scoring Module which attempts to standarize interactions between Watcher Decision Engine and scoring engines, which can be implemented using external machine learning tools or frameworks. Change-Id: I3325f80924b70376def77e692296079dd45cc495 Implements: blueprint scoring-module
This commit is contained in:
parent
cf70ad13ab
commit
ce10b9f750
BIN
doc/source/images/scoring-engine-in-the-cloud.png
Normal file
BIN
doc/source/images/scoring-engine-in-the-cloud.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
BIN
doc/source/images/scoring-engine-inside-decision-engine.png
Normal file
BIN
doc/source/images/scoring-engine-inside-decision-engine.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
doc/source/images/scoring-engine-inside-scoring-module.png
Normal file
BIN
doc/source/images/scoring-engine-inside-scoring-module.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
doc/source/images/scoring-module-deployment.png
Normal file
BIN
doc/source/images/scoring-module-deployment.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
405
specs/newton/approved/scoring-module.rst
Normal file
405
specs/newton/approved/scoring-module.rst
Normal file
@ -0,0 +1,405 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Provide a scoring module for Watcher
|
||||||
|
======================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/watcher/+spec/scoring-module
|
||||||
|
|
||||||
|
`Watcher Decision Engine`_ currently allows to define multiple `Goals`_ and
|
||||||
|
implement several `Strategies`_ to reach them. However, in some more advanced
|
||||||
|
scenarios, `Strategies`_ might use machine learning models, which can be
|
||||||
|
trained and evaluated using external machine learning engines.
|
||||||
|
|
||||||
|
This blueprint aims at providing a generic scoring engine module, which will
|
||||||
|
standarize interactions with scoring engines through the common API. Also,
|
||||||
|
it will be possible to use the scoring engine by different `Strategies`_, which
|
||||||
|
will improve the code and data model re-use.
|
||||||
|
|
||||||
|
The scoring module will be independent and optional. There is no need for any
|
||||||
|
`Strategy`_ to use it.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Today, the `Strategy`_ implementation is free to use any algorithm or any
|
||||||
|
external framework in order to achieve a given `Goal`_. There is no standard
|
||||||
|
interface or API which would help to share these algorithms or frameworks
|
||||||
|
between different `Strategies`_.
|
||||||
|
|
||||||
|
It should be possible to implement scoring engines independently from
|
||||||
|
`Strategies`_. Once implemented prediction or classifier could be shared and
|
||||||
|
re-used allowing to implement more advanced `Strategies`_, which could even use
|
||||||
|
multiple scoring engines.
|
||||||
|
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
I want to be able to list the available Scoring Engines. So that I can quickly
|
||||||
|
identify them and reuse the available predicted results in my strategy, e.g.
|
||||||
|
prediction energy consumption of the VMs, predicted CPU of the VMs, etc.
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
I want to be able to create and use Scoring Engines in the optimization
|
||||||
|
`Strategies`_. So that I can quickly switch the Scoring Engine or implement
|
||||||
|
multiple versions of the same Scoring Engine (e.g. created using a different
|
||||||
|
data set for learning).
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
I want to be able to configure multiple Scoring Engines without needing an
|
||||||
|
upgrade of Watcher.
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
I want to be able to provide a dynamic list of Scoring Engines in a single
|
||||||
|
plug-in. So that I can register/unregister similar types of Scoring Engines
|
||||||
|
without restarting any Watcher service.
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
When implementing a new `Strategy`_ I want to work with different Scoring
|
||||||
|
Engines (possibly from different vendors) in a similar way, using similar
|
||||||
|
API.
|
||||||
|
|
||||||
|
As a developer.
|
||||||
|
I want to get metadata information about a given Scoring Engine. The metadata
|
||||||
|
might contain an important information how to work with a specific Scoring
|
||||||
|
Engine, for example: number of input parameters (e.g. number of features),
|
||||||
|
the response format (e.g. label order used by classifier).
|
||||||
|
|
||||||
|
Project Priority
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Not relevant because Watcher is not in the big tent so far.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
The proposal is to define an abstraction layer in the `Decision Engine`_,
|
||||||
|
which will provide an abstract ScoringEngine class, which will have to be
|
||||||
|
implemented by all Scoring Engines and a ScoringFactory class, which will be
|
||||||
|
used by a `Strategy`_ implementation to select a Scoring Engine to work with.
|
||||||
|
|
||||||
|
Usage scenarios
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The most basic scenario is presented on the following diagram:
|
||||||
|
|
||||||
|
.. image:: ../../../doc/source/images/scoring-engine-inside-decision-engine.png
|
||||||
|
|
||||||
|
It's important to notice that Scoring Engines might have different
|
||||||
|
requirements and the implementations might vary. Some of them might be
|
||||||
|
implemented as plain Python classes executing (possibly heavy) calculations.
|
||||||
|
In these cases it makes a sense to delegate the execution to Watcher Scoring
|
||||||
|
module, which will be a new Watcher service, similar to `Watcher Decision
|
||||||
|
Engine`_ or `Watcher Applier`_:
|
||||||
|
|
||||||
|
.. image:: ../../../doc/source/images/scoring-engine-inside-scoring-module.png
|
||||||
|
|
||||||
|
Some other Scoring Engines might be implemented using external frameworks or
|
||||||
|
even live entirely in the cloud, exposing only some API to work with them.
|
||||||
|
In this scenario, the abstraction layer will simply delegate work to these
|
||||||
|
external systems (e.g. using some HTTP client libraries), as illustrated on
|
||||||
|
the diagram below:
|
||||||
|
|
||||||
|
.. image:: ../../../doc/source/images/scoring-engine-in-the-cloud.png
|
||||||
|
|
||||||
|
Implementation details
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This above an impact on the design of the Scoring Module and its
|
||||||
|
implementation. The goal of the abstraction layer proposed above is to allow
|
||||||
|
for both:
|
||||||
|
|
||||||
|
* Simple usage of any Scoring Engine by any `Strategy`_.
|
||||||
|
* Implementation freedom: if a Scoring Engine performs some heavy
|
||||||
|
calculations, its implementation could be moved to external process, which
|
||||||
|
will not affect the `Watcher Decision Engine`_ module.
|
||||||
|
|
||||||
|
That said, the following changes are going to be implemented:
|
||||||
|
|
||||||
|
* In the watcher/common package:
|
||||||
|
|
||||||
|
* ScoringEngine class defining an abstract base class for all Scoring
|
||||||
|
Engine implementations. The abstract class will include the following
|
||||||
|
abstract methods:
|
||||||
|
|
||||||
|
:get_engine_id:
|
||||||
|
Method will return a unique string identifier of the Scoring Engine.
|
||||||
|
This ID will be used by factory classes and `Strategies`_ wanting to
|
||||||
|
use a specific Scoring Engine
|
||||||
|
|
||||||
|
:Input:
|
||||||
|
none
|
||||||
|
|
||||||
|
:Result:
|
||||||
|
unique string ID (must be unique across all Scoring Engines)
|
||||||
|
|
||||||
|
:get_model_metadata:
|
||||||
|
Method will return a map with metadata information about the data
|
||||||
|
model. This might include informations about used algorithm, labels
|
||||||
|
for data returned by the score method (useful for interpreting the
|
||||||
|
results)
|
||||||
|
|
||||||
|
:Input:
|
||||||
|
none
|
||||||
|
|
||||||
|
:Result:
|
||||||
|
dictionary with metadata, both keys and values as strings
|
||||||
|
|
||||||
|
For example, the metadata can contain the following information (real
|
||||||
|
world example):
|
||||||
|
|
||||||
|
* scoring engine is a classifier, which is based on the learning data
|
||||||
|
with these column labels (last column is the result used for
|
||||||
|
learning): [MEM_USAGE, PROC_USAGE, PCI_USAGE, POWER_CONSUMPTION,
|
||||||
|
CLASSIFICATION_ID]
|
||||||
|
* during the learning process, the machine learning decides that it
|
||||||
|
actually only needs these columns to calculate the expected
|
||||||
|
CLASSIFICATION_ID: [MEM_USAGE, PROC_USAGE]
|
||||||
|
* because the scoring result is a list of doubles, we need to know
|
||||||
|
what it means, e.g. 0.0 == CLASSIFICATION_ID_2, 1.0 ==
|
||||||
|
CLASSIFICATION_ID_1, etc.
|
||||||
|
* there is no guarantee of the order of the columns or even the
|
||||||
|
existence of them in input/output list
|
||||||
|
* this information must be passed as metadata, so the user of the
|
||||||
|
scoring engine is able to "understand" the results
|
||||||
|
* in addition, the metadata might provide some insights like what was
|
||||||
|
the algorithm used for learning or how many training records were
|
||||||
|
used
|
||||||
|
|
||||||
|
:calculate_score:
|
||||||
|
Method responsible for performing the actual scoring, such as
|
||||||
|
classifying or predicting data
|
||||||
|
|
||||||
|
:Input:
|
||||||
|
list of float numbers (e.g. feature values)
|
||||||
|
|
||||||
|
:Result:
|
||||||
|
list of float numbers (e.g. classified values, predicted results)
|
||||||
|
|
||||||
|
* In the `Watcher Decision Engine`_:
|
||||||
|
|
||||||
|
* New scoring package containing:
|
||||||
|
|
||||||
|
* ScoringFactory class defining a factory for Scoring Engine
|
||||||
|
implementations.
|
||||||
|
* engines subpackage containing implementations of the Scoring Engines.
|
||||||
|
The Scoring Engines must all extend the ScoringEngine base class.
|
||||||
|
* Two sample Scoring Engine implementations:
|
||||||
|
|
||||||
|
* simple Scoring Engine working within `Decision Engine` module.
|
||||||
|
* simple Scoring Engine using the Scoring Module, which will demonstrate
|
||||||
|
how to defer the heavy calculations to the external Python process.
|
||||||
|
|
||||||
|
* In `Strategies`_: two sample `Strategies`_ using the above Scoring
|
||||||
|
Engines.
|
||||||
|
|
||||||
|
* In the `Watcher API`_:
|
||||||
|
|
||||||
|
* New REST resource URLs to expose list of Scoring Engines and their
|
||||||
|
metadata (read-only)
|
||||||
|
|
||||||
|
* GET /v1/scoring_engines/
|
||||||
|
* GET /v1/scoring_engines/(scoring_engine_uuid)
|
||||||
|
|
||||||
|
* In the Watcher CLI:
|
||||||
|
|
||||||
|
* Expose new API in the command line
|
||||||
|
|
||||||
|
* New Watcher Scoring Module:
|
||||||
|
|
||||||
|
* New top level scoring_engine directory inside watcher directory with
|
||||||
|
Watcher source code.
|
||||||
|
* A new service: watcher-scoring.
|
||||||
|
* A sample Scoring Engine (not using any external dependencies).
|
||||||
|
|
||||||
|
Deployment
|
||||||
|
----------
|
||||||
|
|
||||||
|
The deployment model for Scoring Engine implementations will use the Stevedore
|
||||||
|
pluggability model. There will be entry points defined for the abstraction
|
||||||
|
layer and for the Watcher Scoring module as well. The abstraction layer part
|
||||||
|
will be required to implement, whether the Watcher Scoring module part will be
|
||||||
|
optional (it's not needed for example when using external analytics platforms
|
||||||
|
running in the cloud).
|
||||||
|
|
||||||
|
.. image:: ../../../doc/source/images/scoring-module-deployment.png
|
||||||
|
|
||||||
|
In addition, it will be possible to register multiple Scoring Engines from a
|
||||||
|
single plug-in. The Scoring Engine list will also be dynamic, meaning that it
|
||||||
|
will be possible to register and unregister a Scoring Engine without any need
|
||||||
|
to restart Watcher services.
|
||||||
|
|
||||||
|
Scoring Engine versioning
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The rules similar to API versioning should apply to Scoring Engine versioning.
|
||||||
|
Scoring Engines will be identified using their unique ID. A new version of the
|
||||||
|
Scoring Engine should have a different ID, so it doesn't break the existing
|
||||||
|
usage. Of course it's possible that the Scoring Engine developer will decide
|
||||||
|
to update the existing Scoring Engine (so ID of the updated version will stay
|
||||||
|
the same), but then she/he should take the full responsibility for that and
|
||||||
|
understand the fact, that it might change the other use cases. The
|
||||||
|
recommendation is to update Scoring Engines only for small bug fixing and give
|
||||||
|
a new ID to the Scoring Engines using different ML algorithm or trained using
|
||||||
|
different learning data.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
Each developer could implement a new `Strategy`_ using a custom integration
|
||||||
|
with machine learning frameworks. Data Models and Scoring Engines are
|
||||||
|
relatively difficult and time consuming to create, so it would be a big loss
|
||||||
|
if they are not available for wider usage.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
There will be a new Watcher Scoring Module service, which means an additional
|
||||||
|
network port open, which is always increasing the security impact.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
When delivering a new Scoring Engine, the operator will deploy the following
|
||||||
|
softwares:
|
||||||
|
|
||||||
|
Required:
|
||||||
|
|
||||||
|
* the main Python class implementing the Scoring Engine
|
||||||
|
* all additional resources or classes required by the new Scoring Engine
|
||||||
|
implementation (for example client code to communicate with external service
|
||||||
|
if a Scoring Engine is implemented and hosted in the cloud)
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
* `Strategy`_ implementation, which is using the new Scoring Engine (details
|
||||||
|
are out of scope of this document)
|
||||||
|
* `Action`_ handlers if they are required by the `Strategy`_ (details are out
|
||||||
|
of scope of this document)
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
tkaczynski
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
The list of foreseen work items:
|
||||||
|
|
||||||
|
* Review this BluePrint, improve it based on feedback received
|
||||||
|
* Implement generic Watcher Scoring Module
|
||||||
|
* Implement Scoring Engine loader
|
||||||
|
* Implement a sample Scoring Engine to demonstrate Scoring Module design
|
||||||
|
and provide a guidance how to use it (no external dependencies)
|
||||||
|
* Implement a sample `Strategy`_ using sample Scoring Engine from previous
|
||||||
|
point
|
||||||
|
* Provide documentation of the new Scoring Module
|
||||||
|
|
||||||
|
* Update glossary with terms related to Watcher Scoring
|
||||||
|
* Provide a guidance / tutorial how to implement a Scoring Engine plugin
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
There are no direct dependencies.
|
||||||
|
|
||||||
|
However, in the long run Watcher should provide a flexible plugin model, which
|
||||||
|
would allow to easily integrate Scoring Engines, `Strategies`_ and `Actions`_
|
||||||
|
with Watcher without needing to reinstall or upgrade it. The ideal scenario
|
||||||
|
would be that the third party developers would provide implementations in a
|
||||||
|
separate repository, which could then be included in one of the Watcher
|
||||||
|
configuration files. Solving this problem is not in scope of this document.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Unit tests will be needed for the code in the new Scoring Module. Implementing
|
||||||
|
this module will be transparent for the existing Watcher code base, so no
|
||||||
|
existing tests or functionality will be affected.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
The documentation will have to be updated, especially the glossary, in order to
|
||||||
|
explain the new concepts regarding Scoring Module definition and Scoring Engine
|
||||||
|
implementations.
|
||||||
|
|
||||||
|
The API documentation and Watcher User-Guide will have to be updated to
|
||||||
|
demonstrate how to get information about available Scoring Engines and their
|
||||||
|
metadata.
|
||||||
|
|
||||||
|
The architecture description will also need to be updated because there will
|
||||||
|
be a new Watcher component available.
|
||||||
|
|
||||||
|
The documentation regarding Watcher installation and configuration will also
|
||||||
|
need to be updated in order to explain:
|
||||||
|
|
||||||
|
* howto deploy new Scoring Engines into Watcher
|
||||||
|
* howto integrate `Strategies`_ with existing Scoring Engines
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
.. _Action: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#action
|
||||||
|
.. _Actions: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#action
|
||||||
|
.. _Action Plan: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#action-plan
|
||||||
|
.. _Audit: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#audit
|
||||||
|
.. _Decision Engine: https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-decision-engine
|
||||||
|
.. _Goal: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#goal
|
||||||
|
.. _Goals: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#goal
|
||||||
|
.. _SLA: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#sla
|
||||||
|
.. _Solution: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#solution
|
||||||
|
.. _Strategy: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#strategy
|
||||||
|
.. _Strategies: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#strategy
|
||||||
|
.. _Watcher API: https://factory.b-com.com/www/watcher/doc/watcher/webapi/v1.html
|
||||||
|
.. _Watcher Applier: https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-applier
|
||||||
|
.. _Watcher Decision Engine: https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-decision-engine
|
||||||
|
.. _Watcher Planner: https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#watcher-planner
|
Loading…
Reference in New Issue
Block a user