Dapr + Argo Workflows + KEDA 方案:详细设计与 Demo

301 阅读5分钟

Dapr + Argo Workflows + KEDA 方案:详细设计与 Demo

这个方案将结合 DaprArgo WorkflowsKEDA 来构建一个高度可扩展、事件驱动的 AI 训练流水线。这个流程包含了数据处理、模型训练、模型转换和评测等步骤。每个步骤都可以在需要时扩展,以适应不同的负载。

架构设计

  1. Dapr

    • 服务间通信:使用 Dapr 的 Service InvocationPub/Sub 功能来简化服务间的通信。Dapr 为微服务提供了抽象层,使服务能够在分布式系统中轻松互相调用。
    • 事件驱动:通过 Dapr 的 Pub/Sub 机制,触发工作流各个阶段。比如数据处理完成后,Dapr 会将事件发布到消息队列,触发模型训练。
    • 状态管理:Dapr 提供的状态管理可以用来存储和同步中间数据(例如训练状态、模型文件)。
  2. Argo Workflows

    • 工作流调度:使用 Argo Workflows 来编排 AI 流水线的各个阶段。每个阶段都可以是一个容器任务,Argo 会根据工作流定义自动执行和监控每个步骤。
    • 工作流动态调度:当事件发生时,Argo Workflows 会根据事件触发工作流,并管理每个任务的执行和依赖关系。
  3. KEDA

    • 自动伸缩:KEDA 会根据工作负载(如消息队列的长度)自动伸缩容器,确保只有在有任务时才启动新的实例。这将有助于处理高并发的训练和评测任务,节省资源。

工作流的各个阶段

这个工作流包含了四个主要阶段:

  1. 数据处理:准备数据,并处理成适合模型训练的格式。
  2. 模型训练:使用 GPU 进行深度学习模型的训练。
  3. 模型转换:将训练完成的模型转换为可部署的格式(如 ONNX)。
  4. 模型评测:对训练完成的模型进行评估,验证其性能。

具体实现设计

1. 数据处理阶段

数据处理的任务可以由一个容器执行,处理数据并将处理后的数据传递到下一个任务。

  • 任务内容:下载原始数据集,清洗数据,转换数据格式。
  • Dapr Pub/Sub:数据处理完成后,Dapr 会将一个事件发布到消息队列(例如 Kafka 或 NATS),通知下游的模型训练任务。
yaml
CopyEdit
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: data-processing
spec:
  entrypoint: data-processing-template
  templates:
  - name: data-processing-template
    container:
      image: data-processing-image
      command: ["python", "process_data.py"]

2. 模型训练阶段

这个任务将训练模型,并且可能需要大量的 GPU 资源。

  • KEDA 自动伸缩:根据消息队列中待处理的训练任务数,KEDA 会动态调整训练容器的实例数量。
  • Dapr Pub/Sub:当训练完成时,Dapr 会将训练完成的事件发布,通知模型转换和评测阶段开始。
yaml
CopyEdit
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: model-training
spec:
  entrypoint: model-training-template
  templates:
  - name: model-training-template
    container:
      image: model-training-image
      command: ["python", "train_model.py"]
      resources:
        requests:
          cpu: "4"
          memory: "16Gi"
        limits:
          cpu: "8"
          memory: "32Gi"

3. 模型转换阶段

模型训练完成后,我们需要将模型转换为适合部署的格式(例如 ONNX)。

  • 任务内容:加载训练好的模型,使用适当的工具将其转换为 ONNX 格式。
  • 触发机制:该任务由 Dapr 中发布的训练完成事件触发。
yaml
CopyEdit
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: model-conversion
spec:
  entrypoint: model-conversion-template
  templates:
  - name: model-conversion-template
    container:
      image: model-conversion-image
      command: ["python", "convert_to_onnx.py"]

4. 模型评测阶段

评测任务对训练完成的模型进行评估,并生成性能报告。

  • 任务内容:使用评测数据集,加载转换后的模型,进行评测。
  • Dapr Pub/Sub:评测完成后,Dapr 会发布事件,通知其他服务(如模型部署服务)进行后续操作。
yaml
CopyEdit
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  name: model-evaluation
spec:
  entrypoint: model-evaluation-template
  templates:
  - name: model-evaluation-template
    container:
      image: model-evaluation-image
      command: ["python", "evaluate_model.py"]

Dapr + Argo Workflows + KEDA 配合

  1. Dapr 会通过其 Pub/Sub 功能,管理不同服务之间的事件传递。每个服务完成时,会通过 Dapr 发布事件,这些事件将作为下一个任务的触发器。
  2. Argo Workflows 将用于协调整个训练流程。它确保各个阶段按照预定的顺序执行,并根据实际情况执行失败重试等逻辑。
  3. KEDA 会基于负载情况自动伸缩容器的实例。例如,如果消息队列中有大量待处理的训练任务,KEDA 将增加训练容器的实例数,以提高并发处理能力。

Demo 项目结构

pgsql
CopyEdit
.
├── argo-workflows
│   ├── data-processing.yaml
│   ├── model-training.yaml
│   ├── model-conversion.yaml
│   └── model-evaluation.yaml
├── dockerfiles
│   ├── data-processing.Dockerfile
│   ├── model-training.Dockerfile
│   ├── model-conversion.Dockerfile
│   └── model-evaluation.Dockerfile
├── scripts
│   ├── process_data.py
│   ├── train_model.py
│   ├── convert_to_onnx.py
│   └── evaluate_model.py
└── keda.yaml

KEDA 配置示例

yaml
CopyEdit
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: model-training-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: model-training
  triggers:
  - type: rabbitmq
    metadata:
      queueName: training-queue
      host: RabbitMQ-Host
      lagThreshold: "5"

在这个配置中,KEDA 会监控 training-queue 队列,当队列中的任务数超过 5 时,KEDA 会自动增加训练容器的实例数。

总结

这个方案使用了 DaprArgo WorkflowsKEDA 来实现一个可扩展、事件驱动的 AI 训练流水线。每个组件都有清晰的职责分工:

  • Dapr 管理微服务之间的事件驱动和通信。
  • Argo Workflows 负责协调不同任务的执行顺序和依赖关系。
  • KEDA 动态伸缩容器,以应对负载变化。

这种设计确保了系统的高可用性、灵活性和扩展性,适用于高负载的 AI 训练和评测工作流。

4o mini