From d5d2443089c81d0537bc63a853ad89dfe6ccf2c1 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Tue, 20 Feb 2024 16:47:30 +0800 Subject: [PATCH 01/16] update config path Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/commands/server_cli.py | 24 ++++++++++++++++--- python/fate_flow/commands/service.sh | 2 +- .../manager/service/service_manager.py | 6 ++++- python/fate_flow/runtime/system_settings.py | 2 +- python/fate_flow/settings.py | 1 + python/fate_flow/utils/conf_utils.py | 5 ++-- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/python/fate_flow/commands/server_cli.py b/python/fate_flow/commands/server_cli.py index 86c741c83..c84084ed1 100644 --- a/python/fate_flow/commands/server_cli.py +++ b/python/fate_flow/commands/server_cli.py @@ -14,6 +14,7 @@ # limitations under the License. # import os +import shutil import subprocess import platform import click @@ -21,10 +22,12 @@ import fate_flow from fate_flow.commands.service import manage_fate_service +from fate_flow.settings import DEFAULT_SERVER_CONF_PATH CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) HOME = os.path.dirname(fate_flow.__file__) -SERVER_CONF_PATH = os.path.join(HOME, "conf", "service_conf.yaml") +CONF_PATH = DEFAULT_SERVER_CONF_PATH or os.path.join(HOME, "conf") +SERVER_CONF_PATH = os.path.join(CONF_PATH, "service_conf.yaml") SETTING_PATH = os.path.join(HOME, "settings.py") SERVICE_SH = os.path.join(HOME, "commands", "service.sh") @@ -138,6 +141,13 @@ def get_version(): print(fate_flow.__version__) +def set_conf_home(home_path): + default_conf = os.path.join(HOME, "conf") + conf_home = f"{home_path}/conf" + shutil.copytree(default_conf, conf_home) + return conf_home + + def replace_settings(home_path): import re with open(SETTING_PATH, "r") as file: @@ -147,6 +157,9 @@ def replace_settings(home_path): content = re.sub(r"JOB_DIR.*", f"JOB_DIR = \"{home_path}/jobs\"", content) content = re.sub(r"LOG_DIR.*", f"LOG_DIR = \"{home_path}/logs\"", content) content = re.sub(r"SQLITE_FILE_NAME.*", f"SQLITE_FILE_NAME = \"{home_path}/fate_flow_sqlite.db\"", content) + + content = re.sub(r"DEFAULT_SERVER_CONF_PATH.*", f"DEFAULT_SERVER_CONF_PATH = \"{home_path}/conf\"", content) + with open(SETTING_PATH, "w") as file: file.write(content) @@ -158,6 +171,7 @@ def replace_settings(home_path): def init_server(ip, port, home): + conf_home = CONF_PATH with open(SERVER_CONF_PATH, "r") as file: config = yaml.safe_load(file) if ip: @@ -171,10 +185,13 @@ def init_server(ip, port, home): raise RuntimeError(f"Please use an absolute path: {home}") os.makedirs(home, exist_ok=True) print(f"home: {home}") + conf_home = set_conf_home(home) replace_settings(home) if ip or port: - with open(SERVER_CONF_PATH, "w") as file: + service_conf_path = SERVER_CONF_PATH if not conf_home else os.path.join(conf_home, "service_conf.yaml") + print(f"Conf path: {service_conf_path}") + with open(service_conf_path, "w") as file: yaml.dump(config, file, default_flow_style=False) print("Init server completed!") @@ -182,7 +199,8 @@ def init_server(ip, port, home): def run_command(command): try: - command = f"bash {SERVICE_SH} {HOME} {command}" + service_conf_path = os.path.join(CONF_PATH, "service_conf.yaml") + command = f"bash {SERVICE_SH} {HOME} {command} {service_conf_path}" result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True) if result.returncode == 0: print(result.stdout) diff --git a/python/fate_flow/commands/service.sh b/python/fate_flow/commands/service.sh index ebcd442a4..fcd554572 100644 --- a/python/fate_flow/commands/service.sh +++ b/python/fate_flow/commands/service.sh @@ -36,6 +36,7 @@ # # ----------------------------------------------------------------------------- FATE_FLOW_BASE=$1 +CONF_PATH=$3 LOG_DIR=$FATE_FLOW_BASE/logs @@ -144,7 +145,6 @@ load_config() { LOG_STDOUT="${LOG_DIR}/console.log" print_info "Checking service configuration..." - CONF_PATH="${FATE_FLOW_BASE}/conf/service_conf.yaml" if [ -f "${CONF_PATH}" ]; then print_ok "Service configuration file found." ${CONF_PATH} else diff --git a/python/fate_flow/manager/service/service_manager.py b/python/fate_flow/manager/service/service_manager.py index 65bcf7080..ea9e6f652 100644 --- a/python/fate_flow/manager/service/service_manager.py +++ b/python/fate_flow/manager/service/service_manager.py @@ -16,6 +16,7 @@ import abc import atexit import json +import os import socket import time from functools import wraps @@ -24,6 +25,7 @@ from threading import Thread from urllib import parse +from fate_flow.utils.file_utils import get_fate_flow_directory from kazoo.client import KazooClient from kazoo.exceptions import NodeExistsError, NoNodeError, ZookeeperError from kazoo.security import make_digest_acl @@ -37,6 +39,7 @@ from fate_flow.runtime.reload_config_base import ReloadConfigBase from fate_flow.runtime.system_settings import RANDOM_INSTANCE_ID, HOST, HTTP_PORT, GRPC_PORT, ZOOKEEPER_REGISTRY, \ ZOOKEEPER, USE_REGISTRY, NGINX_HOST, NGINX_HTTP_PORT, FATE_FLOW_MODEL_TRANSFER_ENDPOINT, SERVICE_CONF_NAME +from fate_flow.settings import DEFAULT_SERVER_CONF_PATH from fate_flow.utils import conf_utils, file_utils from fate_flow.utils.log import getLogger from fate_flow.utils.version import get_flow_version @@ -421,7 +424,8 @@ def load_server_info_from_db(cls): @classmethod def load_server_info_from_conf(cls): - path = Path(file_utils.get_fate_flow_directory()) / 'conf' / SERVICE_CONF_NAME + conf_path = DEFAULT_SERVER_CONF_PATH or os.path.join(get_fate_flow_directory(), "conf") + path = Path(conf_path) / SERVICE_CONF_NAME conf = file_utils.load_yaml_conf(path) if not isinstance(conf, dict): raise ValueError('invalid config file') diff --git a/python/fate_flow/runtime/system_settings.py b/python/fate_flow/runtime/system_settings.py index 245c864e6..1f0e1b98b 100644 --- a/python/fate_flow/runtime/system_settings.py +++ b/python/fate_flow/runtime/system_settings.py @@ -35,7 +35,7 @@ APP_MANAGER_PAGE = "app" ADMIN_PAGE = [PERMISSION_MANAGER_PAGE, APP_MANAGER_PAGE] -FATE_FLOW_CONF_PATH = os.path.join(get_fate_flow_directory(), "conf") +FATE_FLOW_CONF_PATH = DEFAULT_SERVER_CONF_PATH or os.path.join(get_fate_flow_directory(), "conf") FATE_FLOW_JOB_DEFAULT_CONFIG_PATH = os.path.join(FATE_FLOW_CONF_PATH, "job_default_config.yaml") diff --git a/python/fate_flow/settings.py b/python/fate_flow/settings.py index 100932377..e0da84354 100644 --- a/python/fate_flow/settings.py +++ b/python/fate_flow/settings.py @@ -25,6 +25,7 @@ MODEL_DIR = "" JOB_DIR = "" DEFAULT_FATE_DIR = "" +DEFAULT_SERVER_CONF_PATH = "" # sqlite SQLITE_FILE_DIR = "" diff --git a/python/fate_flow/utils/conf_utils.py b/python/fate_flow/utils/conf_utils.py index 318960d9d..19b7b7bf6 100644 --- a/python/fate_flow/utils/conf_utils.py +++ b/python/fate_flow/utils/conf_utils.py @@ -16,14 +16,15 @@ import os from .file_utils import load_yaml_conf, get_fate_flow_directory +from ..settings import DEFAULT_SERVER_CONF_PATH SERVICE_CONF = "service_conf.yaml" TRANSFER_CONF = "transfer_conf.yaml" def conf_realpath(conf_name): - conf_path = f"conf/{conf_name}" - return os.path.join(get_fate_flow_directory(), conf_path) + conf_path = DEFAULT_SERVER_CONF_PATH or os.path.join(get_fate_flow_directory(), "conf") + return f"{conf_path}/{conf_name}" def get_base_config(key, default=None, conf_name=SERVICE_CONF) -> dict: From 7a3b986329b56e294a65f9a9ff5656d15cf8309e Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Wed, 21 Feb 2024 16:57:49 +0800 Subject: [PATCH 02/16] display data count Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/manager/outputs/data.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/fate_flow/manager/outputs/data.py b/python/fate_flow/manager/outputs/data.py index 48832ca42..964eacd59 100644 --- a/python/fate_flow/manager/outputs/data.py +++ b/python/fate_flow/manager/outputs/data.py @@ -134,7 +134,11 @@ def display_data(table_metas): datas[key] = [] for meta in metas: if meta.data_type in [DataType.DATAFRAME, DataType.TABLE]: - datas[key].append({"data": meta.get_part_of_data(), "metadata": meta.get_data_meta()}) + datas[key].append({ + "data": meta.get_part_of_data(), + "metadata": meta.get_data_meta(), + "total": meta.get_count()} + ) else: continue return datas From 190eed964fb39363cce1a6c22165cced77fca99c Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 22 Feb 2024 17:07:16 +0800 Subject: [PATCH 03/16] fix bug Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/entity/code/_api.py | 3 ++- .../fate_flow/manager/service/resource_manager.py | 4 ++++ python/fate_flow/scheduler/scheduler.py | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/python/fate_flow/entity/code/_api.py b/python/fate_flow/entity/code/_api.py index 960285208..b145b59d5 100644 --- a/python/fate_flow/entity/code/_api.py +++ b/python/fate_flow/entity/code/_api.py @@ -25,7 +25,8 @@ class Job: UPDATE_FAILED = 1003 KILL_FAILED = 1004 RESOURCE_EXCEPTION = 1005 - INHERITANCE_FAILED = 1006 + RESOURCE_LIMIT_EXCEEDED = 1006 + INHERITANCE_FAILED = 1007 class Task: NOT_FOUND = 2000 diff --git a/python/fate_flow/manager/service/resource_manager.py b/python/fate_flow/manager/service/resource_manager.py index 55aebdb97..423d1205f 100644 --- a/python/fate_flow/manager/service/resource_manager.py +++ b/python/fate_flow/manager/service/resource_manager.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from fate_flow.entity.code import ReturnCode from pydantic import typing from fate_flow.db.base_models import DB @@ -90,6 +91,9 @@ def resource_for_job(cls, job_id, role, party_id, operation_type: ResourceOperat operate_status = False cores, memory = cls.query_job_resource(job_id=job_id, role=role, party_id=party_id) engine_name = ENGINES.get(EngineType.COMPUTING) + total_cores = EngineRegistry.query(engine_name=engine_name)[0].f_cores + if cores > total_cores: + raise RuntimeError(ReturnCode.Job.RESOURCE_LIMIT_EXCEEDED, "Resource limit exceeded") try: with DB.atomic(): updates = { diff --git a/python/fate_flow/scheduler/scheduler.py b/python/fate_flow/scheduler/scheduler.py index bfc3a44bd..46aa41852 100644 --- a/python/fate_flow/scheduler/scheduler.py +++ b/python/fate_flow/scheduler/scheduler.py @@ -133,11 +133,16 @@ def apply_job_resource(cls, job): def rollback_job_resource(cls, job, federated_response): rollback_party = [] failed_party = [] + stop_status = False for dest_role in federated_response.keys(): for dest_party_id in federated_response[dest_role].keys(): retcode = federated_response[dest_role][dest_party_id]["code"] if retcode == ReturnCode.Base.SUCCESS: rollback_party.append({"role": dest_role, "party_id": [dest_party_id]}) + elif retcode == ReturnCode.Job.RESOURCE_LIMIT_EXCEEDED: + # stop job + schedule_logger(job.f_job_id).exception(f"{dest_role} {dest_party_id} resource limit exceeded") + stop_status = True else: failed_party.append({"role": dest_role, "party_id": [dest_party_id]}) schedule_logger(job.f_job_id).info("job apply resource failed on {}, rollback {}".format(failed_party, @@ -153,6 +158,10 @@ def rollback_job_resource(cls, job, federated_response): else: schedule_logger(job.f_job_id).info("job no party should be rollback resource") + if stop_status: + cls.stop_job(job.f_job_id, stop_status=JobStatus.FAILED) + ScheduleJobSaver.update_job_status({"job_id": job.f_job_id, "status": JobStatus.FAILED}) + @classmethod @wraps_utils.schedule_lock def schedule_waiting_jobs(cls, job: ScheduleJob): @@ -317,7 +326,11 @@ def rerun_job(cls, job_id, auto, tasks: typing.List[ScheduleTaskStatus] = None): schedule_logger(job_id).info(f"require {[task.f_task_name for task in tasks]} to rerun") else: # todo: get_need_revisit_nodes - tasks = ScheduleJobSaver.query_task(job_id=job_id, status=TaskStatus.CANCELED, scheduler_status=True) + tasks = ScheduleJobSaver.query_task( + job_id=job_id, + status=[TaskStatus.CANCELED, TaskStatus.FAILED, TaskStatus.TIMEOUT], + scheduler_status=True + ) job_can_rerun = any([TaskController.prepare_rerun_task( job=job, task=task, auto=auto, force=False, ) for task in tasks]) From 80ddba748536778e94c24dfcccc9f01e3bb23c22 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Fri, 23 Feb 2024 17:09:27 +0800 Subject: [PATCH 04/16] fix bug Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/controller/parser.py | 5 ++++- python/fate_flow/engine/backend/_spark.py | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/python/fate_flow/controller/parser.py b/python/fate_flow/controller/parser.py index 87dfc91f4..3208247a9 100644 --- a/python/fate_flow/controller/parser.py +++ b/python/fate_flow/controller/parser.py @@ -248,7 +248,10 @@ def generate_computing_conf(self): if ENGINES.get(EngineType.COMPUTING).lower() == ComputingEngine.SPARK: return SparkComputingSpec( type=ENGINES.get(EngineType.COMPUTING).lower(), - metadata={"computing_id": self.computing_id} + metadata={ + "computing_id": self.computing_id, + "options": {"home": COMPUTING_CONF.get(ComputingEngine.SPARK).get("home")} + } ) @staticmethod diff --git a/python/fate_flow/engine/backend/_spark.py b/python/fate_flow/engine/backend/_spark.py index 3f7782720..2a16fe236 100644 --- a/python/fate_flow/engine/backend/_spark.py +++ b/python/fate_flow/engine/backend/_spark.py @@ -16,13 +16,17 @@ import os from fate_flow.engine.backend._base import LocalEngine +from fate_flow.entity.spec.dag import TaskConfigSpec from fate_flow.entity.types import WorkerName from fate_flow.manager.service.worker_manager import WorkerManager class SparkEngine(LocalEngine): def run(self, task_info, run_parameters, conf_path, output_path, engine_run, provider_name, **kwargs): - spark_home = os.environ.get("SPARK_HOME", None) + spark_home = None + parameters = TaskConfigSpec.parse_obj(run_parameters) + if parameters.conf.computing.metadata.options: + spark_home = parameters.conf.computing.metadata.options.get("home") if not spark_home: try: import pyspark From 1e93973ad74a4591828a61c266d7daacaa274c41 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Mon, 26 Feb 2024 17:05:29 +0800 Subject: [PATCH 05/16] update container params Signed-off-by: zhihuiwan <15779896112@163.com> --- fateflow.env | 4 ++-- python/fate_flow/components/entrypoint/cli.py | 2 +- python/fate_flow/engine/devices/container.py | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fateflow.env b/fateflow.env index 3d358ab8a..ff65d4868 100644 --- a/fateflow.env +++ b/fateflow.env @@ -1,3 +1,3 @@ -FATE=2.0.0 -FATE_FLOW=2.0.0 +FATE=2.0.1 +FATE_FLOW=2.0.1 PYTHON=3.8 \ No newline at end of file diff --git a/python/fate_flow/components/entrypoint/cli.py b/python/fate_flow/components/entrypoint/cli.py index 196669b25..4b376ec62 100644 --- a/python/fate_flow/components/entrypoint/cli.py +++ b/python/fate_flow/components/entrypoint/cli.py @@ -34,7 +34,7 @@ def component(): @component.command() @click.option("--config", required=False, type=click.File(), help="config path") -@click.option("--env-name", required=False, type=str, help="env name for config") +@click.option("--env-name", required=True, type=str, help="env name for config", default="CONFIG") @click.option("--wraps-module", required=False, type=str, help="component run wraps module") def entrypoint(config, env_name, wraps_module): # parse config diff --git a/python/fate_flow/engine/devices/container.py b/python/fate_flow/engine/devices/container.py index 6bbd45894..6eca3e714 100644 --- a/python/fate_flow/engine/devices/container.py +++ b/python/fate_flow/engine/devices/container.py @@ -56,7 +56,8 @@ def _flatten_dict(cls, data, parent_key='', sep='.'): @classmethod def _get_environment(cls, task: Task, run_parameters): - return cls._flatten_dict(run_parameters) + # return cls._flatten_dict(run_parameters) + return {"CONFIG": json.dumps(run_parameters)} @classmethod def _get_volume(cls, task): From aff68318a3d6ca539b3a5839ff1414c58fd71691 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Mon, 26 Feb 2024 18:11:49 +0800 Subject: [PATCH 06/16] update upload data Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/apps/client/data_app.py | 6 ++++++ python/fate_flow/commands/server_cli.py | 7 +++++-- python/fate_flow/settings.py | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/python/fate_flow/apps/client/data_app.py b/python/fate_flow/apps/client/data_app.py index 2612b63f0..1b32c7074 100644 --- a/python/fate_flow/apps/client/data_app.py +++ b/python/fate_flow/apps/client/data_app.py @@ -14,6 +14,8 @@ # limitations under the License. # import json +import os.path + from webargs import fields from flask import request from fate_flow.apps.desc import SERVER_FILE_PATH, HEAD, PARTITIONS, META, EXTEND_SID, NAMESPACE, NAME, DATA_WAREHOUSE, \ @@ -21,6 +23,7 @@ from fate_flow.engine import storage from fate_flow.manager.components.component_manager import ComponentManager from fate_flow.manager.outputs.data import DataManager +from fate_flow.settings import UPLOAD_DATA_HOME from fate_flow.utils.api_utils import API from fate_flow.errors.server_error import NoFoundTable, NoFoundFile @@ -36,6 +39,9 @@ @API.Input.json(namespace=fields.String(required=False), desc=NAMESPACE) @API.Input.json(name=fields.String(required=False), desc=NAME) def upload_data(file, head, partitions, meta, namespace=None, name=None, extend_sid=False): + if not os.path.isabs(file): + if UPLOAD_DATA_HOME: + file = os.path.join(UPLOAD_DATA_HOME, file) if namespace and name: result = ComponentManager.upload_dataframe( file=file, head=head, partitions=partitions, meta=meta, namespace=namespace, name=name, extend_sid=extend_sid diff --git a/python/fate_flow/commands/server_cli.py b/python/fate_flow/commands/server_cli.py index c84084ed1..cb8ff32bb 100644 --- a/python/fate_flow/commands/server_cli.py +++ b/python/fate_flow/commands/server_cli.py @@ -148,7 +148,7 @@ def set_conf_home(home_path): return conf_home -def replace_settings(home_path): +def replace_settings(home_path, data_home): import re with open(SETTING_PATH, "r") as file: content = file.read() @@ -156,6 +156,7 @@ def replace_settings(home_path): content = re.sub(r"MODEL_DIR.*", f"MODEL_DIR = \"{home_path}/model\"", content) content = re.sub(r"JOB_DIR.*", f"JOB_DIR = \"{home_path}/jobs\"", content) content = re.sub(r"LOG_DIR.*", f"LOG_DIR = \"{home_path}/logs\"", content) + content = re.sub(r"UPLOAD_DATA_HOME.*", f"UPLOAD_DATA_HOME = \"{data_home}\"", content) content = re.sub(r"SQLITE_FILE_NAME.*", f"SQLITE_FILE_NAME = \"{home_path}/fate_flow_sqlite.db\"", content) content = re.sub(r"DEFAULT_SERVER_CONF_PATH.*", f"DEFAULT_SERVER_CONF_PATH = \"{home_path}/conf\"", content) @@ -184,9 +185,11 @@ def init_server(ip, port, home): if not os.path.isabs(home): raise RuntimeError(f"Please use an absolute path: {home}") os.makedirs(home, exist_ok=True) + data_home = os.path.join(home, "upload") + os.makedirs(data_home, exist_ok=True) print(f"home: {home}") conf_home = set_conf_home(home) - replace_settings(home) + replace_settings(home, data_home) if ip or port: service_conf_path = SERVER_CONF_PATH if not conf_home else os.path.join(conf_home, "service_conf.yaml") diff --git a/python/fate_flow/settings.py b/python/fate_flow/settings.py index e0da84354..663ea7cc9 100644 --- a/python/fate_flow/settings.py +++ b/python/fate_flow/settings.py @@ -26,6 +26,7 @@ JOB_DIR = "" DEFAULT_FATE_DIR = "" DEFAULT_SERVER_CONF_PATH = "" +UPLOAD_DATA_HOME = "" # sqlite SQLITE_FILE_DIR = "" From c768ac07b93cc98fb204a44c481dd9d4bb641f78 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Wed, 28 Feb 2024 15:49:41 +0800 Subject: [PATCH 07/16] update env Signed-off-by: zhihuiwan <15779896112@163.com> --- fateflow.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fateflow.env b/fateflow.env index ff65d4868..e80e03fca 100644 --- a/fateflow.env +++ b/fateflow.env @@ -1,3 +1,3 @@ -FATE=2.0.1 -FATE_FLOW=2.0.1 +FATE=2.1.0 +FATE_FLOW=2.1.0 PYTHON=3.8 \ No newline at end of file From f31badd5b416fa9400eaa332c98754d8e165d5b3 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 15:28:34 +0800 Subject: [PATCH 08/16] update env Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/fate_flow/_info.py b/python/fate_flow/_info.py index 319c98fb7..4093fdb3f 100644 --- a/python/fate_flow/_info.py +++ b/python/fate_flow/_info.py @@ -12,5 +12,5 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.0.0" +__version__ = "2.1.0" __provider__ = "fate_flow" From 89bd5b3b126c1a9b3f1a25c5f2b07fd7009d53c3 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 15:28:55 +0800 Subject: [PATCH 09/16] update doc Signed-off-by: zhihuiwan <15779896112@163.com> --- doc/fate_access.md | 195 +++++++++++++++++ doc/fate_access.zh.md | 202 ++++++++++++++++++ doc/images/fate_flow_api.png | Bin 0 -> 166709 bytes doc/images/scheduler.png | Bin 0 -> 28577 bytes examples/provider/register_image.json | 9 + .../fate_flow/components/define/download.yaml | 2 +- .../fate_flow/components/define/upload.yaml | 2 +- python/requirements-eggroll-client.txt | 1 + 8 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 doc/fate_access.md create mode 100644 doc/fate_access.zh.md create mode 100644 doc/images/fate_flow_api.png create mode 100644 doc/images/scheduler.png create mode 100644 examples/provider/register_image.json create mode 100644 python/requirements-eggroll-client.txt diff --git a/doc/fate_access.md b/doc/fate_access.md new file mode 100644 index 000000000..669e40b51 --- /dev/null +++ b/doc/fate_access.md @@ -0,0 +1,195 @@ +# FATE 2.0 Version Interconnection Guide + +## 1. FATE Flow Integration Guide +- Description: This section provides guidance on integrating heterogeneous scheduling platforms with the FATE scheduling platform's FATE Flow. +- Scenario: This side is the system to be integrated, and the partner is the FATE site. + +### 1.1 Interfaces +![api](./images/fate_flow_api.png) +FATE Flow interfaces are divided into 4 categories: +- 1.responsible for receiving requests from upper-level systems, such as submitting, stopping, and querying jobs; +- 2.responsible for receiving requests from the scheduling layer, such as starting and stopping tasks; +- 3.responsible for receiving requests from algorithm containers, such as task status, input reporting, etc.; +- 4.responsible for receiving requests from the platform layer and distributing them to the interfaces of the participating parties. + +#### 1.1.1 api-1 +Description: Since it is about integrating with the upper-level system and does not involve interaction between schedulers, this interface is optional and can be customized without constraints. + +#### 1.1.2 api-2 +Refer to [interface](./../python/fate_flow/apps/partner/partner_app.py) implementation +- `/v2/partner/job/create`: Create a job +- `/v2/partner/job/start`: Start a job +- `/v2/partner/job/status/update`: Update job status +- `/v2/partner/job/update`: Update job (e.g., progress information) +- `/v2/partner/job/resource/apply`: Apply for job resources +- `/v2/partner/job/resource/return`: Return job resources +- `/v2/partner/job/stop`: Stop job +- `/v2/partner/task/resource/apply`: Apply for task resources +- `/v2/partner/task/resource/return`: Return task resources +- `/v2/partner/task/start`: Start task +- `/v2/partner/task/collect`: Scheduler collects task status +- `/v2/partner/task/status/update`: Update task status +- `/v2/partner/task/stop`: Stop task +- `/v2/partner/task/rerun`: Rerun task + +#### 1.1.3 api-3 +Refer to [interface](./../python/fate_flow/apps/worker/worker_app.py) implementation +- `/v2/worker/task/status`: Status report +- `/v2/worker/model/save`: Save model +- `/v2/worker/model/download`: Download model +- `/v2/worker/data/tracking/query`: Query data +- `/v2/worker/data/tracking/save`: Record data +- `/v2/worker/metric/save/`: Record metrics + +#### 1.1.4 api-4 +Refer to [interface](./../python/fate_flow/apps/scheduler/scheduler_app.py) implementation +- `/v2/scheduler/job/create`: Create a job +- `/v2/scheduler/job/stop`: Stop a job +- `/v2/scheduler/task/report`: Task report (e.g., status) +- `/v2/scheduler/job/rerun`: Rerun a job + +### 1.2 Scheduler +The scheduler mainly consists of two parts: scheduling logic and scheduling interface. In the case of interconnection in a heterogeneous scenario, a unified scheduling process and interface are indispensable. In the case mentioned above, when using FATE Flow as the scheduling party in connection with other vendors, the implementation of the scheduler can be ignored. + +#### 1.2.1 Approach +The core of scheduling is the scheduling process, which defines the lifecycle of a job. In version 1.x of FATE, the scheduler and the initiator logic are bound, meaning the coordination scheduling of jobs from multiple parties is done at the initiator. This has a disadvantage: suppose companies A, B, and C each have the need to initiate tasks, their scheduling layers need to implement the scheduler based on the same scheduling logic, and the cost of interconnection is high. In version 2.0, the initiator and scheduler logic in the scheduling module are decoupled, and the scheduler can be specified in the job configuration. In the above case, as long as any one of A, B, or C companies implements the scheduler, or directly uses FATE as the scheduler, other vendors only need to implement the scheduler client interface to meet the requirements, greatly reducing the cost of interconnection. + +![scheduler](./images/scheduler.png) +

