From 3d0ca966dfd074dee96980669df49f20c9476906 Mon Sep 17 00:00:00 2001 From: Gene Date: Thu, 12 Oct 2023 16:50:01 +0800 Subject: [PATCH 1/4] [MNT] add test download --- tests/test_client/test_download.py | 33 +++++++++++++++ .../test_learnware.py} | 0 tests/test_client/test_reuse.py | 42 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 tests/test_client/test_download.py rename tests/{test_learnware_upload/test_upload.py => test_client/test_learnware.py} (100%) create mode 100644 tests/test_client/test_reuse.py diff --git a/tests/test_client/test_download.py b/tests/test_client/test_download.py new file mode 100644 index 0000000..5dba8ae --- /dev/null +++ b/tests/test_client/test_download.py @@ -0,0 +1,33 @@ +import os +import numpy as np + +import learnware +from learnware.client import LearnwareClient +from learnware.client.container import ModelEnvContainer, LearnwaresContainer +from learnware.learnware.reuse import AveragingReuser + + +if __name__ == "__main__": + email = "liujd@lamda.nju.edu.cn" + token = "f7e647146a314c6e8b4e2e1079c4bca4" + + client = LearnwareClient() + client.login(email, token) + + learnware_ids = ["00000084", "00000154", "00000155"] + zip_paths = ["1.zip", "2.zip", "3.zip"] + root = os.path.dirname(__file__) + for i in range(len(learnware_ids)): + zip_paths[i] = os.path.join(root, zip_paths[i]) + client.download_learnware(learnware_ids[i], zip_paths[i]) + + learnware_list = [client.load_learnware(file, load_model=False) for file in zip_paths] + + with LearnwaresContainer(learnware_list, zip_paths) as env_container: + learnware_list = env_container.get_learnware_list_with_container() + reuser = AveragingReuser(learnware_list, mode="vote_by_label") + input_array = np.random.random(size=(20, 13)) + print(reuser.predict(input_array)) + + for idx, learnware in enumerate(learnware_list): + print(f"learnware_{idx}", reuser.predict(learnware)) \ No newline at end of file diff --git a/tests/test_learnware_upload/test_upload.py b/tests/test_client/test_learnware.py similarity index 100% rename from tests/test_learnware_upload/test_upload.py rename to tests/test_client/test_learnware.py diff --git a/tests/test_client/test_reuse.py b/tests/test_client/test_reuse.py new file mode 100644 index 0000000..699a138 --- /dev/null +++ b/tests/test_client/test_reuse.py @@ -0,0 +1,42 @@ +import zipfile +import numpy as np + +from learnware.learnware import get_learnware_from_dirpath, Learnware +from learnware.market import EasyMarket +from learnware.client.container import ModelEnvContainer, LearnwaresContainer +from learnware.learnware.reuse import AveragingReuser + +if __name__ == "__main__": + semantic_specification = dict() + semantic_specification["Data"] = {"Type": "Class", "Values": ["Text"]} + semantic_specification["Task"] = {"Type": "Class", "Values": ["Ranking"]} + semantic_specification["Library"] = {"Type": "Class", "Values": ["Scikit-learn"]} + semantic_specification["Scenario"] = {"Type": "Tag", "Values": "Financial"} + semantic_specification["Name"] = {"Type": "String", "Values": "test"} + semantic_specification["Description"] = {"Type": "String", "Values": "test"} + + zip_paths = [ + "/home/bixd/workspace/learnware/Learnware/tests/test_learnware_client/rf_tic.zip", + "/home/bixd/workspace/learnware/Learnware/tests/test_learnware_client/svc_tic.zip", + ] + dir_paths = [ + "/home/bixd/workspace/learnware/Learnware/tests/test_learnware_client/rf_tic", + "/home/bixd/workspace/learnware/Learnware/tests/test_learnware_client/svc_tic", + ] + + learnware_list = [] + for id, (zip_path, dir_path) in enumerate(zip(zip_paths, dir_paths)): + with zipfile.ZipFile(zip_path, "r") as z_file: + z_file.extractall(dir_path) + + learnware = get_learnware_from_dirpath(f"test_id{id}", semantic_specification, dir_path) + learnware_list.append(learnware) + + with LearnwaresContainer(learnware_list, zip_paths) as env_container: + + learnware_list = env_container.get_learnware_list_with_container() + reuser = AveragingReuser(learnware_list, mode="vote") + input_array = np.random.randint(0, 3, size=(20, 9)) + print(reuser.predict(input_array).argmax(axis=1)) + for id, ind_learner in enumerate(learnware_list): + print(f"learner_{id}", reuser.predict(input_array).argmax(axis=1)) From b5713a6a4449ec4fca7ab5541436e364e12a28c3 Mon Sep 17 00:00:00 2001 From: Gene Date: Thu, 12 Oct 2023 21:52:41 +0800 Subject: [PATCH 2/4] [FIX] fix bugs about virtual env --- learnware/client/learnware_client.py | 4 ++-- learnware/client/utils.py | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/learnware/client/learnware_client.py b/learnware/client/learnware_client.py index 723267f..3ec9bcf 100644 --- a/learnware/client/learnware_client.py +++ b/learnware/client/learnware_client.py @@ -388,9 +388,9 @@ class LearnwareClient: package_utils.filter_nonexist_pip_packages_file(requirements_path, requirements_path_filter) if conda_env is not None: - self.system(f"conda create --name {conda_env}") + self.system(f"conda create -y --name {conda_env} python=3.8") self.system( - f"conda run --no-capture-output python3 -m pip install -r {requirements_path_filter}" + f"conda run --name {conda_env} --no-capture-output python3 -m pip install -r {requirements_path_filter}" ) else: self.system(f"python3 -m pip install -r {requirements_path_filter}") diff --git a/learnware/client/utils.py b/learnware/client/utils.py index b6d9c8a..4639c3b 100644 --- a/learnware/client/utils.py +++ b/learnware/client/utils.py @@ -61,12 +61,14 @@ def install_environment(zip_path, conda_env): requirements_file=requirements_path, output_file=requirements_path_filter ) logger.info(f"create empty conda env [{conda_env}]") - system_execute(args=["conda", "create", "--name", f"{conda_env}", "python=3.8"]) + system_execute(args=["conda", "create", "-y", "--name", f"{conda_env}", "python=3.8"]) logger.info(f"install pip requirements for conda env [{conda_env}]") system_execute( args=[ "conda", "run", + "-n", + f"{conda_env}", "--no-capture-output", "python3", "-m", @@ -80,4 +82,4 @@ def install_environment(zip_path, conda_env): raise Exception("Environment.yaml or requirements.txt not found in the learnware zip file.") logger.info(f"install learnware package for conda env [{conda_env}]") - system_execute(args=["conda", "run", "--no-capture-output", "python3", "-m", "pip", "install", "learnware"]) + system_execute(args=["conda", "run", "-n", f"{conda_env}", "--no-capture-output", "python3", "-m", "pip", "install", "learnware"]) From 3e1d1997c0acb44079b2f54034937e02718cba7d Mon Sep 17 00:00:00 2001 From: Gene Date: Thu, 12 Oct 2023 23:34:28 +0800 Subject: [PATCH 3/4] [FIX] fix bugs in LearnwareClient --- learnware/client/container.py | 2 +- learnware/client/learnware_client.py | 5 +-- tests/test_client/test_download.py | 55 +++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/learnware/client/container.py b/learnware/client/container.py index 15236b0..8e7573a 100644 --- a/learnware/client/container.py +++ b/learnware/client/container.py @@ -31,7 +31,7 @@ class ModelEnvContainer(BaseModel): with open(model_path, "wb") as model_fp: pickle.dump(self.model_config, model_fp) - + system_execute( [ "conda", diff --git a/learnware/client/learnware_client.py b/learnware/client/learnware_client.py index 3ec9bcf..1c6cfed 100644 --- a/learnware/client/learnware_client.py +++ b/learnware/client/learnware_client.py @@ -337,11 +337,8 @@ class LearnwareClient: if load_model: learnware_obj.instantiate_model() - pass - + return learnware_obj - pass - pass def system(self, command): retcd = os.system(command) diff --git a/tests/test_client/test_download.py b/tests/test_client/test_download.py index 5dba8ae..7314ac8 100644 --- a/tests/test_client/test_download.py +++ b/tests/test_client/test_download.py @@ -1,12 +1,55 @@ import os +import zipfile import numpy as np import learnware +from learnware.learnware import get_learnware_from_dirpath from learnware.client import LearnwareClient from learnware.client.container import ModelEnvContainer, LearnwaresContainer from learnware.learnware.reuse import AveragingReuser +def test_container(zip_paths): + semantic_specification = dict() + semantic_specification["Data"] = {"Type": "Class", "Values": ["Text"]} + semantic_specification["Task"] = {"Type": "Class", "Values": ["Ranking"]} + semantic_specification["Library"] = {"Type": "Class", "Values": ["Scikit-learn"]} + semantic_specification["Scenario"] = {"Type": "Tag", "Values": "Financial"} + semantic_specification["Name"] = {"Type": "String", "Values": "test"} + semantic_specification["Description"] = {"Type": "String", "Values": "test"} + + learnware_list = [] + for id, zip_path in enumerate(zip_paths): + dir_path = zip_path[:-4] + with zipfile.ZipFile(zip_path, "r") as z_file: + z_file.extractall(dir_path) + + learnware = get_learnware_from_dirpath(f"test_id{id}", semantic_specification, dir_path) + learnware_list.append(learnware) + + with LearnwaresContainer(learnware_list, zip_paths) as env_container: + learnware_list = env_container.get_learnware_list_with_container() + reuser = AveragingReuser(learnware_list, mode="vote_by_label") + input_array = np.random.random(size=(20, 13)) + print(reuser.predict(input_array)) + + for idx, learnware in enumerate(learnware_list): + print(f"learnware_{idx}", learnware.predict(input_array)) + + +def test_load(zip_paths): + learnware_list = [client.load_learnware(file, load_model=False) for file in zip_paths] + + with LearnwaresContainer(learnware_list, zip_paths) as env_container: + learnware_list = env_container.get_learnware_list_with_container() + reuser = AveragingReuser(learnware_list, mode="vote_by_label") + input_array = np.random.random(size=(20, 13)) + print(reuser.predict(input_array)) + + for idx, learnware in enumerate(learnware_list): + print(f"learnware_{idx}", learnware.predict(input_array)) + + if __name__ == "__main__": email = "liujd@lamda.nju.edu.cn" token = "f7e647146a314c6e8b4e2e1079c4bca4" @@ -21,13 +64,5 @@ if __name__ == "__main__": zip_paths[i] = os.path.join(root, zip_paths[i]) client.download_learnware(learnware_ids[i], zip_paths[i]) - learnware_list = [client.load_learnware(file, load_model=False) for file in zip_paths] - - with LearnwaresContainer(learnware_list, zip_paths) as env_container: - learnware_list = env_container.get_learnware_list_with_container() - reuser = AveragingReuser(learnware_list, mode="vote_by_label") - input_array = np.random.random(size=(20, 13)) - print(reuser.predict(input_array)) - - for idx, learnware in enumerate(learnware_list): - print(f"learnware_{idx}", reuser.predict(learnware)) \ No newline at end of file + test_container(zip_paths) + # test_load(zip_paths) \ No newline at end of file From f75606bf672922db6e55451ca5043be4e3af1024 Mon Sep 17 00:00:00 2001 From: Gene Date: Thu, 12 Oct 2023 23:35:03 +0800 Subject: [PATCH 4/4] [MNT] format code --- .../pfs/pfs_cross_transfer.py | 4 +++- learnware/client/container.py | 2 +- learnware/client/learnware_client.py | 2 +- learnware/client/utils.py | 15 ++++++++++++- tests/test_client/test_download.py | 22 +++++++++---------- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/examples/dataset_pfs_workflow/pfs/pfs_cross_transfer.py b/examples/dataset_pfs_workflow/pfs/pfs_cross_transfer.py index 93a3fa3..5f69127 100644 --- a/examples/dataset_pfs_workflow/pfs/pfs_cross_transfer.py +++ b/examples/dataset_pfs_workflow/pfs/pfs_cross_transfer.py @@ -85,7 +85,9 @@ def get_split_errs(algo): split = train_xs.shape[0] - proportion_list[tmp] model.fit( - train_xs[split:,], + train_xs[ + split:, + ], train_ys[split:], eval_set=[(val_xs, val_ys)], early_stopping_rounds=50, diff --git a/learnware/client/container.py b/learnware/client/container.py index 8e7573a..15236b0 100644 --- a/learnware/client/container.py +++ b/learnware/client/container.py @@ -31,7 +31,7 @@ class ModelEnvContainer(BaseModel): with open(model_path, "wb") as model_fp: pickle.dump(self.model_config, model_fp) - + system_execute( [ "conda", diff --git a/learnware/client/learnware_client.py b/learnware/client/learnware_client.py index 1c6cfed..d2cd8f1 100644 --- a/learnware/client/learnware_client.py +++ b/learnware/client/learnware_client.py @@ -337,7 +337,7 @@ class LearnwareClient: if load_model: learnware_obj.instantiate_model() - + return learnware_obj def system(self, command): diff --git a/learnware/client/utils.py b/learnware/client/utils.py index 4639c3b..a48fe45 100644 --- a/learnware/client/utils.py +++ b/learnware/client/utils.py @@ -82,4 +82,17 @@ def install_environment(zip_path, conda_env): raise Exception("Environment.yaml or requirements.txt not found in the learnware zip file.") logger.info(f"install learnware package for conda env [{conda_env}]") - system_execute(args=["conda", "run", "-n", f"{conda_env}", "--no-capture-output", "python3", "-m", "pip", "install", "learnware"]) + system_execute( + args=[ + "conda", + "run", + "-n", + f"{conda_env}", + "--no-capture-output", + "python3", + "-m", + "pip", + "install", + "learnware", + ] + ) diff --git a/tests/test_client/test_download.py b/tests/test_client/test_download.py index 7314ac8..7d2cc53 100644 --- a/tests/test_client/test_download.py +++ b/tests/test_client/test_download.py @@ -17,7 +17,7 @@ def test_container(zip_paths): semantic_specification["Scenario"] = {"Type": "Tag", "Values": "Financial"} semantic_specification["Name"] = {"Type": "String", "Values": "test"} semantic_specification["Description"] = {"Type": "String", "Values": "test"} - + learnware_list = [] for id, zip_path in enumerate(zip_paths): dir_path = zip_path[:-4] @@ -26,43 +26,43 @@ def test_container(zip_paths): learnware = get_learnware_from_dirpath(f"test_id{id}", semantic_specification, dir_path) learnware_list.append(learnware) - + with LearnwaresContainer(learnware_list, zip_paths) as env_container: learnware_list = env_container.get_learnware_list_with_container() reuser = AveragingReuser(learnware_list, mode="vote_by_label") input_array = np.random.random(size=(20, 13)) print(reuser.predict(input_array)) - + for idx, learnware in enumerate(learnware_list): print(f"learnware_{idx}", learnware.predict(input_array)) - + def test_load(zip_paths): learnware_list = [client.load_learnware(file, load_model=False) for file in zip_paths] - + with LearnwaresContainer(learnware_list, zip_paths) as env_container: learnware_list = env_container.get_learnware_list_with_container() reuser = AveragingReuser(learnware_list, mode="vote_by_label") input_array = np.random.random(size=(20, 13)) print(reuser.predict(input_array)) - + for idx, learnware in enumerate(learnware_list): print(f"learnware_{idx}", learnware.predict(input_array)) - + if __name__ == "__main__": email = "liujd@lamda.nju.edu.cn" token = "f7e647146a314c6e8b4e2e1079c4bca4" - + client = LearnwareClient() client.login(email, token) - + learnware_ids = ["00000084", "00000154", "00000155"] zip_paths = ["1.zip", "2.zip", "3.zip"] root = os.path.dirname(__file__) for i in range(len(learnware_ids)): zip_paths[i] = os.path.join(root, zip_paths[i]) client.download_learnware(learnware_ids[i], zip_paths[i]) - + test_container(zip_paths) - # test_load(zip_paths) \ No newline at end of file + # test_load(zip_paths)