Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MCorr example notebook #186

Merged
merged 17 commits into from
Jul 21, 2023
Merged

Conversation

AlibiZhenis
Copy link
Contributor

@AlibiZhenis AlibiZhenis commented Jun 30, 2023

Description

This PR adds an example notebook that demonstrates the usage of MCorr algorithm, as well as corresponding documentation update.

Issues Resolved

Closes #157

Check List

  • Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

AlibiZhenis and others added 12 commits May 17, 2023 14:44
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
@codecov
Copy link

codecov bot commented Jun 30, 2023

Codecov Report

Merging #186 (462ab1b) into main (57f0cf8) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##             main     #186   +/-   ##
=======================================
  Coverage   91.15%   91.15%           
=======================================
  Files          37       37           
  Lines        4091     4091           
=======================================
  Hits         3729     3729           
  Misses        362      362           

demo_ml_commons_integration

Demo notebooks for ML Commons no-model-based algorithms
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Demo Notebooks for In-house python based models"

@dhrubo-os
Copy link
Collaborator

We added a new workflow changelog verifier. Please add a line here in 1.1.0 section

},
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you share any notebook url from your repo which has the same output? It's not quite possible to review from here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you see it from here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you see it?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I can see it. Sorry I forgot to reply. @greaa-aws will also review your PR and comment here as well.

AlibiZhenis and others added 2 commits July 2, 2023 11:53
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
@dhrubo-os
Copy link
Collaborator

Looks like we didn't use SMD_small_labels.csv.zip file that much? If this is not required, may be we can remove it?

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
@AlibiZhenis
Copy link
Contributor Author

I removed the labels. Anything else needs that needs to be changed?

@dhrubo-os
Copy link
Collaborator

@greaa-aws is going to send you a dataset which works better shortly.

@greaa-aws
Copy link
Collaborator

I'm going to share my comments section-by-section. I think this is an awesome first effort and I really appreciate the work involved in creating an example notebook for a new algorithm!

I'd like to offer some feedback and ideas for how to expand it from here so that we can end up with something that is easy-to-follow and informative for users. To do this, we need to communicate what the algorithm is doing and why, not just how to use the execute API.

I have written some material elsewhere for this, so I’ll share it here along with some suggestions for where to use it. Please feel free to ask questions!

@greaa-aws
Copy link
Collaborator

Introduction

Let's add a little text here to orient our users. I'd suggest:

This notebook contains an introduction to the metrics correlation algorithm released in OpenSearch 2.8. We will work through an example using data from the Server Machine Dataset and include commentary on the objective, configuration, and output of the algorithm itself.

@greaa-aws
Copy link
Collaborator

Step 0: Imports

Looks good to me, just need to correct a typo in the second line: “uncommenting the line and execute” -> “uncommenting and executing the line in the second code block”.

Step 1: Set up client

Looks good to me.

@greaa-aws
Copy link
Collaborator

greaa-aws commented Jul 10, 2023

Step 2: Preparing the data

I like the use of the Server Machine Dataset data, but let’s use a different example subset. This one should provide a nice illustration of the algorithm:
smd_data.csv
It has $M = 38$ metrics and $T = 1000$ timestamps. The algorithm should find two separate events in the data. The data are already in (row, column) format so it's not necessary to transpose. Rather than printing the dataframe, lets visualize in a plot.

For the writing, this is where we need a proper introduction to the method. Please see below for an intro I have previously written.

In this case study, we consider an example from the recently-released Server Machine Dataset. As the name suggests, the data are performance metrics collected from industrial servers. The servers occasionally suffer performance degradations that appear in the metrics data. Here, we take the role of an ops engineer investigating recent metrics data to understand whether and how these issues have occurred.

The individual metrics can display very different behavior, yet correlating issues across metrics is essential for detecting and diagnosing issues with the server. To start, let’s plot the data that we’ll be working with in this case study. It consists of 38 metrics observed across 1000 timestamps. We have normalized each metrics time series such that its values lie between 0 and 1.

This can be followed by a code block that plots the data:


M, T = smd_data.shape
cm = plt.get_cmap('tab20')
vals = np.linspace(0, 1, M)

for i in range(M):
    plt.plot(smd_data[i,:], color = cm(vals[i]))

plt.title('Example metrics from the Server Machine Dataset')
plt.ylabel('Normalized metrics value')
plt.xlabel('Timestamp')

@greaa-aws
Copy link
Collaborator

greaa-aws commented Jul 10, 2023

Step 3: Metrics correlation

Again, let’s add some more detailed writing to share the idea of the algorithm. Here’s what I have:

The metrics correlation algorithm finds events in a set of metrics data, where an event is defined as a window in time where multiple metrics simultaneously display anomalous behavior. Given a time span and a total set of metrics, the metrics correlation algorithm automatically determines how many events occurred, when they occurred, and which metrics were involved in each event. This algorithm requires no prior training and minimal configuration.

Let’s see how it works for the Server Machine Dataset example.

Then we can convert to JSON, as you already have in the notebook. Note: please do NOT print the JSON. It leads to hundreds (for the new data, it would be thousands) of lines of output that are not informative and make the notebook hard to navigate.

First, we’ll reformat the data to JSON:

input_json = {"metrics": smd_data.values.tolist()}

Then we can show how the algorithm is run. Again, we don’t need to print the raw results. It’s not an informative way to share or discuss the output.

Now we can run the metrics correlation algorithm on this data via the execute API:

results = ml_client.execute(
    algorithm_name = "METRICS_CORRELATION",
    input_json = input_json
)

Instead, I’d suggest the following text and code blocks to describe the output.

The results are given as a list, where each element of the list is an event that the algorithm has discovered in the data. If the length of the list is zero, then the algorithm has discovered no events in the given input data.

In this case, the algorithm discovers two events:

len(results[‘output’][‘inference_results’])

Every event is represented as a dictionary with three fields:

  • The event window, a list consisting of the start and end index values for the event. This describes when the event occurred.
  • The suspected metrics, a list with the indices of all metrics that are part of the event. This describes which metrics were correlated during the time of the event.
  • The event pattern, an array of length T where each value indicates the relative intensity of the event at the corresponding timestamp. This is the algorithm's underlying "idea" of the event; roughly, it indicates where in time the algorithm has focused to define the event.
results[‘output’][‘inference_results’][0].keys()

@greaa-aws
Copy link
Collaborator

Step 4: Result visualization

This is a great idea. Below, I suggest some writing for this section and some expanded code for event plotting.

Below, we implement a plotting function that uses each of these fields to visually display an event. This function plots all of the input data as above, but highlights the metrics that were involved in the event and shades the interval when the event occurred. It also plots the event pattern.

from matplotlib.lines import Line2D

def plot_event(event, metrics):
    M, _ = metrics.shape
    _, axs = plt.subplots(2, 1, figsize = (12,6))

    # plot non-event metrics in grayscale
    for i in range(M):
        if i not in event['suspected_metrics']:
            axs[0].plot(metrics[i,:], color = 'lightgray')

    # highlight event metrics
    for i in range(M):
        if i in event['suspected_metrics']:
            axs[0].plot(metrics[i,:], color = 'maroon')

    # shade event window    
    axs[0].fill_between(event['event_window'], 0, 1, color='skyblue', alpha=0.6, label = 'Event window')
    axs[0].set_ylabel('Normalized metrics value')

    # add legend
    sus_met = Line2D([0],[0], label='Suspected metrics', color='maroon')
    unsus_met = Line2D([0],[0], label='Other metrics', color='lightgray')
    handles, _ = axs[0].get_legend_handles_labels()
    handles.extend([sus_met, unsus_met])
    axs[0].legend(loc='upper left', handles=handles, facecolor='white', framealpha=1)

    # plot (scaled) event pattern
    axs[1].plot(event['event_pattern'] / event['event_pattern'].max(), color = 'darkorange', alpha=0.6, linewidth=3.0, label='Intensity')
    axs[1].set_ylabel('Event pattern')
    axs[1].set_xlabel('Timestamp')

    plt.show()

Now we can easily visualize both events discovered in the data:

plot_event(smd_res[0], smd_data)
plot_event(smd_res[1], smd_data)

Lastly, we should conclude with some discussion of the results.

From the above, we see that the metrics correlation algorithm has found two events.

The first event occurs between timestamps $345$ and $450$ and it features the large rise that was clearly visible from the first plot of the data. However, the algorithm has found and associated with this rise several other metrics that display more subtle changes during this window.

The second event occurs between timestamps $690$ and $777$, capturing the sharp drop that was again clearly visible in the initial plot. Here, the drop has been automatically correlated with a second, smaller drop, along with several metrics whose behavior changes from flat to a slow rise during this interval.

@AlibiZhenis
Copy link
Contributor Author

Thanks for the suggestions, @greaa-aws. I added all of them to the notebook. However, the MCorr algorithm is timing out on my side. I suspect it's because the size of the dataset exceeds the limit (ref). The total number of data points M * T <= 10000.

Is it successfully running on your side?

@greaa-aws
Copy link
Collaborator

Hi @AlibiZhenis, good catch! It looks like I had tested this dataset out on a local build without this limit on data size. I've attached a reduced version of the dataset that satisfies $M*T &lt; 10000$. It has the same number of timestamps and the same key metrics / events as above, so the results and suggested commentary text should be the same. Let me know if you have any difficulties.

