From 44c66c3848e5fdc6b64b3eaee52dd9f51369b6cf Mon Sep 17 00:00:00 2001 From: allegroai Date: Mon, 12 Apr 2021 03:17:25 +0300 Subject: [PATCH] Initial commit --- .gitignore | 37 ++ README.md | 144 ++++++++ clearml_serving/__init__.py | 0 clearml_serving/__main__.py | 164 +++++++++ clearml_serving/service.py | 17 + clearml_serving/serving_service.py | 568 +++++++++++++++++++++++++++++ clearml_serving/triton_helper.py | 214 +++++++++++ clearml_serving/version.py | 1 + docs/webapp_screenshots.gif | Bin 0 -> 131208 bytes examples/keras/keras_mnist.py | 169 +++++++++ examples/keras/requirements.txt | 2 + requirements.txt | 1 + setup.py | 75 ++++ 13 files changed, 1392 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 clearml_serving/__init__.py create mode 100644 clearml_serving/__main__.py create mode 100644 clearml_serving/service.py create mode 100644 clearml_serving/serving_service.py create mode 100644 clearml_serving/triton_helper.py create mode 100644 clearml_serving/version.py create mode 100644 docs/webapp_screenshots.gif create mode 100644 examples/keras/keras_mnist.py create mode 100644 examples/keras/requirements.txt create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e12a66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# python build +dist/ +build/ +*.egg-info/ + + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# JetBrains IDE +.idea/ + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + +# models +*.pbtxt +*.h5 diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c9e43f --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ + +
+ + + +**ClearML Serving - ML-Ops made easy** + +## **`clearml-serving`
Model-Serving Orchestration and Repository Solution** + + +[![GitHub license](https://img.shields.io/github/license/allegroai/clearml-serving.svg)](https://img.shields.io/github/license/allegroai/clearml-serving.svg) +[![PyPI pyversions](https://img.shields.io/pypi/pyversions/clearml-serving.svg)](https://img.shields.io/pypi/pyversions/clearml-serving.svg) +[![PyPI version shields.io](https://img.shields.io/pypi/v/clearml-serving.svg)](https://img.shields.io/pypi/v/clearml-serving.svg) +[![PyPI status](https://img.shields.io/pypi/status/clearml-serving.svg)](https://pypi.python.org/pypi/clearml-serving/) +[![Slack Channel](https://img.shields.io/badge/slack-%23clearml--community-blueviolet?logo=slack)](https://join.slack.com/t/allegroai-trains/shared_invite/zt-c0t13pty-aVUZZW1TSSSg2vyIGVPBhg) + + +
+ +![alt screenshots](docs/webapp_screenshots.gif "screenshots") + + +**`clearml-serving`** is a command line utility for the flexible orchestration of your model deployment. +**`clearml-serving`** can make use of a variety of serving engines (**Nvidia Triton, OpenVino Model Serving, KFServing**) +setting them up for serving wherever you designate a ClearML Agent or on your ClearML Kubernetes cluster + +Features: +* Spin serving engines on your Kubernetes cluster or ClearML Agent machine from CLI +* Full usage & performance metrics integrated with ClearML UI +* Multi-model support in a single serving engine container +* Automatically deploy new model versions +* Support Canary model releases +* Integrates to ClearML Model Repository +* Deploy & upgrade endpoints directly from ClearML UI +* Programmatic interface for endpoint/versions/metric control + + +## Installing ClearML Serving + +1. Setup your [**ClearML Server**](https://github.com/allegroai/clearml-server) or use the [Free tier Hosting](https://app.community.clear.ml) +2. Connect your ClearML Worker(s) to your **ClearML Server** (see [**ClearML Agent**](https://github.com/allegroai/clearml-agent) / [Kubernetes integration](https://github.com/allegroai/clearml-agent#kubernetes-integration-optional)) +3. Install `clearml-serving` (Note: `clearml-serving` is merely a control utility, it does not require any resources for actual serving) +```bash +pip install clearml-serving +``` + +## Using ClearML Serving + +Clearml-Serving will automatically serve *published* models from your ClearML model repository, so the first step is getting a model into your ClearML model repository. +Background: When using `clearml` in your training code, any model stored by your python code is automatically registered (and, optionally, uploaded) to the model repository. This auto-magic logging is key for continuous model deployment. +To learn more on training models and the ClearML model repository, see the [ClearML documentation](https://allegro.ai/clearml/docs) + +### Training a toy model with Keras (about 2 minutes on a laptop) + +The main goal of `clearml-serving` is to seamlessly integrate with the development process and the model repository. +This is achieved by combining ClearML's auto-magic logging which creates and uploads models directly from +the python training code, with accessing these models as they are automatically added into the model repository using the ClearML Server's REST API and its pythonic interface. +Let's demonstrate this seamless integration by training a toy Keras model to classify images based on the MNIST dataset. +Once we have a trained model in the model repository we will serve it using `clearml-serving`. + +We'll also see how we can retrain another version of the model, and have the model serving engine automatically upgrade to the new model version. + +#### Keras mnist toy train example (single epoch mock training): + +1. install `tensorflow` (and of course `cleamrl`) + ```bash + pip install "tensorflow>2" clearml + ``` + +2. Execute the training code + ```bash + cd examples/keras + python keras_mnist.py + ``` + **Notice:** The only required integration code with `clearml` are the following two lines: + ```python + from clearml import Task + task = Task.init(project_name="examples", task_name="Keras MNIST serve example", output_uri=True) + ``` + This call will make sure all outputs are automatically logged to the ClearML Server, this includes: console, Tensorboard, cmdline arguments, git repo etc. + It also means any model stored by the code will be automatically uploaded and logged in the ClearML model repository. + + +3. Review the models in the ClearML web UI: + Go to the "Projects" section of your ClearML server ([free hosted](https://app.community.clear.ml) or [self-deployed](https://github.com/allegroai/clearml-server)). + in the "examples" project, go to the Models tab (model repository). + We should have a model named "Keras MNIST serve example - serving_model". + Once a model-serving service is available, Right-clicking on the model and selecting "Publish" will trigger upgrading the model on the serving engine container. + +Next we will spin the Serving Service and the serving-engine + +### Serving your models + +In order to serve your models, `clearml-serving` will spawn a serving service which stores multiple endpoints and their configuration, +collects metric reports, and updates models when new versions are published in the model repository. +In addition, a serving engine is launched, which is the container actually running the inference engine. +(Currently supported engines are Nvidia-Triton, coming soon are Intel OpenVIno serving-engine and KFServing) + +Now that we have a published model in the ClearML model repository, we can spin a serving service and a serving engine. + +Starting a Serving Service: + +1. Create a new serving instance. + This is the control plane Task, we will see all its configuration logs and metrics in the "serving" project. We can have multiple serving services running in the same system. + In this example we will make use of Nvidia-Triton engines. +```bash +clearml-serving triton --project "serving" --name "serving example" +``` +2. Add models to the serving engine with specific endpoints. +Reminder: to view your model repository, login to your ClearML account, + go to "examples" project and review the "Models" Tab +```bash +clearml-serving triton --endpoint "keras_mnist" --model-project "examples" --model-name "Keras MNIST serve example - serving_model" +``` + +3. Launch the serving service. + The service will be launched on your "services" queue, which by default runs services on the ClearML server machine. + (Read more on services queue [here](https://allegro.ai/clearml/docs/docs/concepts_fundamentals/concepts_fundamentals_clearml_server.html#clearml-agent-services-container)) + We set our serving-engine to launch on the "default" queue, +```bash +clearml-serving launch --queue default +``` + +4. Optional: If you do not have a machine connected to your ClearML cluster, either read more on our Kubernetes integration, or spin a bare-metal worker and connect it with your ClearML Server. + `clearml-serving` is leveraging the orchestration capabilities of `ClearML` to launch the serving engine on the cluster. + Read more on the [ClearML Agent](https://github.com/allegroai/clearml-agent) orchestration module [here](https://allegro.ai/clearml/docs/docs/concepts_fundamentals/concepts_fundamentals_clearml_agent.html) + If you have not yet setup a ClearML worker connected to your `clearml` account, you can do this now using: + ```bash + pip install clearml-agent + clearml-agent daemon --docker --queue default --detached + ``` + + +**We are done!** +To test the new served model, you can `curl` to the new endpoint: +```bash +curl :8000/v2/models/keras_mnist/versions/1 +``` + +**Notice**: If we re-run our keras training example and publish a new model in the repository, the engine will automatically update to the new model. + +Further reading on advanced topics [here](coming-soon) + + diff --git a/clearml_serving/__init__.py b/clearml_serving/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/clearml_serving/__main__.py b/clearml_serving/__main__.py new file mode 100644 index 0000000..b0b32a7 --- /dev/null +++ b/clearml_serving/__main__.py @@ -0,0 +1,164 @@ +import json +import os +from argparse import ArgumentParser, FileType + +from .serving_service import ServingService + + +def restore_state(args): + session_state_file = os.path.expanduser('~/.clearml_serving.json') + # noinspection PyBroadException + try: + with open(session_state_file, 'rt') as f: + state = json.load(f) + except Exception: + state = {} + + args.id = getattr(args, 'id', None) or state.get('id') + return args + + +def store_state(args, clear=False): + session_state_file = os.path.expanduser('~/.clearml_serving.json') + if clear: + state = {} + else: + state = {str(k): str(v) if v is not None else None + for k, v in args.__dict__.items() if not str(k).startswith('_') and k not in ('command', )} + # noinspection PyBroadException + try: + with open(session_state_file, 'wt') as f: + json.dump(state, f, sort_keys=True) + except Exception: + pass + + +def cmd_triton(args): + if not args.id and not args.name: + raise ValueError("Serving service must have a name, use --name ") + + if args.id: + a_serving = ServingService(task_id=args.id) + else: + a_serving = ServingService(task_project=args.project, task_name=args.name, engine_type='triton') + args.id = a_serving.get_id() + + if args.endpoint: + print("Nvidia Triton Engine ID: {} - Adding serving endpoint: \n".format(args.id) + + ("model-project: '{}', model-name: '{}', model-tags: '{}', config-file: '{}'".format( + args.model_project or '', + args.model_name or '', + args.model_tags or '', + args.config or '') if not args.model_id else + "model-id: '{}', config-file: '{}'".format(args.model_id or '', args.config or ''))) + + if not args.endpoint and (args.model_project or args.model_tags or args.model_id or args.model_name): + raise ValueError("Serving endpoint must be provided, add --endpoint ") + + if args.endpoint: + a_serving.add_model_serving( + serving_url=args.endpoint, + model_project=args.model_project, + model_name=args.model_name, + model_tags=args.model_tags, + model_ids=[args.model_id] if args.model_id else None, + config_file=args.config, + max_versions=args.versions, + ) + + a_serving.serialize(force=True) + store_state(args) + + +def cmd_launch(args): + print('Launching Serving Engine: service: {}, queue: {}'.format(args.id, args.queue)) + + if not args.id: + raise ValueError("Serving service must specify serving service ID, use --id ") + + a_serving = ServingService(task_id=args.id) + + if a_serving.get_engine_type() not in ('triton',): + raise ValueError("Error, serving engine type \'{}\' is not supported".format(a_serving.get_engine_type())) + + # launch services queue + a_serving.launch(queue_name=args.service_queue) + # launch engine + a_serving.launch_engine(queue_name=args.queue) + + +def cli(): + title = 'clearml-serving - CLI for launching ClearML serving engine' + print(title) + parser = ArgumentParser(prog='clearml-serving', description=title) + subparsers = parser.add_subparsers(help='Serving engine commands', dest='command') + + # create the launch command + parser_launch = subparsers.add_parser('launch', help='Launch a previously configured serving service') + parser_launch.add_argument( + '--id', default=None, type=str, + help='Specify a previously configured service ID, if not provided use the last created service') + parser_launch.add_argument( + '--queue', default=None, type=str, required=True, + help='Specify the clearml queue to be used for the serving engine server') + parser_launch.add_argument( + '--service-queue', default='services', type=str, + help='Specify the service queue to be used for the serving service, default: services queue') + parser_launch.set_defaults(func=cmd_launch) + + # create the parser for the "triton" command + parser_trt = subparsers.add_parser('triton', help='Nvidia Triton Serving Engine') + parser_trt.add_argument( + '--id', default=None, type=str, + help='Add configuration to running serving session, pass serving Task ID, ' + 'if passed ignore --name / --project') + parser_trt.add_argument( + '--name', default=None, type=str, + help='Give serving service a name, should be a unique name') + parser_trt.add_argument( + '--project', default='DevOps', type=str, + help='Serving service project name, default: DevOps') + parser_trt.add_argument( + '--endpoint', required=False, type=str, + help='Serving endpoint, one per model, unique ') + parser_trt.add_argument( + '--versions', type=int, + help='Serving endpoint, support multiple versions, ' + 'max versions to deploy (version number always increase). Default (no versioning).') + parser_trt.add_argument( + '--config', required=False, type=FileType, + help='Model `config.pbtxt` file, one per model, order matching with models') + parser_trt.add_argument( + '--model-id', type=str, + help='(Optional) Model ID to deploy, if passed model-project/model-name/model-tags are ignored') + parser_trt.add_argument( + '--model-project', type=str, help='Automatic model deployment and upgrade, select model project (exact match)') + parser_trt.add_argument( + '--model-name', type=str, help='Automatic model deployment and upgrade, select model name (exact match)') + parser_trt.add_argument( + '--model-tags', nargs='*', type=str, + help='Automatic model deployment and upgrade, select model name tags to include, ' + 'model has to have all tags to be deployed/upgraded') + parser_trt.set_defaults(func=cmd_triton) + + args = parser.parse_args() + args = restore_state(args) + + if args.command: + args.func(args) + else: + parser.print_help() + + +def main(): + try: + cli() + except KeyboardInterrupt: + print('\nUser aborted') + except Exception as ex: + print('\nError: {}'.format(ex)) + exit(1) + + +if __name__ == '__main__': + main() diff --git a/clearml_serving/service.py b/clearml_serving/service.py new file mode 100644 index 0000000..89de65f --- /dev/null +++ b/clearml_serving/service.py @@ -0,0 +1,17 @@ +from time import sleep +from clearml import Task +from clearml_serving.serving_service import ServingService + + +def main(): + # we should only be running in remotely by an agent + task = Task.init() + serving = ServingService(task=task) + while True: + serving.update() + serving.stats() + sleep(60.) + + +if __name__ == '__main__': + main() diff --git a/clearml_serving/serving_service.py b/clearml_serving/serving_service.py new file mode 100644 index 0000000..f036d74 --- /dev/null +++ b/clearml_serving/serving_service.py @@ -0,0 +1,568 @@ +import json +import shutil +from logging import getLogger +from pathlib import Path as Path3 +from time import time +from typing import Optional, Union, Dict, Sequence + +from attr import attrib, attrs, asdict +from pathlib2 import Path + +from clearml import Task, Model, InputModel + + +class ServingService(object): + _config_pbtxt_section = 'config.pbtxt' + _supported_serving_engines = ('triton', 'ovms', 'kfserving') + + @attrs + class EndPoint(object): + serving_url = attrib(type=str) + model_ids = attrib(type=list) + model_project = attrib(type=str) + model_name = attrib(type=str) + model_tags = attrib(type=list) + model_config_blob = attrib(type=str, default=None) + max_num_revisions = attrib(type=int, default=None) + versions = attrib(type=dict, default={}) + + def as_dict(self): + return asdict(self) + + def __init__(self, task_id=None, task_project=None, task_name=None, task=None, engine_type='triton'): + # type: (Optional[str], Optional[str], Optional[str], Optional[Task], Optional[str]) -> None + """ + :param task_id: Optional specify existing Task ID of the ServingService + :param task_project: Select the project where the new ServingService task will be created + :param task_name: Specify the Task name for the newly created ServingService + :param task: Optional pass existing ServingService Task object + :param engine_type: Specify the serving engine Type. Examples: triton, ovms, kfserving + """ + assert engine_type in self._supported_serving_engines + + if task: + self._task = task + elif task_id: + self._task = Task.get_task(task_id=task_id) + else: + # noinspection PyProtectedMember + if Task._query_tasks(project_name=task_project, task_name=task_name): + self._task = Task.get_task(project_name=task_project, task_name=task_name) + else: + self._task = Task.create( + project_name=task_project, task_name=task_name, task_type=Task.TaskTypes.service, + repo="https://github.com/allegroai/clearml-serving.git", + branch="master", + script="clearml_serving/service.py", + working_directory=".", + add_task_init_call=False, + ) + self._task.set_system_tags(list(self._task.get_system_tags()) + ['serving']) + + # self._current_serving_endpoints = {'an_enpoint_url': {1: 'model_id'}} + self._current_serving_endpoints = {} # type: Dict[str, Dict[int, str]] + # self._endpoints = {'an_enpoint_url': ServingService.EndPoint()} + self._endpoints = {} # type: Dict[str, ServingService.EndPoint] + self._engine_type = engine_type + self._dirty = False + self._last_update_step = None + # try to deserialize from Task + # noinspection PyBroadException + try: + self._deserialize() + except Exception: + pass + + def add_model_serving( + self, + serving_url, # type: str + model_ids=None, # type: Optional[Sequence[str]] + model_project=None, # type: Optional[str] + model_name=None, # type: Optional[str] + model_tags=None, # type: Optional[Sequence[str]] + config_file=None, # type: Optional[Union[Path, Path3, str]] + max_versions=1, # type: Optional[int] + ): + """ + Add new model serving endpoint, automatically published + + :param serving_url: + :param model_ids: + :param model_project: + :param model_name: + :param model_tags: + :param config_file: + :param max_versions: + :return: + """ + if not serving_url: + raise ValueError("serving_url is required") + + if model_tags and not isinstance(model_tags, (list, tuple)): + raise ValueError("model_tags must be a list of strings") + + # normalize endpoint url + serving_url = str(serving_url).strip('/') + + endpoint = self.EndPoint( + serving_url=serving_url, + model_ids=list(model_ids) if model_ids else None, + model_name=model_name, + model_project=model_project, + model_tags=model_tags, + max_num_revisions=max_versions or None, + versions={}, + model_config_blob='', + ) + # load config file + if config_file: + with open(str(config_file), 'rt') as f: + endpoint.model_config_blob = f.read() + else: + # Look for the config on the Model generated Task + found_models = Model.query_models(project_name=model_project, model_name=model_name, tags=model_tags) or [] + + selected_model = None + # find the first model with config.pbtxt configuration + # prefer published models + found_models = [m for m in found_models if m.published] + [m for m in found_models if not m.published] + for m in found_models: + task_id = m.task + task = Task.get_task(task_id=task_id) + config_pbtxt = task.get_configuration_object(self._config_pbtxt_section) + if config_pbtxt and str(config_pbtxt).strip(): + endpoint.model_config_blob = config_pbtxt + selected_model = m + break + + if not selected_model: + raise ValueError( + "Requested Model project={} name={} tags={} not found. 'config.pbtxt' could not be inferred. " + "please provide specific config.pbtxt definition.".format(model_project, model_name, model_tags)) + elif len(found_models) > 1: + getLogger('clearml-serving').warning( + "Found more than one Model, using model id={}".format(selected_model.id)) + + self._endpoints[serving_url] = endpoint + self._dirty = True + + def launch(self, queue_name='services', queue_id=None, force=False, verbose=True): + # type: (Optional[str], Optional[str], bool, bool) -> None + """ + Launch serving service on a remote machine using the specified queue + + :param queue_name: Queue name to launch the serving service control plane + :param queue_id: specify queue id (unique stand stable) instead of queue_name + :param force: if False check if service Task is already running before enqueuing + :param verbose: If True print progress to console + """ + # check if we are not already running + if not force and ((self._task.data.execution.queue and self._task.status == 'in_progress') + or self._task.status == 'queued'): + if verbose: + print('Serving service already running') + else: + if verbose: + print('Launching Serving service on {} queue'.format(queue_id or queue_name)) + self.update_endpoint_graph(force=True) + self.update_model_endpoint_state() + self.serialize() + self._task.flush(wait_for_uploads=True) + self._task.reset() + self._task.enqueue(task=self._task, queue_name=queue_name, queue_id=queue_id) + + def launch_engine(self, queue_name, queue_id=None, verbose=True): + # type: (Optional[str], Optional[str], bool) -> None + """ + Launch serving engine on a specific queue + + :param queue_name: Queue name to launch the engine service running the inference on. + :param queue_id: specify queue id (unique stand stable) instead of queue_name + :param verbose: If True print progress to console + """ + + # todo: add more engines + if self._engine_type == 'triton': + # create the serving engine Task + engine_task = Task.create( + project_name=self._task.get_project_name(), + task_name="triton serving engine", + task_type=Task.TaskTypes.inference, + repo="https://github.com/allegroai/clearml-serving.git", + branch="master", + script="clearml_serving/triton_helper.py", + working_directory=".", + docker="nvcr.io/nvidia/tritonserver:21.03-py3 --ipc=host -p 8000:8000 -p 8001:8001 -p 8002:8002", + argparse_args=[('serving_id', self._task.id), ], + add_task_init_call=False, + ) + if verbose: + print('Launching engine {} on queue {}'.format(self._engine_type, queue_id or queue_name)) + engine_task.enqueue(task=engine_task, queue_name=queue_name, queue_id=queue_id) + + def update_endpoint_graph(self, force=False): + # type: (bool) -> None + """ + Update the endpoint serving graph + + :param force: If True always update, otherwise skip if service was not changed since lat time + """ + if not force and not self._dirty: + return + + # Generate configuration table and details + table_values = [["Endpoint", "Model ID", "Model Project", "Model Name", "Model Tags", "Max Versions"]] + for endpoint in sorted(self._endpoints.keys()): + n = self._endpoints[endpoint] + table_values.append([ + str(n.serving_url or ''), + str(n.model_ids or ''), + str(n.model_project or ''), + str(n.model_name or ''), + str(n.model_tags or ''), + str(n.max_num_revisions or '') + ]) + self._task.get_logger().report_table( + title='Serving Endpoint Configuration', series='Details', iteration=0, table_plot=table_values, + extra_layout={"title": "Model Endpoints Details"}) + + # generate current endpoint view + sankey_node = dict( + label=[], + color=[], + customdata=[], + hovertemplate='%{customdata}', + hoverlabel={"align": "left"}, + ) + sankey_link = dict( + source=[], + target=[], + value=[], + hovertemplate='', + ) + # root + sankey_node['color'].append("mediumpurple") + sankey_node['label'].append('{}'.format('serving')) + sankey_node['customdata'].append("") + + # Generate table and details + table_values = [["Endpoint", "Version", "Model ID"]] + # noinspection PyProtectedMember + base_url = self._task._get_app_server() + '/projects/*/models/{model_id}/general' + for i, serve_url in enumerate(sorted(self._endpoints.keys())): + ep = self._endpoints[serve_url] + sankey_node['color'].append("blue") + sankey_node['label'].append('{}'.format(serve_url)) + sankey_node['customdata'].append( + "project: {}
name: {}
tags: {}".format( + ep.model_project or '', ep.model_name or '', ep.model_tags or '') + ) + sankey_link['source'].append(0) + sankey_link['target'].append(i + 1) + sankey_link['value'].append(1. / len(self._endpoints)) + + for v in sorted(self._current_serving_endpoints.get(serve_url, [])): + model_id = self._current_serving_endpoints[serve_url][v] + href = ' {} '.format(base_url.format(model_id=model_id), model_id) + table_values.append([str(serve_url), str(v), href]) + sankey_node['color'].append("lightblue") + sankey_node['label'].append('{}'.format(v)) + sankey_node['customdata'].append(model_id) + + sankey_link['source'].append(i + 1) + sankey_link['target'].append(len(sankey_node['color']) - 1) + sankey_link['value'].append(1. / len(self._current_serving_endpoints[serve_url])) + + # create the sankey graph + dag_flow = dict( + link=sankey_link, + node=sankey_node, + textfont=dict(color='rgba(0,0,0,255)', size=10), + type='sankey', + orientation='h' + ) + fig = dict(data=[dag_flow], layout={'xaxis': {'visible': False}, 'yaxis': {'visible': False}}) + + self._task.get_logger().report_plotly( + title='Model Serving Endpoints', series='', iteration=0, figure=fig) + + # report detailed table + self._task.get_logger().report_table( + title='Serving Endpoint', series='Details', iteration=0, table_plot=table_values, + extra_layout={"title": "Model Endpoints Details"}) + + self._dirty = False + + def update_model_endpoint_state(self): + # type: () -> bool + """ + Update model endpoint state from the model repository + + :return: True if endpoints were updated + """ + + for endpoint, node in self._endpoints.items(): + # model ID supersedes everything + if node.model_ids: + model_ids = node.model_ids + else: + # get list of models sorted by descending update time + models = Model.query_models( + project_name=node.model_project, + model_name=node.model_name, + tags=node.model_tags + ) + # prefer published models + model_ids = [m.id for m in models if m.published] + [m.id for m in models if not m.published] + + cur_endpoint = self._current_serving_endpoints.get(node.serving_url, {}) + cur_endpoint = {int(k): v for k, v in cur_endpoint.items() if v in model_ids} + cur_endpoint_m_ids = list(cur_endpoint.values()) + max_v = max(list(cur_endpoint.keys()) or [0]) + for i, m_id in enumerate(model_ids): + # only pick the latest in the history + if node.max_num_revisions and max_v >= node.max_num_revisions: + break + + if m_id in cur_endpoint_m_ids: + continue + max_v += 1 + cur_endpoint[max_v] = m_id + + # check if we need to update, + if self._current_serving_endpoints.get(node.serving_url) != cur_endpoint: + # set dirty flag + self._dirty = True + # store updated results + self._current_serving_endpoints[node.serving_url] = cur_endpoint + + return self._dirty + + def stats(self): + pass + + def get_endpoints(self): + # type: () -> Dict[str, ServingService.EndPoint] + """ + return the internal endpoints configuration + + :return: dict where the keys is the endpoint url and the value is the endpoint configuration + """ + return self._endpoints + + def get_endpoint_version_model_id(self, serving_url): + # type: (str) -> Dict[int, str] + """ + Return dict with model versions and model id for the specific serving url + If serving url is not found, return None + + :param serving_url: sering url string + + :return: dictionary keys are the versions (integers) and values are the model IDs (str) + """ + return self._current_serving_endpoints.get(serving_url) or {} + + def _serialize(self): + configuration = dict() + for name, ep in self._endpoints.items(): + # noinspection PyProtectedMember + self._task.set_configuration_object( + name="model.{}".format(name), + description='Model Serving Configuration', + config_type='pbtxt', + config_text=ep.model_config_blob) + ep_conf = ep.as_dict() + ep_conf.pop('model_config_blob', None) + configuration['"{}"'.format(name)] = ep_conf + # noinspection PyProtectedMember + self._task._set_configuration( + config_dict=configuration, name='endpoints', + config_type='hocon', description='Serving Endpoints Configuration') + # set configuration of current served endpoints + # noinspection PyProtectedMember + self._task._set_configuration( + config_dict=self._current_serving_endpoints, name='serving_state', + config_type='hocon', description='Current Serving Endpoints State', + ) + serving = dict(engine=self._engine_type) + self._task.connect(serving, name='serving') + + def _deserialize(self): + # type: () -> bool + """ + deserialize internal state from Task backend + + :return: return True if new state a was updated. + """ + # update if the task was updated + if self._endpoints: + last_update = self._task.data.last_update + try: + # noinspection PyProtectedMember + if last_update == self._task._get_last_update(): + return True + except AttributeError: + # support old clearml packages + pass + + self._task.reload() + + # noinspection PyProtectedMember + configuration = self._task._get_configuration_dict(name='endpoints') + if not configuration: + return False + + self._endpoints = {} + self._current_serving_endpoints = {} + serving = dict(engine='') + task_parameters = self._task.get_parameters_as_dict() + serving.update(task_parameters.get('serving', {})) + self._engine_type = serving['engine'] + + for name, endpoint in configuration.items(): + ep = self.EndPoint(model_config_blob='', **endpoint) + ep.model_config_blob = self._task.get_configuration_object( + name="model.{}".format(ep.serving_url)) + self._endpoints[ep.serving_url] = ep + + # get configuration of current served endpoints + # noinspection PyProtectedMember + self._current_serving_endpoints = self._task._get_configuration_dict(name='serving_state') + + self._dirty = True + return True + + def update(self, force=False): + # type: (bool) -> bool + """ + Update internal endpoint state based on Task configuration and model repository + + :param force: if True force update + + :return: True if internal state updated. + """ + if not self._task: + return False + + # store current internal state + state_hash = self.__state_hash() + + if not self._deserialize(): + return False + + # check if current internal state changed + if not force and state_hash == self.__state_hash(): + print("Skipping update, nothing changed") + return False + + return self.update_model_endpoint_state() + + def get_id(self): + # type: () -> str + """ + Return the Serving Service Task ID + :return: Unique Task ID (str) + """ + return self._task.id + + def get_engine_type(self): + # type: () -> str + """ + return the engine type used ib the serving service + :return: engine type (str). example: triton, ovms, kfserving + """ + return self._engine_type + + def serialize(self, force=False): + # type: (bool) -> None + """ + Serialize current service state to the Task + + :param force: If True synchronize an aborted/completed Task + """ + if force and self._task.status not in (Task.TaskStatusEnum.created, Task.TaskStatusEnum.in_progress): + self._task.mark_started(force=True) + + self._serialize() + + def triton_model_service_update_step(self, model_repository_folder=None, verbose=True): + # type: (Optional[str], bool) -> None + + # check if something changed since last time + if not self.update(force=self._last_update_step is None): + return + + self._last_update_step = time() + + if not model_repository_folder: + model_repository_folder = '/models/' + + if verbose: + print('Updating local model folder: {}'.format(model_repository_folder)) + + for url, endpoint in self.get_endpoints().items(): + folder = Path(model_repository_folder) / url + folder.mkdir(parents=True, exist_ok=True) + with open((folder / 'config.pbtxt').as_posix(), 'wt') as f: + f.write(endpoint.model_config_blob) + + # download model versions + for version, model_id in self.get_endpoint_version_model_id(serving_url=url).items(): + model_folder = folder / str(version) + + model_folder.mkdir(parents=True, exist_ok=True) + model = None + # noinspection PyBroadException + try: + model = InputModel(model_id) + local_path = model.get_local_copy() + except Exception: + local_path = None + if not local_path: + print("Error retrieving model ID {} []".format(model_id, model.url if model else '')) + continue + + local_path = Path(local_path) + + if verbose: + print('Update model v{} in {}'.format(version, model_folder)) + + # if this is a folder copy every and delete the temp folder + if local_path.is_dir(): + # we assume we have a `tensorflow.savedmodel` folder + model_folder /= 'model.savedmodel' + model_folder.mkdir(parents=True, exist_ok=True) + # rename to old + old_folder = None + if model_folder.exists(): + old_folder = model_folder.parent / '.old.{}'.format(model_folder.name) + model_folder.replace(old_folder) + if verbose: + print('copy model into {}'.format(model_folder)) + shutil.copytree( + local_path.as_posix(), model_folder.as_posix(), symlinks=False, + ) + if old_folder: + shutil.rmtree(path=old_folder.as_posix()) + # delete temp folder + shutil.rmtree(local_path.as_posix()) + else: + # single file should be moved + target_path = model_folder / local_path.name + old_file = None + if target_path.exists(): + old_file = target_path.parent / '.old.{}'.format(target_path.name) + target_path.replace(old_file) + shutil.move(local_path.as_posix(), target_path.as_posix()) + if old_file: + old_file.unlink() + + def __state_hash(self): + # type: () -> int + """ + Return Hash of the internal state (use only for in process comparison + :return: hash int + """ + return hash(json.dumps( + [self._current_serving_endpoints, {k: v.as_dict() for k, v in self._endpoints.items()}], + sort_keys=True)) diff --git a/clearml_serving/triton_helper.py b/clearml_serving/triton_helper.py new file mode 100644 index 0000000..8428d94 --- /dev/null +++ b/clearml_serving/triton_helper.py @@ -0,0 +1,214 @@ +import re +import subprocess +from argparse import ArgumentParser +from time import time +from typing import Optional + +from pathlib2 import Path + +from clearml import Task, Logger +from clearml.backend_api.utils import get_http_session_with_retry +from clearml_serving.serving_service import ServingService + + +class TritonHelper(object): + _metric_line_parsing = r"(\w+){(gpu_uuid=\"[\w\W]*\",)?model=\"(\w+)\",\s*version=\"(\d+)\"}\s*([0-9.]*)" + _default_metrics_port = 8002 + + def __init__( + self, + args, # Any + task, # type: Task + serving_id, # type: str + metric_host=None, # type: Optional[str] + metric_port=None, # type: int + ): + # type: (...) -> None + self._http_session = get_http_session_with_retry() + self.args = dict(**args.__dict__) if args else {} + self.task = task + self.serving_id = serving_id + self.metric_host = metric_host or '0.0.0.0' + self.metric_port = metric_port or self._default_metrics_port + self._parse_metric = re.compile(self._metric_line_parsing) + self._timestamp = time() + print('String Triton Helper service\n{}\n'.format(self.args)) + + def report_metrics(self, remote_logger): + # type: (Optional[Logger]) -> bool + # iterations are seconds from start + iteration = int(time() - self._timestamp) + + report_msg = "reporting metrics: relative time {} sec".format(iteration) + self.task.get_logger().report_text(report_msg) + if remote_logger: + remote_logger.report_text(report_msg) + + # noinspection PyBroadException + try: + request = self._http_session.get('http://{}:{}/metrics'.format( + self.metric_host, self.metric_port)) + if not request.ok: + return False + content = request.content.decode().split('\n') + except Exception: + return False + + for line in content: + line = line.strip() + if not line or line.startswith('#'): + continue + # noinspection PyBroadException + try: + metric, gpu_uuid, variant, version, value = self._parse_metric.match(line).groups() + value = float(value) + except Exception: + continue + self.task.get_logger().report_scalar( + title=metric, + series='{}.v{}'.format(variant, version), + iteration=iteration, + value=value + ) + # on the remote logger we add our own Task ID (unique ID), + # to support multiple servers reporting to the same service controller + if remote_logger: + remote_logger.report_scalar( + title=metric, + series='{}.v{}.{}'.format(variant, version, self.task.id), + iteration=iteration, + value=value + ) + + def maintenance_daemon( + self, + local_model_repo='/models', # type: str + update_frequency_sec=60.0, # type: float + metric_frequency_sec=60.0 # type: float + ): + # type: (...) -> None + + Path(local_model_repo).mkdir(parents=True, exist_ok=True) + + a_service = ServingService(task_id=self.serving_id) + a_service.triton_model_service_update_step(model_repository_folder=local_model_repo) + + # noinspection PyProtectedMember + remote_logger = a_service._task.get_logger() + + # todo: log triton server outputs when running locally + + # we assume we can run the triton server + cmd = [ + 'tritonserver', + '--model-control-mode=poll', + '--model-repository={}'.format(local_model_repo), + '--repository-poll-secs={}'.format(update_frequency_sec), + '--metrics-port={}'.format(self._default_metrics_port), + '--allow-metrics=true', + '--allow-gpu-metrics=true', + ] + for k, v in self.args.items(): + if not v or not str(k).startswith('t_'): + continue + cmd.append('--{}={}'.format(k, v)) + + print('Starting server: {}'.format(cmd)) + proc = subprocess.Popen(cmd) + base_freq = min(update_frequency_sec, metric_frequency_sec) + metric_tic = update_tic = time() + while True: + try: + error_code = proc.wait(timeout=base_freq) + if error_code == 0: + print("triton-server process ended with error code {}".format(error_code)) + return + raise ValueError("triton-server process ended with error code {}".format(error_code)) + except subprocess.TimeoutExpired: + pass + pass + + # update models + if time() - update_tic > update_frequency_sec: + a_service.triton_model_service_update_step(model_repository_folder=local_model_repo) + update_tic = time() + + # update stats + if time() - metric_tic > metric_frequency_sec: + metric_tic = time() + self.report_metrics(remote_logger) + + +def main(): + title = 'clearml-serving - Nvidia Triton Engine Helper' + print(title) + parser = ArgumentParser(prog='clearml-serving', description=title) + parser.add_argument( + '--serving-id', default=None, type=str, required=True, + help='Specify main serving service Task ID') + parser.add_argument( + '--project', default='serving', type=str, + help='Optional specify project for the serving engine Task') + parser.add_argument( + '--name', default='nvidia-triton', type=str, + help='Optional specify task name for the serving engine Task') + parser.add_argument( + '--update-frequency', default=10, type=float, + help='Model update frequency in minutes') + parser.add_argument( + '--metric-frequency', default=1, type=float, + help='Metric reporting update frequency in minutes') + parser.add_argument( + '--t-http-port', type=str, help=' The port for the server to listen on for HTTP requests') + parser.add_argument( + '--t-http-thread-count', type=str, help=' Number of threads handling HTTP requests') + parser.add_argument( + '--t-allow-grpc', type=str, help=' Allow the server to listen for GRPC requests') + parser.add_argument( + '--t-grpc-port', type=str, help=' The port for the server to listen on for GRPC requests') + parser.add_argument( + '--t-grpc-infer-allocation-pool-size', type=str, + help=' The maximum number of inference request/response objects that remain ' + 'allocated for reuse. As long as the number of in-flight requests doesn\'t exceed ' + 'this value there will be no allocation/deallocation of request/response objects') + parser.add_argument( + '--t-pinned-memory-pool-byte-size', type=str, + help=' The total byte size that can be allocated as pinned system ' + 'memory. If GPU support is enabled, the server will allocate pinned ' + 'system memory to accelerate data transfer between host and devices ' + 'until it exceeds the specified byte size. This option will not affect ' + 'the allocation conducted by the backend frameworks. Default is 256 MB') + parser.add_argument( + '--t-cuda-memory-pool-byte-size', type=str, + help='<:> The total byte size that can be allocated as CUDA memory for ' + 'the GPU device. If GPU support is enabled, the server will allocate ' + 'CUDA memory to minimize data transfer between host and devices ' + 'until it exceeds the specified byte size. This option will not affect ' + 'the allocation conducted by the backend frameworks. The argument ' + 'should be 2 integers separated by colons in the format :. This option can be used multiple times, but only ' + 'once per GPU device. Subsequent uses will overwrite previous uses for ' + 'the same GPU device. Default is 64 MB') + parser.add_argument( + '--t-min-supported-compute-capability', type=str, + help=' The minimum supported CUDA compute capability. GPUs that ' + 'don\'t support this compute capability will not be used by the server') + parser.add_argument( + '--t-buffer-manager-thread-count', type=str, + help=' The number of threads used to accelerate copies and other' + 'operations required to manage input and output tensor contents.' + 'Default is 0') + + args = parser.parse_args() + task = Task.init(project_name=args.project, task_name=args.name, task_type=Task.TaskTypes.inference) + helper = TritonHelper(args, task, serving_id=args.serving_id) + # this function will never end + helper.maintenance_daemon( + local_model_repo='/models', + update_frequency_sec=args.update_frequency*60.0, + metric_frequency_sec=args.metric_frequency*60.0, + ) + + +if __name__ == '__main__': + main() diff --git a/clearml_serving/version.py b/clearml_serving/version.py new file mode 100644 index 0000000..e1424ed --- /dev/null +++ b/clearml_serving/version.py @@ -0,0 +1 @@ +__version__ = '0.3.1' diff --git a/docs/webapp_screenshots.gif b/docs/webapp_screenshots.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2ceca5a9b60d6636c32034c23a2736c23d42589 GIT binary patch literal 131208 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 z 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 cjaazt*}E0kywz7?Xj+4n26Rwaga`-#J6KN=2.0 +clearml diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7c60ed3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +clearml >= 0.17.6rc1 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..5904169 --- /dev/null +++ b/setup.py @@ -0,0 +1,75 @@ +""" +`clearml-serving` - Model-Serving Orchestration and Repository Solution +https://github.com/allegroai/clearml-serving +""" + +import os.path +# Always prefer setuptools over distutils +from setuptools import setup, find_packages + + +def read_text(filepath): + with open(filepath, "r", encoding="utf-8") as f: + return f.read() + + +here = os.path.dirname(__file__) +# Get the long description from the README file +long_description = read_text(os.path.join(here, 'README.md')) + + +def read_version_string(version_file): + for line in read_text(version_file).splitlines(): + if line.startswith('__version__'): + delim = '"' if '"' in line else "'" + return line.split(delim)[1] + else: + raise RuntimeError("Unable to find version string.") + + +version = read_version_string("clearml_serving/version.py") + +requirements = read_text(os.path.join(here, 'requirements.txt')).splitlines() + +setup( + name='clearml-serving', + version=version, + description='clearml-serving - Model-Serving Orchestration and Repository Solution', + long_description=long_description, + long_description_content_type='text/markdown', + # The project's main homepage. + url='https://github.com/allegroai/clearml-serving.git', + author='Allegroai', + author_email='clearml@allegro.ai', + license='Apache License 2.0', + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Operating System :: POSIX :: Linux', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Software Development', + 'Topic :: Software Development :: Version Control', + 'Topic :: System :: Logging', + 'Topic :: System :: Monitoring', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'License :: OSI Approved :: Apache Software License', + ], + keywords='clearml mlops devops trains development machine deep learning version control machine-learning ' + 'machinelearning deeplearning deep-learning model-serving', + packages=find_packages(exclude=['contrib', 'docs', 'data', 'examples', 'tests']), + install_requires=requirements, + # To provide executable scripts, use entry points in preference to the + # "scripts" keyword. Entry points provide cross-platform support and allow + # pip to create the appropriate form of executable for the target platform. + entry_points={ + 'console_scripts': [ + 'clearml-serving = clearml_serving.__main__:main', + ], + }, +)