diff --git a/learnware/client/container.py b/learnware/client/container.py index ea0db11..e89dd32 100644 --- a/learnware/client/container.py +++ b/learnware/client/container.py @@ -520,6 +520,7 @@ class LearnwaresContainer: assert self.mode in {"conda", "docker"}, f"mode must be in ['conda', 'docker'], should not be {self.mode}" self.learnware_list = learnwares self.cleanup = cleanup + self.ignore_error = ignore_error def __enter__(self): if self.mode == "conda": @@ -549,7 +550,7 @@ class LearnwaresContainer: model_list = [_learnware.get_model() for _learnware in self.learnware_containers] with ThreadPoolExecutor(max_workers=max(os.cpu_count() // 2, 1)) as executor: - results = executor.map(self._initialize_model_container, model_list) + results = executor.map(self._initialize_model_container, model_list, [self.ignore_error]*len(model_list)) self.results = list(results) if sum(self.results) < len(self.learnware_list): @@ -568,7 +569,7 @@ class LearnwaresContainer: model_list = [_learnware.get_model() for _learnware in self.learnware_containers] with ThreadPoolExecutor(max_workers=max(os.cpu_count() // 2, 1)) as executor: - executor.map(self._destroy_model_container, model_list) + executor.map(self._destroy_model_container, model_list, [self.ignore_error]*len(model_list)) self.learnware_containers = None self.results = None @@ -577,20 +578,24 @@ class LearnwaresContainer: ModelDockerContainer._destroy_docker_container(self._docker_container) @staticmethod - def _initialize_model_container(model: ModelCondaContainer): + def _initialize_model_container(model: ModelCondaContainer, ignore_error=True): try: model.init_and_setup_env() except Exception as err: - logger.error(f"build env {model.conda_env} failed due to {err}") + if not ignore_error: + raise err + logger.warning(f"build env {model.conda_env} failed due to {err}") return False return True @staticmethod - def _destroy_model_container(model: ModelCondaContainer): + def _destroy_model_container(model: ModelCondaContainer, ignore_error=True): try: model.remove_env() except Exception as err: - logger.error(f"remove env {model.conda_env} failed due to {err}") + if not ignore_error: + raise err + logger.warning(f"remove env {model.conda_env} failed due to {err}") return False return True diff --git a/learnware/client/utils.py b/learnware/client/utils.py index fff1475..0c776f5 100644 --- a/learnware/client/utils.py +++ b/learnware/client/utils.py @@ -14,7 +14,7 @@ def system_execute(args, timeout=None): try: com_process.check_returncode() except subprocess.CalledProcessError as err: - logger.error(f"System Execute Error: {com_process.stderr.decode()}") + logger.warning(f"System Execute Error: {com_process.stderr.decode()}") raise err diff --git a/learnware/market/classes.py b/learnware/market/classes.py index 8fa9ab7..deee3d8 100644 --- a/learnware/market/classes.py +++ b/learnware/market/classes.py @@ -12,11 +12,11 @@ class CondaChecker(BaseChecker): super(CondaChecker, self).__init__(**kwargs) def __call__(self, learnware: Learnware) -> int: - with LearnwaresContainer(learnware) as env_container: - if not all(env_container.get_learnware_flags()): - logger.warning(f"Conda Checker failed due to installed learnware failed") - return BaseChecker.INVALID_LEARNWARE - learnwares = env_container.get_learnwares_with_container() - check_status = self.inner_checker(learnwares[0]) - + try: + with LearnwaresContainer(learnware, ignore_error=False) as env_container: + learnwares = env_container.get_learnwares_with_container() + check_status = self.inner_checker(learnwares[0]) + except Exception as e: + logger.warning(f"Conda Checker failed due to installed learnware failed and {e}") + return BaseChecker.INVALID_LEARNWARE return check_status