使用任务队列ack-kube-queue管理AI/ML工作负载

ack-kube-queue是面向ACK集群的任务队列系统,旨在优化AI/ML和批处理工作负载的管理和资源利用。它通过提供灵活的作业队列管理、自动优化工作负载分配和资源配额管理,帮助系统管理员提升集群资源利用率和任务执行效率。本文将介绍如何安装和配置ack-kube-queue任务队列并提交任务。

使用限制

仅支持1.18及以上的ACK托管集群ACK Edge集群ACK灵骏集群

安装ack-kube-queue组件

ACK托管集群ACK Edge集群

未部署云原生AI套件

  1. 开通云原生AI套件

  2. 登录容器服务管理控制台,在左侧导航栏单击集群列表

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > 云原生AI套件

  4. 云原生AI套件页面下方,单击一键部署

  5. 调度区域,选中Kube Queue,在交互方式区域,选中Arena,然后在页面下方单击部署云原生AI套件

已部署云原生AI套件

  1. 开通云原生AI套件

  2. 登录容器服务管理控制台,在左侧导航栏单击集群列表

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > 云原生AI套件

  4. 安装ack-arenaack-kube-queue

    • 云原生AI套件页面的操作列,单击组件ack-arena对应的部署。在参数配置页面,单击确定

    • 云原生AI套件页面的操作列,单击组件ack-kube-queue对应的部署。在弹出页面,单击确定

    ack-arenaack-kube-queue安装完成后,组件列表区域的组件状态已部署

ACK灵骏集群

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 应用市场页面,搜索ack-kube-queue,然后单击该应用。

  3. 在应用详情页面,单击右上角的一键部署,进入基本信息页面,填写目标集群、命名空间和发布名称后,单击下一步

  4. 参数配置页面, 选择最新的chart 版本后,单击确定

配置ack-kube-queue组件

ack-kube-queue支持多种任务类型的排队功能,包括TfJob、PytorchJob、MpiJob、Argo Workflow、RayJob、SparkApplication以及原生Job。默认情况下,ack-kube-queue组件仅启用原生BatchJob的排队功能,您可以根据需要开启或关闭任意类型任务的排队功能。

使用限制

  • TfJob、PytorchJob、MpiJob需要使用ack-arena组件中提供的Operator。

  • 使用原生Job类型排队功能时,集群版本需为1.22及以上。

  • MpiJob当前仅支持通过Arena提交MpiJob。

  • Argo Workflow当前仅支持对整个工作流进行排队,可以通过在Annotation中声明如下内容,指定Workflow需要的资源。

    ...
     annotations:
       kube-queue/min-resources: |
         cpu: 5
         memory: 5G
    ...

开启任务类型支持

  1. 登录容器服务管理控制台,在左侧导航栏单击集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. 找到ack-kube-queue应用,单击其右侧操作列下的更新

  4. 若需开启相关工作负载的支持,请参照表格修改YAML内容。

    配置项

    说明

    extension.argo.enable设置为true

    开启Argo Workflow支持。

    extension.mpi.enable设置为true

    开启MpiJob支持。

    extension.ray.enable设置为true

    开启RayJob支持。

    extension.spark.enable设置为true

    开启SparkApplication支持。

    extension.tf.enable设置为true

    开启TfJob支持。

    extension.pytorch.enable设置为true

    开启PytorchJob支持。

提交任务

提交TfJob、PytorchJob、MpiJob

您需要在JobAnnotation中添加scheduling.x-k8s.io/suspend="true"的标识。以下以TfJob为例进行说明。

apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
  name: "job1"
  annotations:
    scheduling.x-k8s.io/suspend: "true"
spec:
...

提交原生Job

您需要将Jobsuspend字段设置成true。以下示例将生成一个需求100mCPU的排队单元,当该排队单元出队后,Jobsuspend字段会被改为false,此时集群组件将开始执行该Job。

apiVersion: batch/v1
kind: Job
metadata:
  generateName: pi-
spec:
  suspend: true
...

提交Argo Workflow

说明

请提前在应用市场中安装Argo Workflows组件

请在Argo Workflow中添加一个名为kube-queue-suspend的自定义模板,其类型为suspend。同时,在提交Workflow时,将其suspend状态设置为true。示例如下。

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: $example-name
spec:
  suspend: true # 需要将该项设置为true。
  entrypoint: $example-entrypoint
  templates:
  # 需要添加名为kube-queue-suspend的suspend模板。
  - name: kube-queue-suspend
    suspend: {}
  - name: $example-entrypoint
...

提交SparkApplication

说明

请提前在应用市场中安装ack-spark-operator组件

在提交SparkApplication时,请在SparkApplication的注解中添加 scheduling.x-k8s.io/suspend="true" 标签。

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  generateName: spark-pi-suspend-
  namespace: spark-operator
  annotations:
    scheduling.x-k8s.io/suspend: "true"
spec:
...

提交RayJob

说明

请提前在集群组件管理中安装托管Kuberay-Operator组件。具体操作,请参见管理组件

在提交 RayJob 时,请将spec.suspend字段设置成true

apiVersion: ray.io/v1
kind: RayJob
metadata:
  name: rayjob-sample
spec:

  # Suspend specifies whether the RayJob controller should create a RayCluster instance.
  # If a job is applied with the suspend field set to true, the RayCluster will not be created and we will wait for the transition to false.
  # If the RayCluster is already created, it will be deleted. In the case of transition to false, a new RayCluste rwill be created.
  suspend: true
...