Vertex AI 训练集群使用 Simple Linux Utility for Resource Management (Slurm) 作为编排器,用于管理和调度集群上的作业。
Slurm 是一种广泛使用的开源集群管理和作业调度系统,以其出色的可伸缩性和容错能力而闻名。
Slurm 的主要功能
- Slurm 会分配一组计算节点,供特定作业在指定的时间段内独占使用。这样可确保作业能够专门访问运行所需的资源,而不会受到干扰。
- Slurm 提供了一个框架,用于管理作业的整个生命周期,从提交和执行到监控和完成。此系统专门用于处理在一组已分配的节点上运行的并行作业。
- Slurm 会维护一个待处理作业队列,并使用复杂的优先级确定引擎来仲裁对计算资源的访问。通过考虑作业规模、用户优先级和等待时间等因素,该系统可确保整个集群中的资源得到公平高效的利用。
基本集群配置
在运行作业之前,您必须定义 Slurm 集群的基本结构。本部分详细介绍了必要的配置设置,包括如何将计算节点组织到分区中、指定专用登录节点池,以及为用户配置共享主目录。
分区
分区将节点分组为逻辑集,这有助于管理不同的机器类型或访问层级。它们在 slurm_spec 的分区字段中定义为列表。
每个分区对象都具有以下必需字段:
id:分区的唯一标识符。node_pool_ids:一个列表,其中包含属于相应分区的一个或多个节点池的 ID。
例如:
"partitions": [
{
"id": "a4",
"node_pool_ids": [ "a4" ]
}
]
登录节点
登录节点池提供专用节点,充当用户与集群互动的主要入口点。login_node_pool_id 字段用于指定相应池的唯一标识符。
例如:
"login_node_pool_id": "login"
主目录存储空间
home_directory_storage 字段指定要作为集群中所有节点上的 /home 目录装载的 Filestore 实例。这会为所有用户提供一个共享的持久性主目录。
您必须为此值提供 Filestore 实例的完整资源名称。
例如:
"home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_NAME"
高级 Slurm 配置
借助 Vertex AI 训练集群,您可以自定义一组选定的 slurm.conf 参数,但请注意,这些设置只能在初始集群创建期间进行配置,之后无法更改。
会计
借助 Vertex AI 训练集群,您可以使用内置的结算功能来跟踪集群内的资源使用情况。如需获取有关如何监控作业特定 CPU 时间和内存用量等指标的完整指南,请参阅官方 Slurm 结算文档。
| 参数 | 值 | 示例 |
|---|---|---|
| AccountingStorageEnforce | 以英文逗号分隔的字符串 | associations,limits,qos |
抢占和优先级
为了管理作业的调度和优先级,Vertex AI 训练集群允许您配置 Slurm 的作业抢占。抢占功能与多因素优先级插件搭配使用,以确定是否应暂停正在运行的作业,以便为优先级更高的工作让路。
如需查看完整的概念性概览,请参阅有关多因素优先级插件和抢占的官方 Slurm 文档。
抢占参数
| 参数 | 值 | 示例 |
|---|---|---|
| PREEMPT_TYPE | 字符串 | preempt/partition_prio |
| PREEMPT_MODE | 以英文逗号分隔的字符串 | SUSPEND,GANG |
| PREEMPT_EXEMPT_TIME | 字符串 | 00:00:00 |
优先级参数
| 参数 | 值 | 示例 |
|---|---|---|
| PRIORITY_TYPE | 字符串 | priority/multifactor |
| PRIORITY_WEIGHT_AGE | 整数 | 0 |
| PRIORITY_WEIGHT_ASSOC | 整数 | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | 整数 | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | 整数 | 0 |
| PRIORITY_WEIGHT_PARTITION | 整数 | 0 |
| PRIORITY_WEIGHT_QOS | 整数 | 0 |
| PRIORITY_WEIGHT_TRES | 以英文逗号分隔的字符串 | cpu=100,mem=150 |
prolog 和 epilog 脚本
您可以配置自定义 Bash 脚本,使其在每个作业开始时(序言)和结束时(后记)自动运行,方法是使用以下字段:
prolog_bash_scripts:一个字符串列表,其中每个字符串都包含要在作业开始之前执行的 Bash 脚本的完整内容。epilog_bash_scripts:一个字符串列表,其中每个字符串都包含在作业完成后要执行的 Bash 脚本的完整内容。
这对于设置独特的作业环境或执行自动化清理任务非常有用。
集群规范示例
以下示例展示了用于创建训练集群的完整 JSON 配置。您可以根据自己的需求调整此规范。
{ // ... other cluster configurations ... "orchestratorSpec": { "slurmSpec": { "partitions": [ { "id": "a4", "node_pool_ids": ["a4"] } ], "login_node_pool_id": "login", "home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_ID", "accounting": { "accounting_storage_enforce": "ACCOUNTING_STORAGE_ENFORCE" }, "scheduling": { "priority_type": "PRIORITY_TYPE", "priority_weight_age": PRIORITY_WEIGHT_AGE, "priority_weight_assoc": PRIORITY_WEIGHT_ASSOC, "priority_weight_fairshare": PRIORITY_WEIGHT_FAIRSHARE, "priority_weight_job_size": PRIORITY_WEIGHT_JOB_SIZE, "priority_weight_partition": PRIORITY_WEIGHT_PARTITION, "priority_weight_qos": PRIORITY_WEIGHT_QOS, "priority_weight_tres": "PRIORITY_WEIGHT_TRES", "preempt_type": "PREEMPT_TYPE", "preempt_mode": "PREEMPT_MODE", "preempt_exempt_time": "PREEMPT_EXEMPT_TIME" }, "prolog_bash_scripts": [ "#!/bin/bash\necho 'First prolog script running'", "#!/bin/bash\necho 'Second prolog script running'" ], "epilog_bash_scripts": [ "#!/bin/bash\necho 'Epilog script running'" ] // ... other Slurm settings ... } } }
集群管理和运营
管理正在运行的集群
使用所选的资源用量统计和抢占设置创建集群后,您可以使用 Slurm 的命令行工具来管理用户账号和监控作业调度。
使用 sacctmgr 进行账号管理
sacctmgr 命令是用于管理 Slurm 数据库中用户和账号信息的主要工具。例如,如需向账号添加新用户并授予其对分区的访问权限,请运行以下命令:
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
如需查看所有 sacctmgr 选项的完整列表,请参阅官方 Slurm 结算文档。
检查作业优先级
如需检查队列中每个作业的优先级组件,请使用 sprio 实用程序。这有助于了解为什么某些作业会安排在其他作业之前运行。
如需了解详细用法,请参阅 sprio 实用程序文档。
抢占示例
Slurm 官方文档提供了几个不同抢占策略的有效示例。您可以在 Slurm 抢占页面上找到这些示例。
后续步骤
以下内容侧重于机器学习生命周期的最后几个步骤:管理、部署和监控经过训练的模型。
- 部署模型以进行推理:将经过训练的模型部署到 Vertex AI 端点,以便大规模处理在线推理请求。
- 管理模型生命周期:使用 Vertex AI Model Registry 对模型进行版本控制、对比和管理。可以配置流水线,在训练成功后自动注册新模型。
- 监控流水线运行作业和模型性能:
- 流水线监控:跟踪流水线运行作业的执行图、制品和性能,以调试问题并优化编排。
- 模型监控:部署后,设置监控以检测模型预测性能方面的漂移和异常情况,这有助于确保模型在长期运行中始终保持准确。
- 优化费用并管理集群生命周期:使用自动化流水线时,请根据运行频率管理集群的生命周期。