def __getitem__(self, item): """Override __getitem__ so that we can directly look up plugins via dict-like syntax""" try: target_name = parse_target_uri(item) plugin_like = self.registry[target_name] except KeyError: msg = ( 'No plugin found for managing model deployments to "{target}". ' 'In order to deploy models to "{target}", find and install an appropriate ' "plugin from " "https://mlflow.org/docs/latest/plugins.html#community-plugins using " "your package manager (pip, conda etc).".format(target=item) ) raise MlflowException(msg, error_code=RESOURCE_DOES_NOT_EXIST) if isinstance(plugin_like, entrypoints.EntryPoint): try: plugin_obj = plugin_like.load() except (AttributeError, ImportError) as exc: raise RuntimeError('Failed to load the plugin "{}": {}'.format(item, str(exc))) self.registry[item] = plugin_obj else: plugin_obj = plugin_like # Testing whether the plugin is valid or not expected = {"target_help", "run_local"} deployment_classes = [] for name, obj in inspect.getmembers(plugin_obj): if name in expected: expected.remove(name) elif ( inspect.isclass(obj) and issubclass(obj, BaseDeploymentClient) and not obj == BaseDeploymentClient ): deployment_classes.append(name) if len(expected) > 0: raise MlflowException( "Plugin registered for the target {} does not has all " "the required interfaces. Raise an issue with the " "plugin developers.\n" "Missing interfaces: {}".format(item, expected), error_code=INTERNAL_ERROR, ) if len(deployment_classes) > 1: raise MlflowException( "Plugin registered for the target {} has more than one " "child class of BaseDeploymentClient. Raise an issue with" " the plugin developers. " "Classes found are {}".format(item, deployment_classes) ) elif len(deployment_classes) == 0: raise MlflowException( "Plugin registered for the target {} has no child class" " of BaseDeploymentClient. Raise an issue with the " "plugin developers".format(item) ) return plugin_obj
def get_deploy_client(target_uri): """ Returns a subclass of :py:class:`mlflow.deployments.BaseDeploymentClient` exposing standard APIs for deploying models to the specified target. See available deployment APIs by calling ``help()`` on the returned object or viewing docs for :py:class:`mlflow.deployments.BaseDeploymentClient`. You can also run ``mlflow deployments help -t <target-uri>`` via the CLI for more details on target-specific configuration options. :param target_uri: URI of target to deploy to. .. code-block:: python :caption: Example from mlflow.deployments import get_deploy_client import pandas as pd client = get_deploy_client('redisai') # Deploy the model stored at artifact path 'myModel' under run with ID 'someRunId'. The # model artifacts are fetched from the current tracking server and then used for deployment. client.create_deployment("spamDetector", "runs:/someRunId/myModel") # Load a CSV of emails and score it against our deployment emails_df = pd.read_csv("...") prediction_df = client.predict_deployment("spamDetector", emails_df) # List all deployments, get details of our particular deployment print(client.list_deployments()) print(client.get_deployment("spamDetector")) # Update our deployment to serve a different model client.update_deployment("spamDetector", "runs:/anotherRunId/myModel") # Delete our deployment client.delete_deployment("spamDetector") """ target = parse_target_uri(target_uri) plugin = plugin_store[target] for _, obj in inspect.getmembers(plugin): if inspect.isclass(obj): if issubclass( obj, BaseDeploymentClient) and not obj == BaseDeploymentClient: return obj(target_uri)