作业管理和调度

本章节主要介绍作业管理和调度。

作业管理和Prefect

作业管理中利用到了工作流编排管理库: Prefect。 Prefect的核心理念是将工作流视为代码,通过Python语言来定义任务和流程, 使得工作流具有高度的可读性、可维护性和可扩展型,能够轻松地构建、调度和监控复杂的工作流。而量子作业较为复杂,特别适合使用工作流来进行编排管理。

作业管理和调度架构图

作业管理和调度架构图

  • qcos启动后task-manager组件会初始化prefect server,启动针对不同驱动的work-pool,每个work-pool内置10个queue并共享一个worker

  • 命令行或者北向接口接收用户的作业请求后, 解析作业优先级类型、计算作业优先级、后端类型、qasm文件 / qubo矩阵

  • 根据后端类型,查找对应后端的flow脚本,并将步骤2解析出的作业信息作为flow参数,提交至prefect-server

  • 当prefect的worker空闲时,会根据所在worker-pool的队列的优先级,从队列取出flow作业并执行

作业结束回调机制

作业提交时,支持设置可选的callback列表,callback信息中包括: name, type, method, timeout, retries, headers, url等。 该功能能够在作业结束时,主动发送http api请求到指定位置进行返回值的回调通知。 如果作业因各种原因导致没有成功回调,支持在qcos服务重启时根据作业中metadata字段中的callback_success失败信息进行重新回调。

作业调度

作业调度是指,用户提交作业时,系统根据用户提交的作业信息和设备的动态信息,选择合适的后端设备,并将作业提交到该设备所关联的deployment/workpool环境中运行。 调度可分为静态调度和自动调度两种方式。

静态调度

提交任务时,需要用户指定后端的backend名称,即设备名称,此时任务会直接提交到设备所关联的deployment/workpool环境中运行。

自动调度 (规划)

自动调度是指,用户提交任务时,不指定backend名称,由操作系统自动选择后端设备,并提交任务到该设备所关联的deployment/workpool环境中运行。

自动调度功能可能依赖于设备动态信息,来做调度决策。目前设备动态信息会由每个设备独立的prefect长任务进行定时收集,信息回存在redis数据库中供其它组件读取和使用。

自动调度可以通过下列参数进行综合判断选择后端设备,包括:

必须符合的条件:

  • 匹配设备支持的输入的代码类型CODE_TYPE:QASM、QASM2、QASM3、QUBO等

  • 设备的在线状态,必须为在线

  • 输入的量子比特数满足后端设备要求 【可选】

按权重排序的条件:

  • 设备繁忙度、排队情况 【可选】

  • 历史任务(每QBIT)的平均执行时间 【可选】

自动调度时,使用调度过滤器,先过滤必须符合的条件,如果没有设备符合则直接报错:没有符合条件的设备。如果返回了多个设备,则按照权重排序条件,依次进行过滤,

自动调度会在submit_job中增加2个可选参数: flavor_id和extra_specs。 flavor_id是用户选择的预设的调度策略,extra_specs是用户自定义的调度参数。

用了flavor_id后,额外的调度参数依然建议保留在一个独立的extra_specs字段中。因为 Flavor 定义的是“静态的、硬件的物理规格”,而有些调度参数是“动态的、单次作业特有的运行策略”。两者解耦,设计最清晰。

最终的用户提交json示例:

{
  "job_name": "my-job",
  "source_code": ["..."], // 代码类型和内容
  "flavor_id": "00000000-0000-4000-8000-000000000001", // 决定去什么规格的机器
  "extra_specs": {                           // 额外调度参数
     "max_qubits": 100,
  }
}

flavor_id 对应的预设调度策略规格示例:

{
    "id": "00000000-0000-4000-8000-000000000001",
    "name": "q-flavor-superconducting",
    "description": "superconducting quantum computer",
    "is_public": true,
    "specs": {
        "min_qubits": 16,
        "max_qubits": null,
        "tech_type": "superconducting",
        "gate_fidelity_2q_min": 0.995
    }
}

针对特殊硬件或者动态调度需求,用户可以通过额外的extra_specs来定义一些特定的调度参数,这些参数会被传递到调度器中进行处理。