diff --git a/mlem/contrib/docker/base.py b/mlem/contrib/docker/base.py index 538607c0..f31f7613 100644 --- a/mlem/contrib/docker/base.py +++ b/mlem/contrib/docker/base.py @@ -495,6 +495,9 @@ def run_container( "The container died unexpectedly.", log ) else: + state.container_id = None + state.container_name = None + self.update_state(state) # Can't get logs from removed container raise DeploymentError( "The container died unexpectedly. Try to run the container " diff --git a/mlem/contrib/fastapi.py b/mlem/contrib/fastapi.py index f52de474..09a628fb 100644 --- a/mlem/contrib/fastapi.py +++ b/mlem/contrib/fastapi.py @@ -18,7 +18,7 @@ from starlette.responses import JSONResponse, Response, StreamingResponse from mlem.core.data_type import DataTypeSerializer -from mlem.core.requirements import LibRequirementsMixin +from mlem.core.requirements import LibRequirementsMixin, Requirements from mlem.runtime.interface import ( Interface, InterfaceArgument, @@ -26,6 +26,7 @@ ) from mlem.runtime.server import Server from mlem.ui import EMOJI_NAILS, echo +from mlem.utils.module import get_object_requirements logger = logging.getLogger(__name__) @@ -203,6 +204,11 @@ def serve(self, interface: Interface): echo(f"Checkout openapi docs at ") uvicorn.run(app, host=self.host, port=self.port) + def get_requirements(self) -> Requirements: + return super().get_requirements() + get_object_requirements( + [self.request_serializer, self.response_serializer, self.methods] + ) + class _SpooledFileIOWrapper: """https://stackoverflow.com/questions/47160211/why-doesnt-tempfile-spooledtemporaryfile-implement-readable-writable-seekable diff --git a/mlem/core/base.py b/mlem/core/base.py index 16be110e..109c0449 100644 --- a/mlem/core/base.py +++ b/mlem/core/base.py @@ -1,4 +1,5 @@ import shlex +import sys from collections import defaultdict from inspect import isabstract from typing import ( @@ -43,6 +44,7 @@ def load_impl_ext( ... +# pylint: disable=too-many-branches def load_impl_ext( abs_name: str, type_name: Optional[str], raise_on_missing: bool = True ) -> Optional[Type["MlemABC"]]: @@ -62,12 +64,18 @@ def load_impl_ext( if type_name is not None and "." in type_name: try: + # this is needed because if run from cli curdir is not checked for + # modules to import + sys.path.append(".") + obj = import_string(type_name) if not issubclass(obj, MlemABC): raise ValueError(f"{obj} is not subclass of MlemABC") return obj except ImportError: pass + finally: + sys.path.remove(".") eps = load_entrypoints() for ep in eps.values():