P represents the scheduling client interface, S represents the scheduler interface

+ + +To illustrate this scheduling mode with an example: Suppose A wants to create a job with C, and FATE Flow is the scheduler. First, A requests the FATE-Flow S (create-job) interface. After receiving the request, FATE Flow obtains participant information (A, C) through job configuration, and then distributes it to the P (create-job) interface of each participant. + +#### 1.2.2 Scheduling Logic +It manages the lifecycle of jobs, including when to start and stop jobs, when to start and stop tasks, DAG parsing, and component runtime dependencies, etc. FATE Flow's scheduling process is divided into two modes based on task status acquisition: callback and poll. Among them, the callback mode is for the participants to actively report task status to the scheduler, and the poll mode is for the scheduler to pull task status from the participants at regular intervals. The scheduling process diagrams for the two modes are as follows: + +![schedule-for-callback](./images/schedule_for_callback.png) +

Callback Mode

+ + +![schedule-for-poll](./images/schedule_for_poll.png) +

Poll Mode

+ + +#### 1.2.3 Scheduling Interface +Responsible for receiving requests from the platform layer and distributing them to the interfaces of various participants [api-2](#api-2), such as creating jobs, stopping jobs, etc. Interfaces see [api-4](#api-4) + + +## 2 Algorithm Integration Guide +In previous versions of FATE, algorithms ran as local processes started by the scheduling service, and there were shortcomings in terms of scalability, making it difficult to meet the needs of interconnection. In version 2.0, the "algorithm container" is used to run algorithms, implementing heterogeneous algorithm scheduling functionality through a standardized algorithm image construction and loading mechanism. + +![scheduler](./images/federationml_schedule.png) + +### 2.1 FATE Algorithm Containerization Solution +- Pre-processing: Input processing for data, models, algorithm parameters, etc., will call the platform-layer interface [api-3](#api-3) to obtain relevant dependencies. +- Component runtime: Algorithm component logic. +- Post-processing: Output content processing for algorithm components, will call the platform-layer interface [api-3](#api-3) to upload the output to the platform. +![](./images/schedule_for_component.png) + +### 2.2 Integration +#### 2.2.1 Algorithm Parameters +FATE Flow will pass parameters to the algorithm container in the form of environment variables, with the key being "CONFIG" and the parameter value being a JSON string. The content is as follows: +``` +component: psi +computing_partitions: 8 +conf: + computing: + metadata: + computing_id: 202402271112016150790_psi_0_0_host_9998 + host:127.0.0.1 + port:4670 + type: standalone/eggroll/spark + device: + metadata: {} + type: CPU + federation: + metadata: + federation_id: 202402271112016150790_psi_0_0 + parties: + local: + partyid: '9998' + role: host + parties: + - partyid: '9999' + role: guest + - partyid: '9998' + role: host + osx_config: + host: 127.0.01 + port: 9370 + type: osx + logger: + config: + storage: standalone/eggroll/hdfs +engine_run: + cores: 4 +input_artifacts: + data: + input_data: + output_artifact_key: output_data + output_artifact_type_alias: null + parties: + - party_id: + - '9998' + role: host + producer_task: reader_0 + model: null +job_id: '202402271112016150790' +launcher_conf: {} +launcher_name: default +mlmd: + metadata: + api_version: v2 + host: 127.0.0.1 + port: 9380 + protocol: http + type: flow +model_id: '202402271112016150790' +model_version: '0' +parameters: {} +party_id: '9998' +party_task_id: 202402271112016150790_psi_0_0_host_9998 +provider_name: fate +role: host +stage: default +task_id: 202402271112016150790_psi_0 +task_name: psi_0 +task_version: '0' +``` +Here are the key configurations: +- `component`: The name of the algorithm. When multiple algorithms are packaged in the same image, this parameter is used to identify them. +- `conf.computing`: Configuration for the computing engine. +- `conf.federation`: Configuration for the communication engine. +- `conf.storage`: Configuration for the storage engine, supporting standalone/eggroll and hdfs. +- `mlmd`: Platform-layer interface used for recording the output of the algorithm. The interface is [api-3](#api-3). +- `input_artifacts`: Input dependencies, including data, models, etc. +- `parameters`: Algorithm parameters. +The entry point for starting the algorithm needs to be specified with CMD when building the image, and the algorithm should call the status reporting interface in [api-3](#api-3) upon completion. + + +#### 2.2.2 Registering Algorithm Image +```shell +flow provider register -c examples/provider/register_image.json +``` +Where `register_image.json` looks like this: +```json +{ + "name": "fate", + "device": "docker", + "version": "2.1.0", + "metadata": { + "base_url": "", + "image": "federatedai/fate:2.1.0" + } +} +``` + +#### 2.2.3 Using Algorithm Image +After registration, in the DAG of the job configuration, you can specify the provider to run this FATE algorithm image, as shown below: +```yaml +dag: + conf: + task: + provider: fate:2.1.0@docker +``` +Alternatively, you can specify this image for a specific algorithm. For details, refer to the [provider guide](./provider_register.md). \ No newline at end of file diff --git a/doc/fate_access.zh.md b/doc/fate_access.zh.md new file mode 100644 index 000000000..17022b056 --- /dev/null +++ b/doc/fate_access.zh.md @@ -0,0 +1,202 @@ +# FATE 2.0 版本互联互通接入指南 + +## 1. FATE Flow接入指南 +- 说明:此章节为异构调度平台对接FATE调度平台FATE FLow的接入指南 +- 场景:本方为待接入系统,合作方为FATE站点 + +### 1.1 接口 +![api](./images/fate_flow_api.png) +FATE flow接口划分为4类: +- 1负责接收来自上层系统的请求,如提交、停止、查询作业等; +- 2负责接收来自调度层的请求,如开始、停止任务等; +- 3负责接收来自算法容器的请求,如任务的状态、输入上报等 +- 4负责来自平台层的请求,并分发给各个参与方的接口2,如创建作业,停止作业等 + +#### 1.1.1 api-1 +说明:由于是对接上层系统,并不涉及调度之间的交互,非必需接口,可自定义实现,接口层面不做约束。 + +#### 1.1.2 api-2 +可参考[接口](./../python/fate_flow/apps/partner/partner_app.py)实现 +- `/v2/partner/job/create`: 创建作业 +- `/v2/partner/job/start`: 开始作业 +- `/v2/partner/job/status/update`: 更新作业状态 +- `/v2/partner/job/update`: 更新作业(如进度信息) +- `/v2/partner/job/resource/apply`: 申请作业资源 +- `/v2/partner/job/resource/return`: 归还作业资源 +- `/v2/partner/job/stop`: 停止作业 +- `/v2/partner/task/resource/apply`: 申请任务资源 +- `/v2/partner/task/resource/return`: 归还任务资源 +- `/v2/partner/task/start`: 开始任务 +- `/v2/partner/task/collect`: 调度层收集任务状态 +- `/v2/partner/task/status/update`: 更新任务状态 +- `/v2/partner/task/stop`: 停止任务 +- `/v2/partner/task/rerun`: 重跑任务 + +#### 1.1.3 api-3 +可参考[接口](./../python/fate_flow/apps/worker/worker_app.py)实现 +- `/v2/worker/task/status`: 状态上报 +- `/v2/worker/model/save`: 模型存储 +- `/v2/worker/model/download`: 模型下载 +- `/v2/worker/data/tracking/query`: 查询数据 +- `/v2/worker/data/tracking/save`: 记录数据 +- `/v2/worker/metric/save/`: 记录指标 + +#### 1.1.4 api-4 +可参考[接口](./../python/fate_flow/apps/scheduler/scheduler_app.py)实现 +- `/v2/scheduler/job/create`: 创建作业、 +- `/v2/scheduler/job/stop`: 停止作业 +- `/v2/scheduler/task/report`: 任务上报(如状态) +- `/v2/scheduler/job/rerun`: 重跑作业 + + +### 1.2 调度器 +调度器主要包括两部分:调度逻辑和调度接口。异构的场景下的调度层想要实现互联互通,统一的调度流程和接口是不可或缺的。上述提到若使用FATE Flow作为调度方,与其它厂商互联时,可忽略调度器的实现。 + +#### 1.2.1 方案 +调度的核心是调度流程,流程定义作业的生命周期。在FATE 1.x版本中调度器与发起方逻辑是绑定的,即多方作业的协调调度是在发起方。 +这样有个弊处:假设A、B、C三家厂商各自都有发起任务的需求,他们的调度层都需要基于相同的调度逻辑实现调度器,互联互通的成本较高。 +在2.0版本中,将调度模块中的发起方与调度方逻辑解耦,且调度方可以在作业配置中被指定。在上诉的案例中,只要A、B、C厂商中的任意一家实现了调度器, +或者直接使用FATE作为调度方,其他厂商只需要实现调度客户端接口,即可满足需求,大大降低互联互通成本。 + +![scheduler](./images/scheduler.png) +

