mlserver
Advanced tools
@@ -21,2 +21,3 @@ from collections import defaultdict, OrderedDict | ||
| parameters = defaultdict(list) | ||
| payload_parameters = {} | ||
| if payload.parameters is not None: | ||
@@ -23,0 +24,0 @@ payload_parameters = payload.parameters.model_dump() |
+11
-7
@@ -6,3 +6,2 @@ """ | ||
| import click | ||
| import asyncio | ||
@@ -15,3 +14,3 @@ from functools import wraps | ||
| from ..logging import logger, configure_logger | ||
| from ..utils import install_uvloop_event_loop | ||
| from ..utils import AsyncManager | ||
@@ -22,7 +21,11 @@ from .build import generate_dockerfile, build_image, write_dockerfile | ||
| CTX_ASYNC_MGR_KEY = "async_manager" | ||
| def click_async(f): | ||
| @wraps(f) | ||
| def wrapper(*args, **kwargs): | ||
| return asyncio.run(f(*args, **kwargs)) | ||
| ctx = click.get_current_context() | ||
| async_mgr = ctx.obj[CTX_ASYNC_MGR_KEY] | ||
| return async_mgr.run(f(*args, **kwargs)) | ||
@@ -34,7 +37,8 @@ return wrapper | ||
| @click.version_option() | ||
| def root(): | ||
| @click.pass_context | ||
| def root(ctx): | ||
| """ | ||
| Command-line interface to manage MLServer models. | ||
| """ | ||
| pass | ||
| ctx.ensure_object(dict) | ||
@@ -272,4 +276,4 @@ | ||
| configure_logger() | ||
| install_uvloop_event_loop() | ||
| root() | ||
| async_mgr = AsyncManager() | ||
| root(obj={CTX_ASYNC_MGR_KEY: async_mgr}) | ||
@@ -276,0 +280,0 @@ |
@@ -0,3 +1,4 @@ | ||
| from typing import TYPE_CHECKING | ||
| from .numpy import NumpyCodec, NumpyRequestCodec | ||
| from .pandas import PandasCodec | ||
| from .string import StringCodec, StringRequestCodec | ||
@@ -27,2 +28,5 @@ from .base64 import Base64Codec | ||
| if TYPE_CHECKING: # pragma: no cover - type checking only | ||
| from .pandas import PandasCodec # noqa: F401 | ||
| __all__ = [ | ||
@@ -53,1 +57,20 @@ "CodecError", | ||
| ] | ||
| def __getattr__(name: str): # pragma: no cover - lightweight lazy import | ||
| if name == "PandasCodec": | ||
| return _load_pandas_codec() | ||
| raise AttributeError(f"module 'mlserver.codecs' has no attribute {name!r}") | ||
| def _load_pandas_codec(): | ||
| try: | ||
| from .pandas import PandasCodec as _PandasCodec # Local import to stay optional | ||
| except Exception as exc: # pragma: no cover - propagate useful context | ||
| raise ImportError( | ||
| "PandasCodec requires the optional 'pandas' dependency" | ||
| ) from exc | ||
| globals()["PandasCodec"] = _PandasCodec | ||
| return _PandasCodec |
@@ -118,3 +118,3 @@ import pandas as pd | ||
| use_bytes: bool = True, | ||
| **kwargs | ||
| **kwargs, | ||
| ) -> InferenceResponse: | ||
@@ -121,0 +121,0 @@ outputs = cls.encode_outputs(payload, use_bytes=use_bytes) |
+383
-397
@@ -7,10 +7,17 @@ """ | ||
| import builtins | ||
| import collections.abc | ||
| import google.protobuf.descriptor | ||
| import google.protobuf.internal.containers | ||
| import google.protobuf.message | ||
| import sys | ||
| import typing | ||
| import typing_extensions | ||
| DESCRIPTOR: google.protobuf.descriptor.FileDescriptor = ... | ||
| if sys.version_info >= (3, 10): | ||
| import typing as typing_extensions | ||
| else: | ||
| import typing_extensions | ||
| DESCRIPTOR: google.protobuf.descriptor.FileDescriptor | ||
| @typing.final | ||
| class ServerLiveRequest(google.protobuf.message.Message): | ||
@@ -21,3 +28,4 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -27,10 +35,11 @@ self, | ||
| global___ServerLiveRequest = ServerLiveRequest | ||
| Global___ServerLiveRequest: typing_extensions.TypeAlias = ServerLiveRequest | ||
| @typing.final | ||
| class ServerLiveResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| LIVE_FIELD_NUMBER: builtins.int | ||
| live: builtins.bool = ... | ||
| live: builtins.bool | ||
| """True if the inference server is live, false if not live.""" | ||
| def __init__( | ||
@@ -41,8 +50,7 @@ self, | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, field_name: typing_extensions.Literal["live", b"live"] | ||
| ) -> None: ... | ||
| def ClearField(self, field_name: typing.Literal["live", b"live"]) -> None: ... | ||
| global___ServerLiveResponse = ServerLiveResponse | ||
| Global___ServerLiveResponse: typing_extensions.TypeAlias = ServerLiveResponse | ||
| @typing.final | ||
| class ServerReadyRequest(google.protobuf.message.Message): | ||
@@ -53,3 +61,4 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -59,10 +68,11 @@ self, | ||
| global___ServerReadyRequest = ServerReadyRequest | ||
| Global___ServerReadyRequest: typing_extensions.TypeAlias = ServerReadyRequest | ||
| @typing.final | ||
| class ServerReadyResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| READY_FIELD_NUMBER: builtins.int | ||
| ready: builtins.bool = ... | ||
| ready: builtins.bool | ||
| """True if the inference server is ready, false if not ready.""" | ||
| def __init__( | ||
@@ -73,8 +83,7 @@ self, | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, field_name: typing_extensions.Literal["ready", b"ready"] | ||
| ) -> None: ... | ||
| def ClearField(self, field_name: typing.Literal["ready", b"ready"]) -> None: ... | ||
| global___ServerReadyResponse = ServerReadyResponse | ||
| Global___ServerReadyResponse: typing_extensions.TypeAlias = ServerReadyResponse | ||
| @typing.final | ||
| class ModelReadyRequest(google.protobuf.message.Message): | ||
@@ -85,32 +94,31 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| NAME_FIELD_NUMBER: builtins.int | ||
| VERSION_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The name of the model to check for readiness.""" | ||
| version: typing.Text = ... | ||
| version: builtins.str | ||
| """The version of the model to check for readiness. If not given the | ||
| server will choose a version based on the model and internal policy. | ||
| """ | ||
| def __init__( | ||
| self, | ||
| *, | ||
| name: typing.Text = ..., | ||
| version: typing.Text = ..., | ||
| name: builtins.str = ..., | ||
| version: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["name", b"name", "version", b"version"], | ||
| self, field_name: typing.Literal["name", b"name", "version", b"version"] | ||
| ) -> None: ... | ||
| global___ModelReadyRequest = ModelReadyRequest | ||
| Global___ModelReadyRequest: typing_extensions.TypeAlias = ModelReadyRequest | ||
| @typing.final | ||
| class ModelReadyResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| READY_FIELD_NUMBER: builtins.int | ||
| ready: builtins.bool = ... | ||
| ready: builtins.bool | ||
| """True if the model is ready, false if not ready.""" | ||
| def __init__( | ||
@@ -121,8 +129,7 @@ self, | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, field_name: typing_extensions.Literal["ready", b"ready"] | ||
| ) -> None: ... | ||
| def ClearField(self, field_name: typing.Literal["ready", b"ready"]) -> None: ... | ||
| global___ModelReadyResponse = ModelReadyResponse | ||
| Global___ModelReadyResponse: typing_extensions.TypeAlias = ModelReadyResponse | ||
| @typing.final | ||
| class ServerMetadataRequest(google.protobuf.message.Message): | ||
@@ -133,3 +140,4 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -139,21 +147,20 @@ self, | ||
| global___ServerMetadataRequest = ServerMetadataRequest | ||
| Global___ServerMetadataRequest: typing_extensions.TypeAlias = ServerMetadataRequest | ||
| @typing.final | ||
| class ServerMetadataResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| NAME_FIELD_NUMBER: builtins.int | ||
| VERSION_FIELD_NUMBER: builtins.int | ||
| EXTENSIONS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The server name.""" | ||
| version: typing.Text = ... | ||
| version: builtins.str | ||
| """The server version.""" | ||
| @property | ||
| def extensions( | ||
| self, | ||
| ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: | ||
| ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: | ||
| """The extensions supported by the server.""" | ||
| pass | ||
@@ -163,9 +170,9 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| version: typing.Text = ..., | ||
| extensions: typing.Optional[typing.Iterable[typing.Text]] = ..., | ||
| name: builtins.str = ..., | ||
| version: builtins.str = ..., | ||
| extensions: collections.abc.Iterable[builtins.str] | None = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "extensions", b"extensions", "name", b"name", "version", b"version" | ||
@@ -175,4 +182,5 @@ ], | ||
| global___ServerMetadataResponse = ServerMetadataResponse | ||
| Global___ServerMetadataResponse: typing_extensions.TypeAlias = ServerMetadataResponse | ||
| @typing.final | ||
| class ModelMetadataRequest(google.protobuf.message.Message): | ||
@@ -183,53 +191,54 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| NAME_FIELD_NUMBER: builtins.int | ||
| VERSION_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The name of the model.""" | ||
| version: typing.Text = ... | ||
| version: builtins.str | ||
| """The version of the model to check for readiness. If not given the | ||
| server will choose a version based on the model and internal policy. | ||
| """ | ||
| def __init__( | ||
| self, | ||
| *, | ||
| name: typing.Text = ..., | ||
| version: typing.Text = ..., | ||
| name: builtins.str = ..., | ||
| version: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["name", b"name", "version", b"version"], | ||
| self, field_name: typing.Literal["name", b"name", "version", b"version"] | ||
| ) -> None: ... | ||
| global___ModelMetadataRequest = ModelMetadataRequest | ||
| Global___ModelMetadataRequest: typing_extensions.TypeAlias = ModelMetadataRequest | ||
| @typing.final | ||
| class ModelMetadataResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class TensorMetadata(google.protobuf.message.Message): | ||
| """Metadata for a tensor.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -241,8 +250,6 @@ | ||
| PARAMETERS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The tensor name.""" | ||
| datatype: typing.Text = ... | ||
| datatype: builtins.str | ||
| """The tensor data type.""" | ||
| @property | ||
@@ -257,3 +264,2 @@ def shape( | ||
| """ | ||
| pass | ||
@@ -264,3 +270,3 @@ @property | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
@@ -270,3 +276,2 @@ """Optional default parameters for input. | ||
| """ | ||
| pass | ||
@@ -276,12 +281,12 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| datatype: typing.Text = ..., | ||
| shape: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| name: builtins.str = ..., | ||
| datatype: builtins.str = ..., | ||
| shape: collections.abc.Iterable[builtins.int] | None = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "datatype", | ||
@@ -298,21 +303,22 @@ b"datatype", | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -326,13 +332,11 @@ | ||
| PARAMETERS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The model name.""" | ||
| platform: builtins.str | ||
| """The model's platform. See Platforms.""" | ||
| @property | ||
| def versions( | ||
| self, | ||
| ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: | ||
| ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: | ||
| """The versions of the model available on the server.""" | ||
| pass | ||
| platform: typing.Text = ... | ||
| """The model's platform. See Platforms.""" | ||
@@ -343,6 +347,5 @@ @property | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___ModelMetadataResponse.TensorMetadata | ||
| Global___ModelMetadataResponse.TensorMetadata | ||
| ]: | ||
| """The model's inputs.""" | ||
| pass | ||
@@ -353,6 +356,5 @@ @property | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___ModelMetadataResponse.TensorMetadata | ||
| Global___ModelMetadataResponse.TensorMetadata | ||
| ]: | ||
| """The model's outputs.""" | ||
| pass | ||
@@ -363,3 +365,3 @@ @property | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
@@ -369,3 +371,2 @@ """Optional default parameters for the request / response. | ||
| """ | ||
| pass | ||
@@ -375,18 +376,20 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| versions: typing.Optional[typing.Iterable[typing.Text]] = ..., | ||
| platform: typing.Text = ..., | ||
| inputs: typing.Optional[ | ||
| typing.Iterable[global___ModelMetadataResponse.TensorMetadata] | ||
| ] = ..., | ||
| outputs: typing.Optional[ | ||
| typing.Iterable[global___ModelMetadataResponse.TensorMetadata] | ||
| ] = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| name: builtins.str = ..., | ||
| versions: collections.abc.Iterable[builtins.str] | None = ..., | ||
| platform: builtins.str = ..., | ||
| inputs: ( | ||
| collections.abc.Iterable[Global___ModelMetadataResponse.TensorMetadata] | ||
| | None | ||
| ) = ..., | ||
| outputs: ( | ||
| collections.abc.Iterable[Global___ModelMetadataResponse.TensorMetadata] | ||
| | None | ||
| ) = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "inputs", | ||
@@ -407,4 +410,5 @@ b"inputs", | ||
| global___ModelMetadataResponse = ModelMetadataResponse | ||
| Global___ModelMetadataResponse: typing_extensions.TypeAlias = ModelMetadataResponse | ||
| @typing.final | ||
| class ModelInferRequest(google.protobuf.message.Message): | ||
@@ -415,28 +419,30 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class InferInputTensor(google.protobuf.message.Message): | ||
| """An input tensor for an inference request.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -449,8 +455,6 @@ | ||
| CONTENTS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The tensor name.""" | ||
| datatype: typing.Text = ... | ||
| datatype: builtins.str | ||
| """The tensor data type.""" | ||
| @property | ||
@@ -463,3 +467,2 @@ def shape( | ||
| """The tensor shape.""" | ||
| pass | ||
@@ -470,9 +473,8 @@ @property | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
| """Optional inference input tensor parameters.""" | ||
| pass | ||
| @property | ||
| def contents(self) -> global___InferTensorContents: | ||
| def contents(self) -> Global___InferTensorContents: | ||
| """The input tensor data. | ||
@@ -482,3 +484,2 @@ This field must not be specified if tensor contents are being specified | ||
| """ | ||
| pass | ||
@@ -488,16 +489,16 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| datatype: typing.Text = ..., | ||
| shape: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| contents: typing.Optional[global___InferTensorContents] = ..., | ||
| name: builtins.str = ..., | ||
| datatype: builtins.str = ..., | ||
| shape: collections.abc.Iterable[builtins.int] | None = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| contents: Global___InferTensorContents | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["contents", b"contents"] | ||
| self, field_name: typing.Literal["contents", b"contents"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "contents", | ||
@@ -516,26 +517,28 @@ b"contents", | ||
| @typing.final | ||
| class InferRequestedOutputTensor(google.protobuf.message.Message): | ||
| """An output tensor requested for an inference request.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -545,5 +548,4 @@ | ||
| PARAMETERS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The tensor name.""" | ||
| @property | ||
@@ -553,6 +555,5 @@ def parameters( | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
| """Optional requested output tensor parameters.""" | ||
| pass | ||
@@ -562,33 +563,32 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| name: builtins.str = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| "name", b"name", "parameters", b"parameters" | ||
| ], | ||
| field_name: typing.Literal["name", b"name", "parameters", b"parameters"], | ||
| ) -> None: ... | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -603,15 +603,12 @@ | ||
| RAW_INPUT_CONTENTS_FIELD_NUMBER: builtins.int | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model to use for inferencing.""" | ||
| model_version: typing.Text = ... | ||
| model_version: builtins.str | ||
| """The version of the model to use for inference. If not given the | ||
| server will choose a version based on the model and internal policy. | ||
| """ | ||
| id: typing.Text = ... | ||
| id: builtins.str | ||
| """Optional identifier for the request. If specified will be | ||
| returned in the response. | ||
| """ | ||
| @property | ||
@@ -621,6 +618,5 @@ def parameters( | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
| """Optional inference parameters.""" | ||
| pass | ||
@@ -631,6 +627,5 @@ @property | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___ModelInferRequest.InferInputTensor | ||
| Global___ModelInferRequest.InferInputTensor | ||
| ]: | ||
| """The input tensors for the inference.""" | ||
| pass | ||
@@ -641,3 +636,3 @@ @property | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___ModelInferRequest.InferRequestedOutputTensor | ||
| Global___ModelInferRequest.InferRequestedOutputTensor | ||
| ]: | ||
@@ -647,3 +642,2 @@ """The requested output tensors for the inference. Optional, if not | ||
| """ | ||
| pass | ||
@@ -674,3 +668,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -680,19 +673,22 @@ def __init__( | ||
| *, | ||
| model_name: typing.Text = ..., | ||
| model_version: typing.Text = ..., | ||
| id: typing.Text = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| inputs: typing.Optional[ | ||
| typing.Iterable[global___ModelInferRequest.InferInputTensor] | ||
| ] = ..., | ||
| outputs: typing.Optional[ | ||
| typing.Iterable[global___ModelInferRequest.InferRequestedOutputTensor] | ||
| ] = ..., | ||
| raw_input_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ..., | ||
| model_name: builtins.str = ..., | ||
| model_version: builtins.str = ..., | ||
| id: builtins.str = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| inputs: ( | ||
| collections.abc.Iterable[Global___ModelInferRequest.InferInputTensor] | None | ||
| ) = ..., | ||
| outputs: ( | ||
| collections.abc.Iterable[ | ||
| Global___ModelInferRequest.InferRequestedOutputTensor | ||
| ] | ||
| | None | ||
| ) = ..., | ||
| raw_input_contents: collections.abc.Iterable[builtins.bytes] | None = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "id", | ||
@@ -715,31 +711,34 @@ b"id", | ||
| global___ModelInferRequest = ModelInferRequest | ||
| Global___ModelInferRequest: typing_extensions.TypeAlias = ModelInferRequest | ||
| @typing.final | ||
| class ModelInferResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class InferOutputTensor(google.protobuf.message.Message): | ||
| """An output tensor returned for an inference request.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -752,8 +751,6 @@ | ||
| CONTENTS_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The tensor name.""" | ||
| datatype: typing.Text = ... | ||
| datatype: builtins.str | ||
| """The tensor data type.""" | ||
| @property | ||
@@ -766,3 +763,2 @@ def shape( | ||
| """The tensor shape.""" | ||
| pass | ||
@@ -773,9 +769,8 @@ @property | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
| """Optional output tensor parameters.""" | ||
| pass | ||
| @property | ||
| def contents(self) -> global___InferTensorContents: | ||
| def contents(self) -> Global___InferTensorContents: | ||
| """The output tensor data. | ||
@@ -785,3 +780,2 @@ This field must not be specified if tensor contents are being specified | ||
| """ | ||
| pass | ||
@@ -791,16 +785,16 @@ def __init__( | ||
| *, | ||
| name: typing.Text = ..., | ||
| datatype: typing.Text = ..., | ||
| shape: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| contents: typing.Optional[global___InferTensorContents] = ..., | ||
| name: builtins.str = ..., | ||
| datatype: builtins.str = ..., | ||
| shape: collections.abc.Iterable[builtins.int] | None = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| contents: Global___InferTensorContents | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["contents", b"contents"] | ||
| self, field_name: typing.Literal["contents", b"contents"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "contents", | ||
@@ -819,21 +813,22 @@ b"contents", | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___InferParameter: ... | ||
| def value(self) -> Global___InferParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___InferParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___InferParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -847,11 +842,8 @@ | ||
| RAW_OUTPUT_CONTENTS_FIELD_NUMBER: builtins.int | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model used for inference.""" | ||
| model_version: typing.Text = ... | ||
| model_version: builtins.str | ||
| """The version of the model used for inference.""" | ||
| id: typing.Text = ... | ||
| id: builtins.str | ||
| """The id of the inference request if one was specified.""" | ||
| @property | ||
@@ -861,6 +853,5 @@ def parameters( | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___InferParameter | ||
| builtins.str, Global___InferParameter | ||
| ]: | ||
| """Optional inference response parameters.""" | ||
| pass | ||
@@ -871,6 +862,5 @@ @property | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___ModelInferResponse.InferOutputTensor | ||
| Global___ModelInferResponse.InferOutputTensor | ||
| ]: | ||
| """The output tensors holding inference results.""" | ||
| pass | ||
@@ -901,3 +891,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -907,16 +896,17 @@ def __init__( | ||
| *, | ||
| model_name: typing.Text = ..., | ||
| model_version: typing.Text = ..., | ||
| id: typing.Text = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___InferParameter] | ||
| ] = ..., | ||
| outputs: typing.Optional[ | ||
| typing.Iterable[global___ModelInferResponse.InferOutputTensor] | ||
| ] = ..., | ||
| raw_output_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ..., | ||
| model_name: builtins.str = ..., | ||
| model_version: builtins.str = ..., | ||
| id: builtins.str = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___InferParameter] | None | ||
| ) = ..., | ||
| outputs: ( | ||
| collections.abc.Iterable[Global___ModelInferResponse.InferOutputTensor] | ||
| | None | ||
| ) = ..., | ||
| raw_output_contents: collections.abc.Iterable[builtins.bytes] | None = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "id", | ||
@@ -937,4 +927,5 @@ b"id", | ||
| global___ModelInferResponse = ModelInferResponse | ||
| Global___ModelInferResponse: typing_extensions.TypeAlias = ModelInferResponse | ||
| @typing.final | ||
| class InferParameter(google.protobuf.message.Message): | ||
@@ -945,15 +936,13 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| BOOL_PARAM_FIELD_NUMBER: builtins.int | ||
| INT64_PARAM_FIELD_NUMBER: builtins.int | ||
| STRING_PARAM_FIELD_NUMBER: builtins.int | ||
| bool_param: builtins.bool = ... | ||
| bool_param: builtins.bool | ||
| """A boolean parameter value.""" | ||
| int64_param: builtins.int = ... | ||
| int64_param: builtins.int | ||
| """An int64 parameter value.""" | ||
| string_param: typing.Text = ... | ||
| string_param: builtins.str | ||
| """A string parameter value.""" | ||
| def __init__( | ||
@@ -964,7 +953,7 @@ self, | ||
| int64_param: builtins.int = ..., | ||
| string_param: typing.Text = ..., | ||
| string_param: builtins.str = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "bool_param", | ||
@@ -982,3 +971,3 @@ b"bool_param", | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "bool_param", | ||
@@ -995,10 +984,8 @@ b"bool_param", | ||
| def WhichOneof( | ||
| self, | ||
| oneof_group: typing_extensions.Literal["parameter_choice", b"parameter_choice"], | ||
| ) -> typing.Optional[ | ||
| typing_extensions.Literal["bool_param", "int64_param", "string_param"] | ||
| ]: ... | ||
| self, oneof_group: typing.Literal["parameter_choice", b"parameter_choice"] | ||
| ) -> typing.Literal["bool_param", "int64_param", "string_param"] | None: ... | ||
| global___InferParameter = InferParameter | ||
| Global___InferParameter: typing_extensions.TypeAlias = InferParameter | ||
| @typing.final | ||
| class InferTensorContents(google.protobuf.message.Message): | ||
@@ -1012,3 +999,4 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| BOOL_CONTENTS_FIELD_NUMBER: builtins.int | ||
@@ -1032,3 +1020,2 @@ INT_CONTENTS_FIELD_NUMBER: builtins.int | ||
| """ | ||
| pass | ||
@@ -1044,3 +1031,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1055,3 +1041,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1067,3 +1052,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1078,3 +1062,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1091,3 +1074,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1104,3 +1086,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1117,3 +1098,2 @@ @property | ||
| """ | ||
| pass | ||
@@ -1123,14 +1103,14 @@ def __init__( | ||
| *, | ||
| bool_contents: typing.Optional[typing.Iterable[builtins.bool]] = ..., | ||
| int_contents: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| int64_contents: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| uint_contents: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| uint64_contents: typing.Optional[typing.Iterable[builtins.int]] = ..., | ||
| fp32_contents: typing.Optional[typing.Iterable[builtins.float]] = ..., | ||
| fp64_contents: typing.Optional[typing.Iterable[builtins.float]] = ..., | ||
| bytes_contents: typing.Optional[typing.Iterable[builtins.bytes]] = ..., | ||
| bool_contents: collections.abc.Iterable[builtins.bool] | None = ..., | ||
| int_contents: collections.abc.Iterable[builtins.int] | None = ..., | ||
| int64_contents: collections.abc.Iterable[builtins.int] | None = ..., | ||
| uint_contents: collections.abc.Iterable[builtins.int] | None = ..., | ||
| uint64_contents: collections.abc.Iterable[builtins.int] | None = ..., | ||
| fp32_contents: collections.abc.Iterable[builtins.float] | None = ..., | ||
| fp64_contents: collections.abc.Iterable[builtins.float] | None = ..., | ||
| bytes_contents: collections.abc.Iterable[builtins.bytes] | None = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "bool_contents", | ||
@@ -1155,4 +1135,5 @@ b"bool_contents", | ||
| global___InferTensorContents = InferTensorContents | ||
| Global___InferTensorContents: typing_extensions.TypeAlias = InferTensorContents | ||
| @typing.final | ||
| class ModelRepositoryParameter(google.protobuf.message.Message): | ||
@@ -1169,3 +1150,4 @@ """ | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| BOOL_PARAM_FIELD_NUMBER: builtins.int | ||
@@ -1175,14 +1157,10 @@ INT64_PARAM_FIELD_NUMBER: builtins.int | ||
| BYTES_PARAM_FIELD_NUMBER: builtins.int | ||
| bool_param: builtins.bool = ... | ||
| bool_param: builtins.bool | ||
| """A boolean parameter value.""" | ||
| int64_param: builtins.int = ... | ||
| int64_param: builtins.int | ||
| """An int64 parameter value.""" | ||
| string_param: typing.Text = ... | ||
| string_param: builtins.str | ||
| """A string parameter value.""" | ||
| bytes_param: builtins.bytes = ... | ||
| bytes_param: builtins.bytes | ||
| """A bytes parameter value.""" | ||
| def __init__( | ||
@@ -1193,3 +1171,3 @@ self, | ||
| int64_param: builtins.int = ..., | ||
| string_param: typing.Text = ..., | ||
| string_param: builtins.str = ..., | ||
| bytes_param: builtins.bytes = ..., | ||
@@ -1199,3 +1177,3 @@ ) -> None: ... | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "bool_param", | ||
@@ -1215,3 +1193,3 @@ b"bool_param", | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "bool_param", | ||
@@ -1230,28 +1208,28 @@ b"bool_param", | ||
| def WhichOneof( | ||
| self, | ||
| oneof_group: typing_extensions.Literal["parameter_choice", b"parameter_choice"], | ||
| ) -> typing.Optional[ | ||
| typing_extensions.Literal[ | ||
| "bool_param", "int64_param", "string_param", "bytes_param" | ||
| ] | ||
| ]: ... | ||
| self, oneof_group: typing.Literal["parameter_choice", b"parameter_choice"] | ||
| ) -> ( | ||
| typing.Literal["bool_param", "int64_param", "string_param", "bytes_param"] | ||
| | None | ||
| ): ... | ||
| global___ModelRepositoryParameter = ModelRepositoryParameter | ||
| Global___ModelRepositoryParameter: typing_extensions.TypeAlias = ( | ||
| ModelRepositoryParameter | ||
| ) | ||
| @typing.final | ||
| class RepositoryIndexRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| REPOSITORY_NAME_FIELD_NUMBER: builtins.int | ||
| READY_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository. If empty the index is returned | ||
| for all repositories. | ||
| """ | ||
| ready: builtins.bool = ... | ||
| ready: builtins.bool | ||
| """If true return only models currently ready for inferencing.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| repository_name: builtins.str = ..., | ||
| ready: builtins.bool = ..., | ||
@@ -1261,3 +1239,3 @@ ) -> None: ... | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "ready", b"ready", "repository_name", b"repository_name" | ||
@@ -1267,11 +1245,14 @@ ], | ||
| global___RepositoryIndexRequest = RepositoryIndexRequest | ||
| Global___RepositoryIndexRequest: typing_extensions.TypeAlias = RepositoryIndexRequest | ||
| @typing.final | ||
| class RepositoryIndexResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ModelIndex(google.protobuf.message.Message): | ||
| """Index entry for a model.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| NAME_FIELD_NUMBER: builtins.int | ||
@@ -1281,25 +1262,21 @@ VERSION_FIELD_NUMBER: builtins.int | ||
| REASON_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The name of the model.""" | ||
| version: typing.Text = ... | ||
| version: builtins.str | ||
| """The version of the model.""" | ||
| state: typing.Text = ... | ||
| state: builtins.str | ||
| """The state of the model.""" | ||
| reason: typing.Text = ... | ||
| reason: builtins.str | ||
| """The reason, if any, that the model is in the given state.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| name: typing.Text = ..., | ||
| version: typing.Text = ..., | ||
| state: typing.Text = ..., | ||
| reason: typing.Text = ..., | ||
| name: builtins.str = ..., | ||
| version: builtins.str = ..., | ||
| state: builtins.str = ..., | ||
| reason: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "name", | ||
@@ -1321,6 +1298,5 @@ b"name", | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___RepositoryIndexResponse.ModelIndex | ||
| Global___RepositoryIndexResponse.ModelIndex | ||
| ]: | ||
| """An index entry for each model.""" | ||
| pass | ||
@@ -1330,34 +1306,34 @@ def __init__( | ||
| *, | ||
| models: typing.Optional[ | ||
| typing.Iterable[global___RepositoryIndexResponse.ModelIndex] | ||
| ] = ..., | ||
| models: ( | ||
| collections.abc.Iterable[Global___RepositoryIndexResponse.ModelIndex] | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, field_name: typing_extensions.Literal["models", b"models"] | ||
| ) -> None: ... | ||
| def ClearField(self, field_name: typing.Literal["models", b"models"]) -> None: ... | ||
| global___RepositoryIndexResponse = RepositoryIndexResponse | ||
| Global___RepositoryIndexResponse: typing_extensions.TypeAlias = RepositoryIndexResponse | ||
| @typing.final | ||
| class RepositoryModelLoadRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___ModelRepositoryParameter: ... | ||
| def value(self) -> Global___ModelRepositoryParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___ModelRepositoryParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___ModelRepositoryParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -1368,10 +1344,8 @@ | ||
| PARAMETERS_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository to load from. If empty the model | ||
| is loaded from any repository. | ||
| """ | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model to load, or reload.""" | ||
| @property | ||
@@ -1381,6 +1355,5 @@ def parameters( | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___ModelRepositoryParameter | ||
| builtins.str, Global___ModelRepositoryParameter | ||
| ]: | ||
| """Optional model repository request parameters.""" | ||
| pass | ||
@@ -1390,11 +1363,12 @@ def __init__( | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| model_name: typing.Text = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___ModelRepositoryParameter] | ||
| ] = ..., | ||
| repository_name: builtins.str = ..., | ||
| model_name: builtins.str = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___ModelRepositoryParameter] | ||
| | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "model_name", | ||
@@ -1409,6 +1383,10 @@ b"model_name", | ||
| global___RepositoryModelLoadRequest = RepositoryModelLoadRequest | ||
| Global___RepositoryModelLoadRequest: typing_extensions.TypeAlias = ( | ||
| RepositoryModelLoadRequest | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelLoadResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -1418,26 +1396,30 @@ self, | ||
| global___RepositoryModelLoadResponse = RepositoryModelLoadResponse | ||
| Global___RepositoryModelLoadResponse: typing_extensions.TypeAlias = ( | ||
| RepositoryModelLoadResponse | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelUnloadRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ParametersEntry(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| KEY_FIELD_NUMBER: builtins.int | ||
| VALUE_FIELD_NUMBER: builtins.int | ||
| key: typing.Text = ... | ||
| key: builtins.str | ||
| @property | ||
| def value(self) -> global___ModelRepositoryParameter: ... | ||
| def value(self) -> Global___ModelRepositoryParameter: ... | ||
| def __init__( | ||
| self, | ||
| *, | ||
| key: typing.Text = ..., | ||
| value: typing.Optional[global___ModelRepositoryParameter] = ..., | ||
| key: builtins.str = ..., | ||
| value: Global___ModelRepositoryParameter | None = ..., | ||
| ) -> None: ... | ||
| def HasField( | ||
| self, field_name: typing_extensions.Literal["value", b"value"] | ||
| self, field_name: typing.Literal["value", b"value"] | ||
| ) -> builtins.bool: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal["key", b"key", "value", b"value"], | ||
| self, field_name: typing.Literal["key", b"key", "value", b"value"] | ||
| ) -> None: ... | ||
@@ -1448,10 +1430,8 @@ | ||
| PARAMETERS_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository from which the model was originally | ||
| loaded. If empty the repository is not considered. | ||
| """ | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model to unload.""" | ||
| @property | ||
@@ -1461,6 +1441,5 @@ def parameters( | ||
| ) -> google.protobuf.internal.containers.MessageMap[ | ||
| typing.Text, global___ModelRepositoryParameter | ||
| builtins.str, Global___ModelRepositoryParameter | ||
| ]: | ||
| """Optional model repository request parameters.""" | ||
| pass | ||
@@ -1470,11 +1449,12 @@ def __init__( | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| model_name: typing.Text = ..., | ||
| parameters: typing.Optional[ | ||
| typing.Mapping[typing.Text, global___ModelRepositoryParameter] | ||
| ] = ..., | ||
| repository_name: builtins.str = ..., | ||
| model_name: builtins.str = ..., | ||
| parameters: ( | ||
| collections.abc.Mapping[builtins.str, Global___ModelRepositoryParameter] | ||
| | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "model_name", | ||
@@ -1489,6 +1469,10 @@ b"model_name", | ||
| global___RepositoryModelUnloadRequest = RepositoryModelUnloadRequest | ||
| Global___RepositoryModelUnloadRequest: typing_extensions.TypeAlias = ( | ||
| RepositoryModelUnloadRequest | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelUnloadResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -1498,2 +1482,4 @@ self, | ||
| global___RepositoryModelUnloadResponse = RepositoryModelUnloadResponse | ||
| Global___RepositoryModelUnloadResponse: typing_extensions.TypeAlias = ( | ||
| RepositoryModelUnloadResponse | ||
| ) |
@@ -7,26 +7,32 @@ """ | ||
| import builtins | ||
| import collections.abc | ||
| import google.protobuf.descriptor | ||
| import google.protobuf.internal.containers | ||
| import google.protobuf.message | ||
| import sys | ||
| import typing | ||
| import typing_extensions | ||
| DESCRIPTOR: google.protobuf.descriptor.FileDescriptor = ... | ||
| if sys.version_info >= (3, 10): | ||
| import typing as typing_extensions | ||
| else: | ||
| import typing_extensions | ||
| DESCRIPTOR: google.protobuf.descriptor.FileDescriptor | ||
| @typing.final | ||
| class RepositoryIndexRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| REPOSITORY_NAME_FIELD_NUMBER: builtins.int | ||
| READY_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository. If empty the index is returned | ||
| for all repositories. | ||
| """ | ||
| ready: builtins.bool = ... | ||
| ready: builtins.bool | ||
| """If true return only models currently ready for inferencing.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| repository_name: builtins.str = ..., | ||
| ready: builtins.bool = ..., | ||
@@ -36,3 +42,3 @@ ) -> None: ... | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "ready", b"ready", "repository_name", b"repository_name" | ||
@@ -42,11 +48,14 @@ ], | ||
| global___RepositoryIndexRequest = RepositoryIndexRequest | ||
| Global___RepositoryIndexRequest: typing_extensions.TypeAlias = RepositoryIndexRequest | ||
| @typing.final | ||
| class RepositoryIndexResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| @typing.final | ||
| class ModelIndex(google.protobuf.message.Message): | ||
| """Index entry for a model.""" | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| NAME_FIELD_NUMBER: builtins.int | ||
@@ -56,25 +65,21 @@ VERSION_FIELD_NUMBER: builtins.int | ||
| REASON_FIELD_NUMBER: builtins.int | ||
| name: typing.Text = ... | ||
| name: builtins.str | ||
| """The name of the model.""" | ||
| version: typing.Text = ... | ||
| version: builtins.str | ||
| """The version of the model.""" | ||
| state: typing.Text = ... | ||
| state: builtins.str | ||
| """The state of the model.""" | ||
| reason: typing.Text = ... | ||
| reason: builtins.str | ||
| """The reason, if any, that the model is in the given state.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| name: typing.Text = ..., | ||
| version: typing.Text = ..., | ||
| state: typing.Text = ..., | ||
| reason: typing.Text = ..., | ||
| name: builtins.str = ..., | ||
| version: builtins.str = ..., | ||
| state: builtins.str = ..., | ||
| reason: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "name", | ||
@@ -96,6 +101,5 @@ b"name", | ||
| ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ | ||
| global___RepositoryIndexResponse.ModelIndex | ||
| Global___RepositoryIndexResponse.ModelIndex | ||
| ]: | ||
| """An index entry for each model.""" | ||
| pass | ||
@@ -105,33 +109,31 @@ def __init__( | ||
| *, | ||
| models: typing.Optional[ | ||
| typing.Iterable[global___RepositoryIndexResponse.ModelIndex] | ||
| ] = ..., | ||
| models: ( | ||
| collections.abc.Iterable[Global___RepositoryIndexResponse.ModelIndex] | None | ||
| ) = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, field_name: typing_extensions.Literal["models", b"models"] | ||
| ) -> None: ... | ||
| def ClearField(self, field_name: typing.Literal["models", b"models"]) -> None: ... | ||
| global___RepositoryIndexResponse = RepositoryIndexResponse | ||
| Global___RepositoryIndexResponse: typing_extensions.TypeAlias = RepositoryIndexResponse | ||
| @typing.final | ||
| class RepositoryModelLoadRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| REPOSITORY_NAME_FIELD_NUMBER: builtins.int | ||
| MODEL_NAME_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository to load from. If empty the model | ||
| is loaded from any repository. | ||
| """ | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model to load, or reload.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| model_name: typing.Text = ..., | ||
| repository_name: builtins.str = ..., | ||
| model_name: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "model_name", b"model_name", "repository_name", b"repository_name" | ||
@@ -141,6 +143,10 @@ ], | ||
| global___RepositoryModelLoadRequest = RepositoryModelLoadRequest | ||
| Global___RepositoryModelLoadRequest: typing_extensions.TypeAlias = ( | ||
| RepositoryModelLoadRequest | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelLoadResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -150,25 +156,27 @@ self, | ||
| global___RepositoryModelLoadResponse = RepositoryModelLoadResponse | ||
| Global___RepositoryModelLoadResponse: typing_extensions.TypeAlias = ( | ||
| RepositoryModelLoadResponse | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelUnloadRequest(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| REPOSITORY_NAME_FIELD_NUMBER: builtins.int | ||
| MODEL_NAME_FIELD_NUMBER: builtins.int | ||
| repository_name: typing.Text = ... | ||
| repository_name: builtins.str | ||
| """The name of the repository from which the model was originally | ||
| loaded. If empty the repository is not considered. | ||
| """ | ||
| model_name: typing.Text = ... | ||
| model_name: builtins.str | ||
| """The name of the model to unload.""" | ||
| def __init__( | ||
| self, | ||
| *, | ||
| repository_name: typing.Text = ..., | ||
| model_name: typing.Text = ..., | ||
| repository_name: builtins.str = ..., | ||
| model_name: builtins.str = ..., | ||
| ) -> None: ... | ||
| def ClearField( | ||
| self, | ||
| field_name: typing_extensions.Literal[ | ||
| field_name: typing.Literal[ | ||
| "model_name", b"model_name", "repository_name", b"repository_name" | ||
@@ -178,6 +186,10 @@ ], | ||
| global___RepositoryModelUnloadRequest = RepositoryModelUnloadRequest | ||
| Global___RepositoryModelUnloadRequest: typing_extensions.TypeAlias = ( | ||
| RepositoryModelUnloadRequest | ||
| ) | ||
| @typing.final | ||
| class RepositoryModelUnloadResponse(google.protobuf.message.Message): | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor = ... | ||
| DESCRIPTOR: google.protobuf.descriptor.Descriptor | ||
| def __init__( | ||
@@ -187,2 +199,4 @@ self, | ||
| global___RepositoryModelUnloadResponse = RepositoryModelUnloadResponse | ||
| Global___RepositoryModelUnloadResponse: typing_extensions.TypeAlias = ( | ||
| RepositoryModelUnloadResponse | ||
| ) |
@@ -34,2 +34,9 @@ import glob | ||
| async def try_remove(filename: str): | ||
| try: | ||
| await remove(filename) | ||
| except FileNotFoundError: | ||
| pass | ||
| async def stop_metrics(settings: Settings, pid: int): | ||
@@ -42,3 +49,4 @@ if not settings.parallel_workers: | ||
| matching_files = glob.glob(pattern) | ||
| await asyncio.gather(*[remove(f) for f in matching_files]) | ||
| if len(matching_files) > 0: | ||
| await asyncio.gather(*[try_remove(f) for f in matching_files]) | ||
@@ -45,0 +53,0 @@ |
@@ -198,3 +198,3 @@ import asyncio | ||
| logger.debug("Starting response processing loop...") | ||
| loop = asyncio.get_event_loop() | ||
| loop = asyncio.get_running_loop() | ||
| while self._active: | ||
@@ -201,0 +201,0 @@ response = await loop.run_in_executor(self._executor, self._responses.get) |
@@ -202,3 +202,3 @@ import asyncio | ||
| "settings. " | ||
| "This field will be removed in MLServer 1.2.0. " | ||
| "This field will be removed in MLServer 1.8.0. " | ||
| "To access the new field, you can either update the " | ||
@@ -205,0 +205,0 @@ "`settings.json` file, or update the `MLSERVER_PARALLEL_WORKERS` " |
@@ -12,3 +12,3 @@ import asyncio | ||
| from ..registry import MultiModelRegistry | ||
| from ..utils import install_uvloop_event_loop, schedule_with_callback | ||
| from ..utils import AsyncManager, schedule_with_callback | ||
| from ..logging import configure_logger | ||
@@ -68,9 +68,8 @@ from ..settings import Settings | ||
| with ctx: | ||
| install_uvloop_event_loop() | ||
| async_mgr = AsyncManager(self._ignore_signals) | ||
| configure_logger(self._settings) | ||
| configure_metrics(self._settings) | ||
| self._ignore_signals() | ||
| asyncio.run(self.coro_run()) | ||
| async_mgr.run(self.coro_run()) | ||
| def _ignore_signals(self): | ||
| def _ignore_signals(self, loop): | ||
| """ | ||
@@ -83,4 +82,2 @@ Uvloop will try to propagate the main process' signals to the | ||
| """ | ||
| loop = asyncio.get_event_loop() | ||
| for sign in IGNORED_SIGNALS: | ||
@@ -100,3 +97,3 @@ # Ensure that signal handlers are a no-op, to let the main process | ||
| self.__inner_init__() | ||
| loop = asyncio.get_event_loop() | ||
| loop = asyncio.get_running_loop() | ||
| while self._active: | ||
@@ -103,0 +100,0 @@ readable = await loop.run_in_executor(self._executor, self._select) |
@@ -32,3 +32,3 @@ from typing import Callable | ||
| response_class=Response, | ||
| **kwargs | ||
| **kwargs, | ||
| ): | ||
@@ -40,3 +40,3 @@ super().__init__( | ||
| response_class=Response, | ||
| **kwargs | ||
| **kwargs, | ||
| ) | ||
@@ -43,0 +43,0 @@ |
@@ -169,3 +169,3 @@ import asyncio | ||
| def _add_signal_handlers(self): | ||
| loop = asyncio.get_event_loop() | ||
| loop = asyncio.get_running_loop() | ||
@@ -172,0 +172,0 @@ for sig in HANDLED_SIGNALS: |
@@ -168,3 +168,3 @@ import sys | ||
| debug: bool = True | ||
| debug: bool = False | ||
@@ -444,3 +444,3 @@ parallel_workers: int = DEFAULT_PARALLEL_WORKERS | ||
| parallel_workers: Optional[int] = Field( | ||
| None, | ||
| default=None, | ||
| deprecated=True, | ||
@@ -447,0 +447,0 @@ description=( |
+183
-30
@@ -0,8 +1,19 @@ | ||
| # mypy: disable-error-code="call-arg,attr-defined" | ||
| # | ||
| # The typechecking exceptions referenced above are needed because code in this file | ||
| # dynamically considers different python versions, and some called functions are | ||
| # deprecated or take different arguments across versions. | ||
| import os | ||
| import sys | ||
| import uuid | ||
| import asyncio | ||
| from enum import Enum | ||
| from typing import cast | ||
| import warnings | ||
| import urllib.parse | ||
| from asyncio import Task | ||
| from typing import Callable, Dict, Optional, List | ||
| from typing import Any, Optional, TypeVar | ||
| from collections.abc import Callable, Coroutine | ||
@@ -14,5 +25,173 @@ from .logging import logger | ||
| _CoroRetT = TypeVar("_CoroRetT") | ||
| EventLoopSignalHandleConfigFn = Callable[[asyncio.AbstractEventLoop], None] | ||
| _RUN_IN_LOOP_ERROR = ( | ||
| "AsyncManager::run() cannot be called from within an existing event loop" | ||
| ) | ||
| class EventLoopBackend(Enum): | ||
| ASYNCIO_DEFAULT = 1 | ||
| UVLOOP = 2 | ||
| class AsyncManager: | ||
| def __init__(self, signal_handle_config_fn=None): | ||
| self._event_loop_backend = EventLoopBackend.ASYNCIO_DEFAULT | ||
| self._signal_handle_config_fn = signal_handle_config_fn | ||
| try: | ||
| import uvloop | ||
| self._event_loop_backend = EventLoopBackend.UVLOOP | ||
| self._async_run_fn = uvloop.run | ||
| except ImportError: | ||
| # else keep the standard asyncio loop as a fallback | ||
| self._async_run_fn = asyncio.run | ||
| logger.warning( | ||
| "uvloop not available, falling back on default asyncio runner" | ||
| ) | ||
| def _loop_factory(self) -> asyncio.AbstractEventLoop: | ||
| new_loop: asyncio.AbstractEventLoop | ||
| if self._event_loop_backend == EventLoopBackend.UVLOOP: | ||
| import uvloop | ||
| new_loop = uvloop.new_event_loop() | ||
| else: | ||
| new_loop = asyncio.new_event_loop() | ||
| if self._signal_handle_config_fn is not None: | ||
| self._signal_handle_config_fn(new_loop) | ||
| return new_loop | ||
| @property | ||
| def event_loop_backend(self) -> EventLoopBackend: | ||
| return self._event_loop_backend | ||
| @property | ||
| def event_loop_policy(self) -> asyncio.AbstractEventLoopPolicy: | ||
| """ | ||
| In python versions < 3.16, return the event loop policy. | ||
| It prefers the policy returned by uvloop where available. | ||
| Deprecated from python 3.12, but used within pytest tests until pytest-async | ||
| itself provides an alternative way to manage event loops across different | ||
| python versions. | ||
| """ | ||
| python_version_info = sys.version_info[:2] | ||
| if python_version_info >= (3, 12): | ||
| warnings.warn( | ||
| "AsyncManager::event_loop_policy is deprecated since Python 3.12.", | ||
| DeprecationWarning, | ||
| stacklevel=1, | ||
| ) | ||
| if python_version_info >= (3, 16): | ||
| raise RuntimeError("EventLoopPolicy no loger supported in Python >=3.16") | ||
| if self._event_loop_backend == EventLoopBackend.UVLOOP: | ||
| import uvloop | ||
| return uvloop.EventLoopPolicy() | ||
| else: | ||
| return cast(asyncio.AbstractEventLoopPolicy, asyncio.DefaultEventLoopPolicy) | ||
| def run( | ||
| self, coro: Coroutine[Any, Any, _CoroRetT], *, debug: Optional[bool] = None | ||
| ) -> _CoroRetT: | ||
| """ | ||
| Run a coroutine in a new event loop, and close the loop afterwards. | ||
| Equivalent to asyncio.run(...) but with custom behaviour: | ||
| - The event loop created during the run call is backed by uvloop when | ||
| available, and falls back on standard the default asyncio implementation | ||
| otherwise. | ||
| - At the time of initialising the AsyncManager object, the resulting | ||
| loop can also be configured with custom handlers for os signals | ||
| (i.e SIGINT). | ||
| This function is compatible with different python versions from 3.9 to 3.16, | ||
| and papers over the differences in deprecated functions across these | ||
| versions. | ||
| """ | ||
| if self._event_loop_backend == EventLoopBackend.UVLOOP: | ||
| # uvloop handles differences between python versions internally | ||
| return self._async_run_fn(coro, loop_factory=self._loop_factory) | ||
| python_version_info = sys.version_info[:2] | ||
| if python_version_info < (3, 11): | ||
| try: | ||
| asyncio.get_running_loop() | ||
| raise RuntimeError(_RUN_IN_LOOP_ERROR) | ||
| except RuntimeError: | ||
| pass | ||
| if not asyncio.iscoroutine(coro): | ||
| raise ValueError(f"expected coroutine, got {coro!r}") | ||
| loop = self._loop_factory() | ||
| try: | ||
| asyncio.set_event_loop(loop) | ||
| if debug is not None: | ||
| loop.set_debug(debug) | ||
| return loop.run_until_complete(coro) | ||
| finally: | ||
| try: | ||
| _cancel_all_tasks(loop) | ||
| loop.run_until_complete(loop.shutdown_asyncgens()) | ||
| if hasattr(loop, "shutdown_default_executor"): | ||
| loop.run_until_complete(loop.shutdown_default_executor()) | ||
| finally: | ||
| asyncio.set_event_loop(None) | ||
| loop.close() | ||
| elif python_version_info == (3, 11): | ||
| try: | ||
| asyncio.get_running_loop() | ||
| raise RuntimeError(_RUN_IN_LOOP_ERROR) | ||
| except RuntimeError: | ||
| pass | ||
| with asyncio.Runner( | ||
| loop_factory=self._loop_factory, | ||
| debug=debug, | ||
| ) as runner: | ||
| return runner.run(coro) | ||
| else: | ||
| assert python_version_info > (3, 11) | ||
| # From python 3.12 onwards, asyncio.run() accepts a loop_factory argument | ||
| return asyncio.run( | ||
| coro, | ||
| debug=debug, | ||
| loop_factory=self._loop_factory, | ||
| ) | ||
| def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None: | ||
| # Copied from python/cpython | ||
| to_cancel = asyncio.all_tasks(loop) | ||
| if not to_cancel: | ||
| return | ||
| for task in to_cancel: | ||
| task.cancel() | ||
| loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) | ||
| for task in to_cancel: | ||
| if task.cancelled(): | ||
| continue | ||
| if task.exception() is not None: | ||
| loop.call_exception_handler( | ||
| { | ||
| "message": "unhandled exception during asyncio.run() shutdown", | ||
| "exception": task.exception(), | ||
| "task": task, | ||
| } | ||
| ) | ||
| async def get_model_uri( | ||
| settings: ModelSettings, wellknown_filenames: List[str] = [] | ||
| settings: ModelSettings, wellknown_filenames: list[str] = [] | ||
| ) -> str: | ||
@@ -72,3 +251,3 @@ if not settings.parameters: | ||
| def insert_headers( | ||
| inference_request: InferenceRequest, headers: Dict[str, str] | ||
| inference_request: InferenceRequest, headers: dict[str, str] | ||
| ) -> InferenceRequest: | ||
@@ -96,3 +275,3 @@ # Ensure parameters are present | ||
| def extract_headers(inference_response: InferenceResponse) -> Optional[Dict[str, str]]: | ||
| def extract_headers(inference_response: InferenceResponse) -> Optional[dict[str, str]]: | ||
| if inference_response.parameters is None: | ||
@@ -110,28 +289,2 @@ return None | ||
| def _check_current_event_loop_policy() -> str: | ||
| policy = ( | ||
| "uvloop" | ||
| if type(asyncio.get_event_loop_policy()).__module__.startswith("uvloop") | ||
| else "asyncio" | ||
| ) | ||
| return policy | ||
| def install_uvloop_event_loop(): | ||
| if "uvloop" == _check_current_event_loop_policy(): | ||
| return | ||
| try: | ||
| import uvloop | ||
| uvloop.install() | ||
| except ImportError: | ||
| # else keep the standard asyncio loop as a fallback | ||
| pass | ||
| policy = _check_current_event_loop_policy() | ||
| logger.debug(f"Using asyncio event-loop policy: {policy}") | ||
| def schedule_with_callback(coro, cb) -> Task: | ||
@@ -138,0 +291,0 @@ task = asyncio.create_task(coro) |
@@ -1,1 +0,1 @@ | ||
| __version__ = "1.7.1" | ||
| __version__ = "1.7.2-rc1" |
+11
-16
@@ -1,21 +0,16 @@ | ||
| Metadata-Version: 2.3 | ||
| Metadata-Version: 2.4 | ||
| Name: mlserver | ||
| Version: 1.7.1 | ||
| Version: 1.7.2rc1 | ||
| Summary: MLServer | ||
| License: Apache-2.0 | ||
| License-Expression: Apache-2.0 | ||
| License-File: LICENSE | ||
| Author: Seldon Technologies Ltd. | ||
| Author-email: hello@seldon.io | ||
| Requires-Python: >=3.9,<3.13 | ||
| Classifier: License :: OSI Approved :: Apache Software License | ||
| Classifier: Operating System :: POSIX | ||
| Classifier: Operating System :: MacOS | ||
| Classifier: Operating System :: POSIX | ||
| Classifier: Programming Language :: Python :: 3 | ||
| Classifier: Programming Language :: Python :: 3.9 | ||
| Classifier: Programming Language :: Python :: 3.10 | ||
| Classifier: Programming Language :: Python :: 3.11 | ||
| Classifier: Programming Language :: Python :: 3.12 | ||
| Requires-Dist: aiofiles | ||
| Requires-Dist: aiokafka | ||
| Requires-Dist: click | ||
| Requires-Dist: fastapi (>=0.88.0,!=0.89.0,<0.116.0) | ||
| Requires-Dist: fastapi (>=0.88.0,!=0.89.0,<0.125.0) | ||
| Requires-Dist: gevent | ||
@@ -30,5 +25,5 @@ Requires-Dist: geventhttpclient | ||
| Requires-Dist: opentelemetry-sdk (>=1.22.0,<2.0.0) | ||
| Requires-Dist: orjson | ||
| Requires-Dist: orjson (>=3.10,<4) | ||
| Requires-Dist: pandas | ||
| Requires-Dist: protobuf (>=5.27.2,<7.0.0) | ||
| Requires-Dist: protobuf (>=5.29.5,<7.0.0) | ||
| Requires-Dist: py-grpc-prometheus | ||
@@ -40,5 +35,5 @@ Requires-Dist: pydantic (>=2.7.1,<3.0.0) | ||
| Requires-Dist: starlette-exporter | ||
| Requires-Dist: tritonclient[http] (>=2.42) | ||
| Requires-Dist: uvicorn | ||
| Requires-Dist: uvloop ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" | ||
| Requires-Dist: tritonclient[http] (>=2.63) | ||
| Requires-Dist: uvicorn (>=0.38.0) | ||
| Requires-Dist: uvloop (>=0.22.1,<0.24) ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" | ||
| Description-Content-Type: text/markdown | ||
@@ -45,0 +40,0 @@ |
+65
-52
@@ -1,8 +0,10 @@ | ||
| [tool.poetry] | ||
| [project] | ||
| name = "mlserver" | ||
| version = "1.7.1" | ||
| version = "1.7.2-rc1" | ||
| description = "MLServer" | ||
| authors = ["Seldon Technologies Ltd. <hello@seldon.io>"] | ||
| authors = [ | ||
| {name = "Seldon Technologies Ltd.", email="hello@seldon.io"}] | ||
| license = "Apache-2.0" | ||
| readme = "README.md" | ||
| requires-python = ">=3.9,<3.13" | ||
| classifiers = [ | ||
@@ -13,4 +15,32 @@ "Operating System :: POSIX", | ||
| include = ["mlserver/rest/openapi/*.json"] | ||
| dependencies = [ | ||
| "click", | ||
| "fastapi>=0.88.0,!=0.89.0,<0.125.0", | ||
| "python-dotenv", | ||
| "grpcio>=1.67.1", | ||
| "numpy", | ||
| "pandas", | ||
| "protobuf>=5.29.5,<7.0.0", | ||
| "uvicorn>=0.38.0", | ||
| "starlette-exporter", | ||
| "py-grpc-prometheus", | ||
| "aiokafka", | ||
| "tritonclient[http]>=2.63", | ||
| "geventhttpclient", | ||
| "gevent", | ||
| "aiofiles", | ||
| "orjson>=3.10,<4", | ||
| "uvloop>=0.22.1,<0.24; sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')", | ||
| "pydantic>=2.7.1,<3.0.0", | ||
| "pydantic-settings>=2.3.0,<3.0.0", | ||
| "python-multipart", | ||
| # Required for Python <3.10 to access data files at runtime | ||
| "importlib-resources>=5.12,<7.0", | ||
| "opentelemetry-sdk>=1.22.0,<2.0.0", | ||
| "opentelemetry-instrumentation-fastapi>=0.43b0", | ||
| "opentelemetry-instrumentation-grpc>=0.43b0", | ||
| "opentelemetry-exporter-otlp-proto-grpc>=1.22.0,<2.0.0", | ||
| ] | ||
| [tool.poetry.scripts] | ||
| [project.scripts] | ||
| mlserver = 'mlserver.cli:main' | ||
@@ -45,38 +75,7 @@ | ||
| addopts = "--import-mode=importlib" | ||
| norecursedirs = [ | ||
| "runtimes"] | ||
| [tool.poetry.dependencies] | ||
| python = ">=3.9,<3.13" | ||
| click = "*" | ||
| fastapi = ">=0.88.0,!=0.89.0,<0.116.0" | ||
| python-dotenv = "*" | ||
| grpcio = ">=1.67.1" | ||
| numpy = "*" | ||
| pandas = "*" | ||
| protobuf = ">=5.27.2,<7.0.0" | ||
| uvicorn = "*" | ||
| starlette-exporter = "*" | ||
| py-grpc-prometheus = "*" | ||
| aiokafka = "*" | ||
| # add a min version to tritonclient due to https://github.com/triton-inference-server/server/issues/6246 | ||
| tritonclient = {version = ">=2.42", extras = ["http"]} | ||
| geventhttpclient = "*" | ||
| gevent = "*" | ||
| aiofiles = "*" | ||
| orjson = "*" | ||
| uvloop = {version = "*", markers = "sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')"} | ||
| pydantic = "^2.7.1" | ||
| pydantic-settings = "^2.3.0" | ||
| python-multipart = "*" | ||
| ## The importlib-resources backport is required to use some | ||
| ## functionality added in Python 3.10 | ||
| ## https://setuptools.pypa.io/en/latest/userguide/datafiles.html#accessing-data-files-at-runtime | ||
| importlib-resources = ">=5.12,<7.0" | ||
| opentelemetry-sdk = "^1.22.0" | ||
| opentelemetry-instrumentation-fastapi = ">=0.43b0" | ||
| opentelemetry-instrumentation-grpc = ">=0.43b0" | ||
| opentelemetry-exporter-otlp-proto-grpc = "^1.22.0" | ||
| [tool.poetry.group.test.dependencies] | ||
| tox = "4.16.0" | ||
| tox = "4.24.2" | ||
@@ -86,14 +85,14 @@ [tool.poetry.group.dev.dependencies] | ||
| grpcio-tools = ">=1.67.1" | ||
| pytest = "7.4.4" | ||
| pytest-asyncio = "0.21.1" | ||
| pytest-mock = "3.12.0" | ||
| pytest-cases = "3.8.5" | ||
| pytest-lazy-fixture = "^0.6.3" | ||
| tox = "4.16.0" | ||
| pytest = "8.4.2" | ||
| exceptiongroup = "1.3.0" | ||
| pytest-asyncio = "1.2.0" | ||
| pytest-mock = "3.15.1" | ||
| pytest-cases = "3.9.1" | ||
| tox = "4.24.2" | ||
| docker = "7.1.0" | ||
| aiohttp = "3.12.8" | ||
| aiohttp-retry = "2.8.3" | ||
| aiohttp = "3.12.14" | ||
| aiohttp-retry = "2.9.1" | ||
| ## Used for FastAPI Async testing | ||
| httpx = "0.27.0" | ||
| kafka-python-ng = "2.2.3" | ||
| kafka-python = "2.2.15" | ||
| tenacity = "8.4.1" | ||
@@ -103,5 +102,5 @@ pyyaml = "6.0.1" | ||
| flake8 = "7.0.0" | ||
| flake8-black = "0.3.6" | ||
| mypy = "1.11.2" | ||
| mypy-protobuf = "3.1.0" | ||
| flake8-black = "0.4.0" | ||
| mypy = "1.18.1" | ||
| mypy-protobuf = "3.7.0" | ||
| types-protobuf = "5.26.0.20240422" | ||
@@ -111,3 +110,3 @@ types-orjson = "3.6.2" | ||
| types-requests = "2.32.0.20250602" | ||
| black = "24.8.0" | ||
| black = "24.10.0" | ||
| pip-licenses = "4.4.0" | ||
@@ -134,2 +133,16 @@ pytest-xdist = "3.6.1" | ||
| [tool.poetry.group.test-all-runtimes] | ||
| optional = true | ||
| [tool.poetry.group.test-all-runtimes.dependencies] | ||
| mlserver-sklearn = {path = "./runtimes/sklearn", develop = false} | ||
| mlserver-xgboost = {path = "./runtimes/xgboost", develop = false} | ||
| mlserver-lightgbm = {path = "./runtimes/lightgbm", develop = false} | ||
| mlserver-mlflow = {path = "./runtimes/mlflow", develop = false} | ||
| mlserver-huggingface = {path = "./runtimes/huggingface", develop = false} | ||
| mlserver-alibi-explain = {path = "./runtimes/alibi-explain", develop = false} | ||
| mlserver-alibi-detect = {path = "./runtimes/alibi-detect", develop = false} | ||
| mlserver-catboost = {path = "./runtimes/catboost", develop = false} | ||
| [tool.poetry.group.all-runtimes-dev] | ||
@@ -148,3 +161,3 @@ optional = true | ||
| torchvision = "0.19.1" | ||
| mlflow = "2.19.0" | ||
| mlflow = ">=3.0.0" | ||
@@ -151,0 +164,0 @@ ## Dev dependencies from HuggingFace |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
483475
1.47%11720
1.48%