FATE性能参数

241 阅读4分钟

官网资源配置策略,当前采取eggroll相关配置:

1.5.0版本开始,为了进一步管理资源,fateflow启用更细粒度的cpu cores管理策略,去除早前版本直接通过限制同时运行作业个数的策略

4.5.1 总资源配置

  • 资源来自于基础引擎,当前版本未实现自动获取基础引擎的资源大小,因此你通过配置文件的方式配置$PROJECT_BASE/conf/service_conf.yaml指定,fateflow server启动时从配置文件扫描所有基础引擎信息并注册到数据库表t_engine_registry
  • fate_on_eggroll:total_cores=cores_per_node*nodes
  • fate_on_spark:total_cores=cores_per_node*nodes
  • fate_on_standalone:total_cores=cores_per_node*nodes
  • 不同基础引擎间的资源计算互相隔离
  • 以上配置修改后均需要重启fateflow server使之生效

4.5.2 运行资源计算

计算每个task实际提交到计算引擎的task_run_cores,但并不代表资源调度时的申请量

  1. job conf使用task_cores配置:

    1. task_run_cores(guest, host):max(task_cores / total_nodes, 1) * total_nodes
    2. task_run_cores(arbiter):max(1 / total_nodes, 1) * total_nodes
    3. fateflow会将参数自动转换为对应引擎的实际配置参数,如eggroll的eggroll.session.processors.per.node,spark的executor-cores和num-executors
  2. job conf使用eggroll_run配置:

    1. task_run_cores(guest, host, arbiter):eggroll.session.processors.per.node * total_nodes
  3. job conf使用spark_run配置:

    1. task_run_cores(guest, host, arbiter):executor-cores * num-executors

4.5.3 资源调度

  1. 作业申请资源的计算

    1. 对于计算引擎为eggroll、standalone

      • apply_cores(guest, host):task_run_cores * task_parallelism
      • apply_cores(arbiter):0,因为实际上仅消耗极少量资源且eggroll暂仅支持配置所有node节点cores一致,因此为了避免nodes太多导致arbiter资源扣减资源太多影响作业排队,所以资源调度计算时设为0
      • 此处注意,在eggroll集群上,arbiter依然会在每个node被分配了task_run_cores/nodes个cores
    2. 对于计算引擎为spark

      • 对于spark,支持executor-cores * num-executors,不与集群nodes数强相关,尤其spark本身有资源调度器,如果此处资源调度计算与实际提交不一致,可能会导致spark作业一直等待
      • apply_cores(guest, host, arbiter):task_run_cores * task_parallelism
  2. 作业调度策略

    1. 按提交时间先后入队
    2. 目前仅支持FIFO策略,也即每次调度器仅会扫描第一个作业,若第一个作业申请资源成功则start且出队,若申请资源失败则等待下一轮调度
  3. 资源申请规则

    1. 调度器依据上述调度策略选出作业,分发联邦多方资源申请指令到所有参与方
    2. 若所有参与方均申请资源成功(total_cores - apply_cores > 0),则该作业申请资源成功
    3. 若非所有参与方均申请资源成功,则发送资源回滚指令到已申请成功的参与方,该作业申请资源失败

调整示例:

根据上述信息,假设要同时启动4个任务,需要配置以下参数:

  1. 总资源配置:

    1. 假设基础引擎为 Eggroll,并且每个节点有 8 个 CPU 核心。
    2. 则总 CPU 核心数为 total_cores = cores_per_node * nodes = 8 * nodes
  2. 运行资源计算:

    1. 使用 job conf 中的 task_cores 配置:

      • 对于 guest 和 host:task_run_cores = max(task_cores / total_nodes, 1) * total_nodes
      • 对于 arbiter:task_run_cores = max(1 / total_nodes, 1) * total_nodes
    2. 使用 eggroll_run 配置:

      • 对于 guest、host 和 arbiter:task_run_cores = eggroll.session.processors.per.node * total_nodes
    3. 使用 spark_run 配置:

      • 对于 guest、host 和 arbiter:task_run_cores = executor-cores * num-executors
  3. 资源调度:

    1. 对于 Eggroll 和 Standalone:

      • apply_cores(guest, host) = task_run_cores * task_parallelism
      • apply_cores(arbiter) = 0
    2. 对于 Spark:

      • apply_cores(guest, host, arbiter) = task_run_cores * task_parallelism

根据具体情况,你需要确定以下参数:

  • cores_per_node:每个节点的 CPU 核心数
  • nodes:基础引擎的节点数
  • task_cores:每个任务使用的 CPU 核心数
  • task_parallelism:任务并行度

假设我们基于 Eggroll 并且每个节点有 8 个 CPU 核心,假设我们的任务需要使用 2 个 CPU 核心,任务并行度为 2,则计算如下:

  • total_cores = 8 * nodes
  • 对于 guest 和 host:task_run_cores = max(2 / total_nodes, 1) * total_nodes
  • 对于 arbiter:task_run_cores = max(1 / total_nodes, 1) * total_nodes
  • apply_cores(guest, host) = task_run_cores * 2
  • apply_cores(arbiter) = 0

需要根据实际情况调整以上参数,并确保配置文件中的配置与这些计算一致,以确保正确地分配和利用资源

配置文件修改路径:

~/fate/confs-{groupId}/confs/eggroll/conf/eggroll.properties

~/fate/confs-{groupId}/confs/fate_flow/conf/job_default_config.yaml

~/fate/confs-{groupId}/confs/fate_flow/conf/service_conf.yaml