Dapr + Argo Workflows + KEDA 方案:详细设计与 Demo
这个方案将结合 Dapr、Argo Workflows 和 KEDA 来构建一个高度可扩展、事件驱动的 AI 训练流水线。这个流程包含了数据处理、模型训练、模型转换和评测等步骤。每个步骤都可以在需要时扩展,以适应不同的负载。
架构设计
-
Dapr:
- 服务间通信:使用 Dapr 的 Service Invocation 和 Pub/Sub 功能来简化服务间的通信。Dapr 为微服务提供了抽象层,使服务能够在分布式系统中轻松互相调用。
- 事件驱动:通过 Dapr 的 Pub/Sub 机制,触发工作流各个阶段。比如数据处理完成后,Dapr 会将事件发布到消息队列,触发模型训练。
- 状态管理:Dapr 提供的状态管理可以用来存储和同步中间数据(例如训练状态、模型文件)。
-
Argo Workflows:
- 工作流调度:使用 Argo Workflows 来编排 AI 流水线的各个阶段。每个阶段都可以是一个容器任务,Argo 会根据工作流定义自动执行和监控每个步骤。
- 工作流动态调度:当事件发生时,Argo Workflows 会根据事件触发工作流,并管理每个任务的执行和依赖关系。
-
KEDA:
- 自动伸缩:KEDA 会根据工作负载(如消息队列的长度)自动伸缩容器,确保只有在有任务时才启动新的实例。这将有助于处理高并发的训练和评测任务,节省资源。
工作流的各个阶段
这个工作流包含了四个主要阶段:
- 数据处理:准备数据,并处理成适合模型训练的格式。
- 模型训练:使用 GPU 进行深度学习模型的训练。
- 模型转换:将训练完成的模型转换为可部署的格式(如 ONNX)。
- 模型评测:对训练完成的模型进行评估,验证其性能。
具体实现设计
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 配合
- Dapr 会通过其 Pub/Sub 功能,管理不同服务之间的事件传递。每个服务完成时,会通过 Dapr 发布事件,这些事件将作为下一个任务的触发器。
- Argo Workflows 将用于协调整个训练流程。它确保各个阶段按照预定的顺序执行,并根据实际情况执行失败重试等逻辑。
- 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 会自动增加训练容器的实例数。
总结
这个方案使用了 Dapr、Argo Workflows 和 KEDA 来实现一个可扩展、事件驱动的 AI 训练流水线。每个组件都有清晰的职责分工:
- Dapr 管理微服务之间的事件驱动和通信。
- Argo Workflows 负责协调不同任务的执行顺序和依赖关系。
- KEDA 动态伸缩容器,以应对负载变化。
这种设计确保了系统的高可用性、灵活性和扩展性,适用于高负载的 AI 训练和评测工作流。
4o mini