From 5e99ec752a0803f5cdeca7998c89217d090c4d70 Mon Sep 17 00:00:00 2001
From: Ricky Costa <79061523+InquestGeronimo@users.noreply.github.com>
Date: Mon, 11 Apr 2022 16:42:50 -0400
Subject: [PATCH 01/14] SparseServer.UI example [WIP] (#308)
* add megasparse dir
* edited readme to support DS integration
* small edit to docstring
* edited settings.py module so only 2 models are loaded.
* added more context to the readme about adding more models.
* fixed image
* added different host to streamlit client as default
* quality check edits
* quality check commit
* passing copyright quality check
* content edits
* rename dir to sparseserver-ui
* added new config file for quick start
* edited multipipelineclient in settings.py
* changed name of config file
* edited model stubs
* edited readme
* added dependency pins
* changed server pin
* edited model choice logic
* altered front-end features
* style update
* renamed samples file
* added variant descriptions
* style changes
* edited samples.py module
* style changes
* added new pic
* edited README
* updated readme cmds
---
examples/sparseserver-ui/README.md | 88 ++++++++++++
examples/sparseserver-ui/client/app.py | 54 ++++++++
.../sparseserver-ui/client/pipelineclient.py | 47 +++++++
examples/sparseserver-ui/client/samples.py | 55 ++++++++
examples/sparseserver-ui/client/settings.py | 131 ++++++++++++++++++
.../sparseserver-ui/img/demo_screenshot.png | Bin 0 -> 491015 bytes
examples/sparseserver-ui/requirements.txt | 2 +
.../sparseserver-ui/server/big-config.yaml | 95 +++++++++++++
examples/sparseserver-ui/server/config.yaml | 32 +++++
9 files changed, 504 insertions(+)
create mode 100644 examples/sparseserver-ui/README.md
create mode 100644 examples/sparseserver-ui/client/app.py
create mode 100644 examples/sparseserver-ui/client/pipelineclient.py
create mode 100644 examples/sparseserver-ui/client/samples.py
create mode 100644 examples/sparseserver-ui/client/settings.py
create mode 100644 examples/sparseserver-ui/img/demo_screenshot.png
create mode 100644 examples/sparseserver-ui/requirements.txt
create mode 100644 examples/sparseserver-ui/server/big-config.yaml
create mode 100644 examples/sparseserver-ui/server/config.yaml
diff --git a/examples/sparseserver-ui/README.md b/examples/sparseserver-ui/README.md
new file mode 100644
index 0000000000..65a5bc659f
--- /dev/null
+++ b/examples/sparseserver-ui/README.md
@@ -0,0 +1,88 @@
+
+ [**NEURAL MAGIC**](https://neuralmagic.com) 
+
+ ███████╗██████╗ █████╗ ██████╗ ███████╗███████╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗ ██╗
+ ██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗ ██║ ██║ ██║
+ ███████╗██████╔╝███████║██████╔╝███████╗█████╗ ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝ ██║ ██║ ██║
+ ╚════██║██╔═══╝ ██╔══██║██╔══██╗╚════██║██╔══╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗ ██║ ██║ ██║
+ ███████║██║ ██║ ██║██║ ██║███████║███████╗ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║ ██╗ ╚██████╔ ██║
+ ╚══════╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝
+
+
+ *** A Streamlit app for deploying the DeepSparse Server ***
+
+
+
+##
`INTRO`
+
+
+
+
+SparseServer.UI allows you to serve a streamlit app running on top of the DeepSparse Server for comparing the latency speeds of sparse transformer models. The purpose of this app is for you to familiarize and compare the inference performance of transformers trained with various sparse approaches.
+
+
+
+
+[Getting Started with the DeepSparse Server](https://github.com/neuralmagic/deepsparse/tree/main/src/deepsparse/server)
+
+
+
+
+
+
+
+## `INSTALLATION`
+
+```bash
+git clone https://github.com/neuralmagic/deepsparse.git
+cd deepsparse/examples/sparseserver-ui
+pip install -r requirements.txt
+```
+
+
+The `config.yaml` file in the `server` directory includes a list of four BERT QA models for the DeepSparse Server to get started. If you prefer to add additional models to the `config.yaml` file, make sure to also add a `MultiPipelineClient` object to the `variants` attribute in the `settings.py` module.
+
+Currently, the SparseZoo contains 20 BERT models, and the `big-config.yaml` file contains the full list in case you want to load them all 🤯. To load all of the 20 models at once, make sure you have at least 16GB of RAM available, otherwise you will get out of memory errors. In addition, uncomment the pipelines in the `settings.py` module.
+
+For more details on question answering models, please refer to our [updated list](https://sparsezoo.neuralmagic.com/?domain=nlp&sub_domain=question_answering&page=1).
+
+## `START SERVER`
+
+To download and initialize the four models in the `config.yaml` file, run:
+```bash
+deepsparse.server --config_file server/config.yaml
+```
+
+After downloading, the DeepSparse Server should now be running on host `0.0.0.0` and port `5543`.
+
+## `START CLIENT`
+
+Open a new terminal (make sure you are in your environment) and run the following command to start the Streamlit app:
+
+```bash
+streamlit run client/app.py --browser.serverAddress="localhost"
+```
+
+This will start the Streamlit app on `localhost` and port `8501`.
+Visit `http://localhost:8501` in your browser to view the demo.
+
+### Testing
+
+- 20 models should fit on 16GB RAM of a c2-standard-4 VM instance on GCP
+- Ubuntu 20.04.4 LTS
+- Python 3.8.10
+
diff --git a/examples/sparseserver-ui/client/app.py b/examples/sparseserver-ui/client/app.py
new file mode 100644
index 0000000000..8e8a7b323d
--- /dev/null
+++ b/examples/sparseserver-ui/client/app.py
@@ -0,0 +1,54 @@
+# Copyright (c) 2021 - present / Neuralmagic, Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from time import perf_counter
+
+import streamlit as st
+from samples import sample
+from settings import FeatureHandler as feat
+
+
+# Titles
+st.markdown(feat.title, unsafe_allow_html=True)
+st.markdown(feat.subtitle, unsafe_allow_html=True)
+
+# Sidebar
+st.sidebar.selectbox(feat.tasks_desc, feat.tasks)
+model_choice = st.sidebar.radio(feat.variants_desc, feat.variants.keys())
+st.sidebar.markdown(feat.code_banner)
+st.sidebar.code(body=feat.code_text, language=feat.language)
+st.sidebar.markdown(feat.repo_test)
+
+# Footer
+st.markdown(feat.footer, unsafe_allow_html=True)
+
+# Inference
+model = feat.variants[model_choice]
+selection = st.selectbox(feat.example_index_label, feat.example_index)
+context = st.text_area(
+ label=feat.example_context_label, value=sample[selection]["context"], height=300
+)
+question = st.text_area(
+ label=feat.example_question_label, value=sample[selection]["question"]
+)
+start = perf_counter()
+answer = model(question=question, context=context)
+end = perf_counter()
+infer_time = end - start
+infer_time = round(infer_time, 4)
+st.markdown(feat.markdown_style, unsafe_allow_html=True)
+st.markdown(
+ f'ANSWER: {answer["answer"]}
', unsafe_allow_html=True
+)
+st.markdown(f'{infer_time} secs.
', unsafe_allow_html=True)
diff --git a/examples/sparseserver-ui/client/pipelineclient.py b/examples/sparseserver-ui/client/pipelineclient.py
new file mode 100644
index 0000000000..dda88347ad
--- /dev/null
+++ b/examples/sparseserver-ui/client/pipelineclient.py
@@ -0,0 +1,47 @@
+# Copyright (c) 2021 - present / Neuralmagic, Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+from typing import List
+
+import numpy
+import requests
+
+
+class MultiPipelineClient:
+ """
+ Client object for making requests to the example DeepSparse BERT inference server
+
+ :param model: model alias of FastAPI route
+ :param address: IP address of the server, default is 0.0.0.0
+ :param port: Port the server is hosted on, default is 5543
+ """
+
+ def __init__(self, model: str, address: str = "0.0.0.0", port: str = "5543"):
+
+ self.model = model
+ self._url = f"http://{address}:{port}/predict/{self.model}"
+
+ def __call__(self, **kwargs) -> List[numpy.ndarray]:
+
+ """
+ :param kwargs: named inputs to the model server pipeline. e.g. for
+ question-answering - `question="...", context="..."
+
+ :return: json outputs from running the model server pipeline with the given
+ input(s)
+ """
+
+ response = requests.post(self._url, json=kwargs)
+ return json.loads(response.content)
diff --git a/examples/sparseserver-ui/client/samples.py b/examples/sparseserver-ui/client/samples.py
new file mode 100644
index 0000000000..a3e09bed5d
--- /dev/null
+++ b/examples/sparseserver-ui/client/samples.py
@@ -0,0 +1,55 @@
+# Copyright (c) 2021 - present / Neuralmagic, Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+sample = {
+ "example 1": {
+ "context": (
+ "The DeepSparse Engine is a CPU runtime that delivers "
+ "GPU-class performance by taking advantage of sparsity within neural "
+ "networks to reduce compute required as well as accelerate memory bound "
+ "workloads. It is focused on model deployment and scaling machine "
+ "learning pipelines, fitting seamlessly into your existing deployments "
+ "as an inference backend. "
+ ),
+ "question": (
+ "What does the DeepSparse Engine take advantage of within neural networks?"
+ ),
+ },
+ "example 2": {
+ "context": (
+ "Concerns were raised over whether Levi's Stadium's field was of a high "
+ "enough quality to host a Super Bowl; during the inaugural season, the "
+ "field had to be re-sodded multiple times due to various issues, and "
+ "during a week 6 game earlier in the 2015 season, a portion of the turf "
+ "collapsed under Baltimore Ravens kicker Justin Tucker, causing him "
+ "to slip and miss a field goal. "
+ ),
+ "question": ("What collapsed on Justin Tucker?"),
+ },
+ "example 3": {
+ "context": (
+ "The league announced on October 16, 2012, that the two finalists were Sun "
+ "Life Stadium and Levi's Stadium. The South Florida/Miami area has "
+ "previously hosted the event 10 times (tied for most with New Orleans), "
+ "with the most recent one being Super Bowl XLIV in 2010. The San Francisco "
+ "Bay Area last hosted in 1985 (Super Bowl XIX), held at Stanford Stadium "
+ "in Stanford, California, won by the home team 49ers. The Miami bid "
+ "depended on whether the stadium underwent renovations. "
+ ),
+ "question": (
+ "What was the most recent Super Bowl that took place at Sun "
+ "Life Stadium in Miami?"
+ ),
+ },
+}
diff --git a/examples/sparseserver-ui/client/settings.py b/examples/sparseserver-ui/client/settings.py
new file mode 100644
index 0000000000..3f5b03e33f
--- /dev/null
+++ b/examples/sparseserver-ui/client/settings.py
@@ -0,0 +1,131 @@
+# Copyright (c) 2021 - present / Neuralmagic, Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from pipelineclient import MultiPipelineClient
+
+
+class FeatureHandler:
+
+ """
+ Class with front-end streamlit content features.
+ """
+
+ tasks_desc = "Select task:"
+ tasks = [
+ "Question Answering",
+ ]
+
+ variants_desc = "Select your sparse model:"
+ variants = {
+ "12-Layer BERT Base, Not Sparsified 😢": MultiPipelineClient(
+ model="question_answering/base"
+ ),
+ "12-Layer BERT, Quantized, 99% of Base Accuracy": MultiPipelineClient(
+ model="question_answering/12l_pruned80_quant"
+ ),
+ "6-Layer BERT, Quantized, 96% of Base Accuracy": MultiPipelineClient(
+ model="question_answering/quant6lagg96"
+ ),
+ "3-Layer BERT, Quantized, 89% of Base Accuracy": MultiPipelineClient(
+ model="question_answering/quant3lagg89"
+ ),
+ # "12-Layer BERT, Quantized, 95% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/pruned_quant"
+ # ),
+ # "12-Layer BERT, Quantized, 99% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/quantmod"
+ # ),
+ # "12-Layer BERT, 98% of Base Accuracy ": MultiPipelineClient(
+ # model="question_answering/agg98"
+ # ),
+ # "12-Layer BERT, 94% of Base Accuracy ": MultiPipelineClient(
+ # model="question_answering/agg94"
+ # ),
+ # "12-Layer BERT, 100% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/conserv"
+ # ),
+ # "6-Layer BERT, Quantized, 91% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/quant6lagg91"
+ # ),
+ # "6-Layer BERT, 98% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/6lagg98"
+ # ),
+ # "6-Layer BERT, 97% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/6lagg97"
+ # ),
+ # "6-Layer BERT, 96% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/6lagg96"
+ # ),
+ # "6-Layer BERT, 94% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/6lagg94"
+ # ),
+ # "3-Layer BERT, Quantized, 84% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/quant3lagg84"
+ # ),
+ # "3-Layer BERT, 90% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/3lagg90"
+ # ),
+ # "3-Layer BERT, 89% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/3lagg89"
+ # ),
+ # "3-Layer BERT, 86% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/3lagg86"
+ # ),
+ # "3-Layer BERT, 83% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/3lagg83"
+ # ),
+ # "12-Layer BERT, 90% of Base Accuracy": MultiPipelineClient(
+ # model="question_answering/12layer_pruned90"
+ # ),
+ }
+
+ title = "✨ Neural Magic ✨
"
+ subtitle = "DeepSparse Server
"
+
+ code_banner = "Get started with faster inference 👇"
+ code_text = "pip install deepsparse[server]"
+ language = "python"
+ repo_test = (
+ "For code: [DeepSparse repo](https://github.com/neuralmagic/deepsparse)."
+ )
+
+ example_context_label = "Enter Context"
+ example_question_label = "Enter Question"
+ example_index_label = "Choose an example"
+ example_index = ["example 1", "example 2", "example 3"]
+ markdown_style = """
+
+ """
+ footer = """
+
+
+ """
diff --git a/examples/sparseserver-ui/img/demo_screenshot.png b/examples/sparseserver-ui/img/demo_screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ee72f6161d557e81e3aaeaad2c46da988b2e9f4
GIT binary patch
literal 491015
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