机器学习工作流资源管理与工具选型
立即解锁
发布时间: 2025-09-12 01:25:39 阅读量: 9 订阅数: 12 AIGC 


设计生产级机器学习系统
### 机器学习工作流资源管理与工具选型
#### 1. 机器学习工作流资源管理概述
在机器学习(ML)工作流中,资源管理至关重要。这里主要聚焦于基于云的资源,但相关理念也适用于私有数据中心。ML工作流有两个关键特性影响其资源管理,即重复性和依赖性。
重复性方面,ML工作负载很少是一次性操作,而是具有重复性。例如,可能每周训练一次模型,或每四小时生成一批新的预测。这些重复性过程可以通过调度和编排,利用可用资源实现平稳且经济高效的运行。
依赖性方面,ML工作流中的步骤可能存在复杂的依赖关系。例如,一个ML工作流可能包含以下步骤:
1. 从数据仓库中提取上周的数据。
2. 从提取的数据中提取特征。
3. 在提取的特征上训练两个模型A和B。
4. 在测试集上比较A和B。
5. 如果A更好则部署A,否则部署B。
每个步骤都依赖于前一步骤的成功,步骤5属于条件依赖,其操作取决于前一步骤的结果。这些步骤的执行顺序和依赖关系可以用有向无环图(DAG)表示,DAG是表示计算工作流的常用方式,大多数工作流管理工具要求以DAG形式指定工作流。
#### 2. Cron、调度器和编排器
- **Cron**:Cron用于在固定时间调度重复性作业,它只能在预定时间运行脚本,并告知作业是否成功,不关心作业之间的依赖关系。
- **调度器**:调度器是能够处理依赖关系的Cron程序。它接收工作流的DAG并相应地调度每个步骤,还可以基于事件触发启动作业,允许指定作业失败或成功时的操作,如失败时重试的次数。调度器通常利用队列来跟踪作业,需要了解可用资源和每个作业运行所需的资源。例如,使用流行的调度器Slurm调度作业时,可以指定作业名称、执行时间以及分配的内存和CPU数量,示例代码如下:
```bash
#!/bin/bash
#SBATCH -J JobName
#SBATCH --time=11:00:00 # When to start the job
#SBATCH --mem-per-cpu=4096 # Memory, in MB, to be allocated per CPU
#SBATCH --cpus-per-task=4 # Number of cores per task
```
调度器还应优化资源利用率,一些复杂的调度器如Google的Borg会估计作业实际所需的资源,并回收未使用的资源供其他作业使用。然而,设计通用调度器很困难,因为它需要管理几乎任意数量的并发机器和工作流,并且调度器故障会中断其所管理的所有工作流。
- **编排器**:编排器关注的是从哪里获取资源,处理机器、实例、集群等底层抽象。如果编排器发现作业数量超过可用实例池,会增加实例数量以处理工作负载。Kubernetes是最著名的编排器,多数公司使用云提供商管理的Kubernetes托管服务。
调度器和编排器常被混用,因为调度器通常运行在编排器之上,一些调度器有编排能力,一些编排器也有调度能力,但也可以分开使用。
#### 3. 数据科学工作流管理工具
常见的数据科学工作流管理工具包括Airflow、Argo、Prefect、Kubeflow和Metaflow。
| 工具名称 | 优点 | 缺点 |
| ---- | ---- | ---- |
| Airflow | 最早的工作流编排器之一,有大量操作符库,遵循“配置即代码”原则,使用Python定义工作流 | 整体式架构,DAG不可参数化,DAG是静态的,难以处理运行时动态创建步骤的情况 |
| Prefect | 工作流可参数化和动态化,遵循“配置即代码”原则,使用Python定义工作流 | 容器化步骤不是首要任务,需处理Dockerfile并注册到工作流 |
| Argo | 每个步骤在自己的容器中运行,使用YAML定义工作流,可在同一文件中定义步骤和要求 | YAML文件易混乱难调试,只能在K8s集群上运行,本地测试麻烦 |
| Kubeflow | 可帮助在开发和生产环境运行工作流,抽象掉基础设施样板代码 | 虽可用Python定义工作流,但仍需编写Dockerfile和YAML文件 |
| Metaflow | 可用Python装饰器指定步骤要求,自动创建容器,可无缝在开发和生产环境工作,同一工作流不同步骤可在不同环境运行 | 暂无明显缺点 |
以下是Metaflow的一个示例代
0
0
复制全文
相关推荐