smd_data.csv

AlibiZhenis and others added 2 commits July 21, 2023 12:48
Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <92104549+AlibiZhenis@users.noreply.github.com>
@AlibiZhenis
Copy link
Contributor Author

@dhrubo-os @greaa-aws Can you review again

@dhrubo-os
Copy link
Collaborator

@dhrubo-os @greaa-aws Can you review again

I tested in my end and looks good to me. Just address the comment. Thanks.

"source": [
"In this case study, we consider an example from the recently-released [Server Machine Dataset](https://github.com/NetManAIOps/OmniAnomaly). As the name suggests, the data are performance metrics collected from industrial servers. The servers occasionally suffer performance degradations that appear in the metrics data. Here, we take the role of an ops engineer investigating recent metrics data to understand whether and how these issues have occurred.\n",
"\n",
"The individual metrics can display very different behavior, yet correlating issues across metrics is essential for detecting and diagnosing issues with the server. To start, let’s plot the data that we’ll be working with in this case study. It consists of 38 metrics observed across 1000 timestamps. We have normalized each metrics time series such that its values lie between 0 and 1."
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's 9 metrics now, after we reduced the dataset size.

"source": [
"Every event is represented as a dictionary with three fields:\n",
"\n",
"The event window, a list consisting of the start and end index values for the event. This describes when the event occurred.\n",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we list these as 3 bullet points or add another newline between field descriptions?

{
"data": {
"text/plain": "<Figure size 1200x600 with 2 Axes>",
"image/png": "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
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these intervals consistent with the new results from the reduced data? They should match the start and end times in the event window field for each event.

"\n",
"## Introduction\n",
"\n",
"This notebook contains an introduction to the [metrics correlation](https://opensearch.org/docs/latest/ml-commons-plugin/algorithms/#metrics-correlation) algorithm released in OpenSearch 2.8. We will work through an example using data from the [Server Machine Dataset](https://github.com/NetManAIOps/OmniAnomaly) and include commentary on the objective, configuration, and output of the algorithm itself."
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opensearch 2.7.

@dhrubo-os
Copy link
Collaborator

Thanks @AlibiZhenis for your contribution. Merging your PR.

@dhrubo-os dhrubo-os merged commit 0a0fa63 into opensearch-project:main Jul 21, 2023
13 checks passed
@opensearch-trigger-bot
Copy link

The backport to 1.x failed:

The process '/usr/bin/git' failed with exit code 1

To backport manually, run these commands in your terminal:

# Fetch latest updates from GitHub
git fetch
# Create a new working tree
git worktree add .worktrees/backport-1.x 1.x
# Navigate to the new working tree
cd .worktrees/backport-1.x
# Create a new branch
git switch --create backport/backport-186-to-1.x
# Cherry-pick the merged commit of this pull request and resolve the conflicts
git cherry-pick -x --mainline 1 0a0fa63bb896b8ae506caea78b490af24be8566c
# Push it to GitHub
git push --set-upstream origin backport/backport-186-to-1.x
# Go back to the original working tree
cd ../..
# Delete the working tree
git worktree remove .worktrees/backport-1.x

Then, create a pull request where the base branch is 1.x and the compare/head branch is backport/backport-186-to-1.x.

thanawan-atc referenced this pull request in thanawan-atc/opensearch-py-ml Aug 9, 2023
* added data

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* fixing dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* draft notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updating documentation

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* update

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* result visualization

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* minor fix

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* deleted unused labels

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

---------

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <92104549+AlibiZhenis@users.noreply.github.com>
(cherry picked from commit 0a0fa63)
thanawan-atc referenced this pull request in thanawan-atc/opensearch-py-ml Aug 10, 2023
* added data

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* fixing dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* draft notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updating documentation

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* update

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* result visualization

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* minor fix

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* deleted unused labels

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

---------

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <92104549+AlibiZhenis@users.noreply.github.com>
(cherry picked from commit 0a0fa63)
dhrubo-os pushed a commit that referenced this pull request Aug 10, 2023
* added data

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* fixing dev guide

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* draft notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updating documentation

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* update

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* result visualization

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* minor fix

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* deleted unused labels

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

* updated notebook

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>

---------

Signed-off-by: Alibi Zhenis <alibizhenis4@gmail.com>
Signed-off-by: Alibi Zhenis <92104549+AlibiZhenis@users.noreply.github.com>
(cherry picked from commit 0a0fa63)

Co-authored-by: Alibi Zhenis <92104549+AlibiZhenis@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Jupyter notebook based documentation for Metrics Correlation algorithm.
3 participants