P代表调度客户端接口,S代表调度器接口

+ + +举个例子简单说明下该调度模式:假设A想要和C创建作业,调度方为FATE Flow。首先A请求FATE-FLow S(create-job)接口, FATE FLow收到请求后通过job配置获取参与方信息(A、C),随即分发给参与方各自的P(create-job)接口。 + + +#### 1.2.2 调度逻辑 +对作业的生命周期管理,主要包括作业何时启停、任务何时启停、DAG解析、组件运行依赖等等。FATE FLow的调度流程按任务状态获取模式分为两种: +callback和poll。其中callback模式是由各参与方主动上报任务状态给调度方,poll模式是调度方定时向各参与方拉取任务状态。 +两种模式对应的调度流程图如下: + +![schedule-for-callback](./images/schedule_for_callback.png) +

callback模式

+ + +![schedule-for-poll](./images/schedule_for_poll.png) +

poll模式

+ + +#### 1.2.3 调度接口 +负责来自平台层的请求,并分发给各个参与方的[api-2](#api-2),如创建作业,停止作业等。接口见[api-4](#api-4) + + +## 2 算法接入指南 +在FATE 历史版本中,算法是以调度服务启动的本地进程方式运行,在扩展性方面存在不足,很难满足互联互通的需求。在2.0版本中采用“算法容器”运行算法, +通过制定统一的算法镜像构建标准与定义一套规范的镜像加载机制来实现异构算法调度功能。 +![scheduler](./images/federationml_schedule.png) + +### 2.1 FATE算法容器化方案 +- 前处理: 数据、模型、算法参数等输入处理,会调用平台层接口[api-3](#api-3)从平台获取相关依赖 +- 组件运行: 算法组件逻辑 +- 后处理: 算法组件输出内容处理,会调用平台层接口[api-3](#api-3)将输出上传到平台 +![](./images/schedule_for_component.png) + +### 2.2 接入 +#### 2.2.1 算法参数 +FATE FLow会以环境变量的形式将参数传递给算法容器,环境变量的key为"CONFIG",参数值为JSON字符串。内容如下: +``` +component: psi +computing_partitions: 8 +conf: + computing: + metadata: + computing_id: 202402271112016150790_psi_0_0_host_9998 + host:127.0.0.1 + port:4670 + type: standalone/eggroll/spark + device: + metadata: {} + type: CPU + federation: + metadata: + federation_id: 202402271112016150790_psi_0_0 + parties: + local: + partyid: '9998' + role: host + parties: + - partyid: '9999' + role: guest + - partyid: '9998' + role: host + osx_config: + host: 127.0.01 + port: 9370 + type: osx + logger: + config: + storage: standalone/eggroll/hdfs +engine_run: + cores: 4 +input_artifacts: + data: + input_data: + output_artifact_key: output_data + output_artifact_type_alias: null + parties: + - party_id: + - '9998' + role: host + producer_task: reader_0 + model: null +job_id: '202402271112016150790' +launcher_conf: {} +launcher_name: default +mlmd: + metadata: + api_version: v2 + host: 127.0.0.1 + port: 9380 + protocol: http + type: flow +model_id: '202402271112016150790' +model_version: '0' +parameters: {} +party_id: '9998' +party_task_id: 202402271112016150790_psi_0_0_host_9998 +provider_name: fate +role: host +stage: default +task_id: 202402271112016150790_psi_0 +task_name: psi_0 +task_version: '0' +``` +其中,关键的配置为: +- component:算法名。多个算法打包在同一个镜像时可通过该参数标识 +- conf.computing: 为计算引擎配置 +- conf.federation: 为通信引擎配置 +- conf.storage: 为存储引擎配置,支持standalone/eggroll和hdfs +- mlmd: 为平台层接口,供算法的输出记录使用。接口为[api-3](#api-3) +- input_artifacts:输入依赖,包括数据、模型等 +- parameters:算法参数 +算法的启动入口需要在打镜像时指定CMD,算法结束需要调用[api-3](#api-3)中的状态上报接口 + + +#### 2.2.2 注册算法镜像 +```shell +flow provider register -c examples/provider/register_image.json +``` +其中,register_image.json如下: +```json +{ + "name": "fate", + "device": "docker", + "version": "2.1.0", + "metadata": { + "base_url": "", + "image": "federatedai/fate:2.1.0" + } +} +``` + +#### 2.2.3 使用算法镜像 +注册完成后,在作业配置的DAG中可以指定provider来运行此fate算法镜像,参考如下: +```yaml +dag: + conf: + task: + provider: fate:2.1.0@docker +``` +或者你也可以指定单个算法使用此镜像,详细可参考[provider指南](./provider_register.zh.md) diff --git a/doc/images/fate_flow_api.png b/doc/images/fate_flow_api.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c07f1ae1fd5d70c0caf3db9ade09d5201186f4 GIT binary patch literal 166709 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℘#Hfyw$?E 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 B51s%3 literal 0 HcmV?d00001 diff --git a/doc/images/scheduler.png b/doc/images/scheduler.png new file mode 100644 index 0000000000000000000000000000000000000000..d625749e89c5dd332e6a38092066a03c70ed06f4 GIT binary patch literal 28577 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 z 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 UeH}8(uF#rTR_r51hrIsrACkrm>Hq)$ literal 0 HcmV?d00001 diff --git a/examples/provider/register_image.json b/examples/provider/register_image.json new file mode 100644 index 000000000..c5d06dc86 --- /dev/null +++ b/examples/provider/register_image.json @@ -0,0 +1,9 @@ +{ + "name": "fate", + "device": "docker", + "version": "2.1.0", + "metadata": { + "base_url": "", + "image": "federatedai/fate:2.1.0" + } +} \ No newline at end of file diff --git a/python/fate_flow/components/define/download.yaml b/python/fate_flow/components/define/download.yaml index 63fccb1a5..69f017131 100644 --- a/python/fate_flow/components/define/download.yaml +++ b/python/fate_flow/components/define/download.yaml @@ -2,7 +2,7 @@ component: name: download description: '' provider: fate_flow - version: 2.0.0 + version: 2.1.0 labels: [] roles: - guest diff --git a/python/fate_flow/components/define/upload.yaml b/python/fate_flow/components/define/upload.yaml index 4027ef457..158f884f4 100644 --- a/python/fate_flow/components/define/upload.yaml +++ b/python/fate_flow/components/define/upload.yaml @@ -2,7 +2,7 @@ component: name: upload description: '' provider: fate_flow - version: 2.0.0 + version: 2.1.0 labels: [] roles: - guest diff --git a/python/requirements-eggroll-client.txt b/python/requirements-eggroll-client.txt new file mode 100644 index 000000000..d8a184799 --- /dev/null +++ b/python/requirements-eggroll-client.txt @@ -0,0 +1 @@ +eggroll \ No newline at end of file From e981bdcadfedcf18ae9256f81423a4f274312e5e Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 15:43:48 +0800 Subject: [PATCH 10/16] update requirements Signed-off-by: zhihuiwan <15779896112@163.com> --- python/requirements-docker.txt | 3 +++ python/requirements-eggroll.txt | 8 +++++--- python/requirements-fate.txt | 5 +++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/python/requirements-docker.txt b/python/requirements-docker.txt index d58644821..f2e17348d 100644 --- a/python/requirements-docker.txt +++ b/python/requirements-docker.txt @@ -6,3 +6,6 @@ # container -r requirements-container.txt + +# eggroll-client +-r requirements-eggroll-client.txt diff --git a/python/requirements-eggroll.txt b/python/requirements-eggroll.txt index 38e9ade97..63d09f2c9 100644 --- a/python/requirements-eggroll.txt +++ b/python/requirements-eggroll.txt @@ -1,6 +1,8 @@ -cloudpickle==2.1.0 -lmdb==1.3.0 +opentelemetry-api +opentelemetry-sdk protobuf==4.24.4 grpcio==1.59.3 grpcio-tools==1.59.3 -psutil>=5.7.0 \ No newline at end of file +cloudpickle==2.1.0 +psutil>=5.7.0 +pynvml==11.5.0 \ No newline at end of file diff --git a/python/requirements-fate.txt b/python/requirements-fate.txt index 283df32e6..fd164d99a 100644 --- a/python/requirements-fate.txt +++ b/python/requirements-fate.txt @@ -1,4 +1,5 @@ lmdb==1.3.0 +torch==1.13.1 fate_utils pydantic==1.10.12 cloudpickle==2.1.0 @@ -6,8 +7,8 @@ click ruamel-yaml==0.16 numpy pandas==2.0.3 -transformers==4.30.2 -accelerate==0.20.2 +transformers==4.37.2 +accelerate==0.27.2 beautifultable requests<2.26.0 scikit-learn From dae5679ee7b92e3670ed7578a43ff0ac8511d0d8 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 15:48:10 +0800 Subject: [PATCH 11/16] update doc Signed-off-by: zhihuiwan <15779896112@163.com> --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index c04d0c299..a75b3cf16 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -15,6 +15,7 @@ nav: - job_scheduling.md - provider_register.md - system_conf.md + - fate_access.md - bfia_access.md - API: swagger/index.md From 5a961f93b9e28c040ddb8ed5dbb271eb547a4a3a Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 16:44:49 +0800 Subject: [PATCH 12/16] fix data display bug Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/manager/outputs/data.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/fate_flow/manager/outputs/data.py b/python/fate_flow/manager/outputs/data.py index 964eacd59..7883129bb 100644 --- a/python/fate_flow/manager/outputs/data.py +++ b/python/fate_flow/manager/outputs/data.py @@ -177,10 +177,12 @@ def display_output_data(cls, **kwargs): if key not in outputs: outputs[key] = [] for table in tables: - outputs[key].append(storage.StorageTableMeta( + meta = storage.StorageTableMeta( name=table.get("name"), namespace=table.get("namespace") - )) + ) + if meta: + outputs[key].append(meta) return cls.display_data(outputs) @staticmethod From 41e8797986877644b8128c48419f32de80639f08 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Thu, 29 Feb 2024 16:56:40 +0800 Subject: [PATCH 13/16] update release Signed-off-by: zhihuiwan <15779896112@163.com> --- RELEASE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 67058bb6b..89e52f8f4 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,13 @@ +## Release 2.1.0 +### Major Features and Improvements +Improved the display issue of output data. +Enhanced the PyPI package: configuration files have been relocated to the user's home directory, and the relative paths for uploading data are based on the user's home directory. +Added support for running FATE algorithms with Spark + Hadoop. + +### Bug-Fix +Fixed an issue where failed tasks could not be retried. +Fixed an issue where the system couldn't run when the task cores exceeded the system total cores. + ## Release 2.0.0 ### Major Features and Improvements * Adapted to new scalable and standardized federated DSL IR From 84df7220690eb719e83a7eb5b5c0c8a4b18f2d43 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Fri, 1 Mar 2024 16:57:44 +0800 Subject: [PATCH 14/16] update release Signed-off-by: zhihuiwan <15779896112@163.com> --- RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index 89e52f8f4..69484e7bb 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,7 +2,7 @@ ### Major Features and Improvements Improved the display issue of output data. Enhanced the PyPI package: configuration files have been relocated to the user's home directory, and the relative paths for uploading data are based on the user's home directory. -Added support for running FATE algorithms with Spark + Hadoop. +Supported running FATE algorithms in Spark on YARN client mode. ### Bug-Fix Fixed an issue where failed tasks could not be retried. From 5b9d53ea5546a2fbd6697d1320ec74da2599c591 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Tue, 5 Mar 2024 10:46:06 +0800 Subject: [PATCH 15/16] support arbiter deepspeed engine Signed-off-by: zhihuiwan <15779896112@163.com> --- python/fate_flow/controller/task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/fate_flow/controller/task.py b/python/fate_flow/controller/task.py index 3c3453f2f..f87fef197 100644 --- a/python/fate_flow/controller/task.py +++ b/python/fate_flow/controller/task.py @@ -120,8 +120,8 @@ def update_local(task): @staticmethod def update_launcher_config(task, launcher_name, task_parameters): # support deepspeed and other launcher - if task.f_role == "arbiter": - return + # if task.f_role == "arbiter": + # return schedule_logger(task.f_job_id).info(f"task runtime launcher name: {launcher_name}") if launcher_name and launcher_name != LauncherType.DEFAULT: task_parameters.launcher_name = task.f_launcher_name = launcher_name From b7909e8f02c37b0db24f26a305a97c80c6590555 Mon Sep 17 00:00:00 2001 From: zhihuiwan <15779896112@163.com> Date: Tue, 5 Mar 2024 10:48:02 +0800 Subject: [PATCH 16/16] update examples Signed-off-by: zhihuiwan <15779896112@163.com> --- examples/lr/train_lr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lr/train_lr.yaml b/examples/lr/train_lr.yaml index 1b13597d7..ccd59ffe9 100644 --- a/examples/lr/train_lr.yaml +++ b/examples/lr/train_lr.yaml @@ -80,7 +80,7 @@ dag: - lr_0 inputs: data: - input_data: + input_datas: task_output_artifact: - output_artifact_key: train_output_data producer_task: lr_0