本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用异构集群进行训练
使用 Training 的 SageMaker 异构集群功能,您可以使用多种类型的机器学习实例运行训练作业,从而更好地扩展资源,更好地利用不同的机器学习训练任务和目的。例如,如果带 GPU 实例的集群上的训练作业因 CPU 密集型任务而遇到 GPU 利用率低和 CPU 瓶颈问题,则可使用异构集群,通过添加更具成本效益的 CPU 实例组来协助卸载 CPU 密集型任务,解决此类瓶颈问题并实现更高的 GPU 利用率。
注意
此功能在 SageMaker Python SDK v2.98.0 及更高版本中可用。
注意
此功能可通过 SageMaker PyTorch
如何配置异构集群
此部分提供了有关如何使用由多种实例类型组成的异构集群运行训练作业的说明。
使用 SageMaker Python 开发工具包
按照有关如何使用 SageMaker Python SDK 为异构集群配置实例组的说明进行操作。
-
要为训练作业配置异构集群的实例组,请使用
sagemaker.instance_group.InstanceGroup
类。您可以指定每个实例组的自定义名称、实例类型和每个实例组的实例数。有关更多信息,请参阅 sagemaker.instance_group。 InstanceGroup在 SageMakerPython 软件开发工具包文档中。 注意
有关可用实例类型以及您可以在异构集群中配置的最大实例组数量的更多信息,请参阅 InstanceGroupAPI 参考。
以下代码示例说明如何设置两个实例组,它们由两个名为
instance_group_1
的ml.c5.18xlarge
仅 CPU 实例和一个名为instance_group_2
的ml.p3dn.24xlarge
GPU 实例组成,如下图所示。from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "
instance_group_1
", "ml.c5.18xlarge
",2
) instance_group_2 = InstanceGroup( "instance_group_2
", "ml.p3dn.24xlarge
",1
) -
使用实例组对象,设置训练输入通道,并通过 sagemaker.inputs 的
instance_group_names
参数将实例组分配给通道。 TrainingInput班级。 instance_group_names
参数接受实例组名称的字符串列表。以下示例说明如何设置两个训练输入通道并分配在上一步的示例中创建的实例组。您还可以为实例组指定
s3_data
参数的 Amazon S3 存储桶路径,处理数据以供使用。from sagemaker.inputs import TrainingInput training_input_channel_1 = TrainingInput( s3_data_type='
S3Prefix
', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile s3_data='s3://your-training-data-storage/folder1
', distribution='FullyReplicated
', # Available Options: FullyReplicated | ShardedByS3Key input_mode='File
', # Available Options: File | Pipe | FastFile instance_groups=["instance_group_1
"] ) training_input_channel_2 = TrainingInput( s3_data_type='S3Prefix
', s3_data='s3://your-training-data-storage/folder2
', distribution='FullyReplicated
', input_mode='File
', instance_groups=["instance_group_2
"] )有关
TrainingInput
的参数的更多信息,请参阅以下链接。-
sagemaker.inputs。
TrainingInputSageMaker Python 软件开发工具包文档中的类 -
DataSourceAPI 参考中的 S3 SageMaker API
-
-
使用
instance_groups
参数配置 SageMaker 估算器,如以下代码示例所示。instance_groups
参数接受InstanceGroup
对象列表。注意
instance_type
和instance_count
参数对和 SageMaker估计器类的instance_groups
参数是相互排斥的。对于同构集群训练,请使用instance_type
和instance_count
参数对。对于异构集群训练,请使用instance_groups
。注意
要查找可用框架容器、框架版本和 Python 版本的完整列表,请参阅 Amazon 深度学习容器 GitHub 存储库中的SageMaker 框架
容器。 -
使用配置了实例组的训练输入通道配置
estimator.fit
方法,然后启动训练作业。estimator.fit( inputs={ 'training':
training_input_channel_1
, 'dummy-input-channel
':training_input_channel_2
} )
使用低级 API SageMaker
如果您使用 Amazon Command Line Interface 或 Amazon SDK for Python (Boto3) 和想要使用低级 SageMaker API 来提交异构集群的训练作业请求,请参阅以下 API 参考。
使用异构集群进行分布式训练
通过 e SageMaker stimator 类的distribution
参数,您可以分配特定的实例组来运行分布式训练。例如,假定您有以下两个实例组,并且想在其中一个实例组上运行多 GPU 训练。
from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup("instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup("instance_group_2", "ml.p3dn.24xlarge", 2)
您可以为其中一个实例组设置分布式训练配置。例如,以下代码示例说明如何将带两个 ml.p3dn.24xlarge
实例的 training_group_2
分配给分布式训练配置。
注意
目前,只能为分发配置指定异构群集的一个实例组。
使用 MPI
使用 SageMaker 数据 parallel 库
注意
使用 SageMaker 数据并行库时,请确保实例组由该库支持的实例类型组成。
有关 SageMaker 数据并行库的更多信息,请参阅SageMaker 数据并行训练。
使用 SageMaker 模型并行库
有关 SageMaker 模型并行库的更多信息,请参见SageMaker 模型并行训练。
修改训练脚本以分配实例组
使用前几节中的异构集群配置,您已经为 SageMaker 训练作业准备好了训练环境和实例。要进一步将实例组分配给某些训练和数据处理任务,下一步是修改训练脚本。默认情况下,无论实例大小如何,训练作业都只为所有节点创建训练脚本副本,这可能会导致性能下降。
例如,如果您在异构集群中混合 CPU 实例和 GPU 实例,同时将深度神经网络训练脚本传递给 SageMaker 估计器的entry_point
参数,则该entry_point
脚本将复制到每个实例。这意味着,如果没有适当的任务分配,CPU 实例还会运行整个脚本并启动专为 GPU 实例上的分布式训练设计的训练作业。因此,您必须更改要卸载并在 CPU 实例上运行的特定处理函数。您可以使用 SageMaker 环境变量来检索异构群集的信息,并让特定的进程相应地运行。
在 SageMaker训练作业初始化阶段查询实例组信息
当您的训练作业开始时,您的训练脚本会读取包括异构集群配置在内的 SageMaker 训练环境信息。该配置包含诸如当前实例组、每个组中的当前主机以及当前主机所在的组之类的信息。
您可以通过以下方式检索实例组信息。
(推荐)使用 SageMaker 训练工具包读取实例组信息
使用SageMaker 训练工具库
from sagemaker_training import environment env = environment.Environment()
与常规 SageMaker 训练和异构集群相关的环境变量:
-
env.is_hetero
– 返回一个布尔结果,指示是否配置了异构集群。 -
env.current_host
– 返回当前主机。 -
env.current_instance_type
– 返回当前主机的实例的类型。 -
env.current_instance_group
– 返回当前实例组的名称。 -
env.current_instance_group_hosts
– 返回当前实例组中的主机列表。 -
env.instance_groups
– 返回用于训练的实例组名称的列表。 -
env.instance_groups_dict
– 返回训练作业的整个异构集群配置。 -
env.distribution_instance_groups
— 返回分配给 SageMaker 估算器类distribution
参数的实例组列表。 -
env.distribution_hosts
— 返回属于分配给 SageMaker 估算器类distribution
参数的实例组的主机列表。
例如,考虑以下包含两个实例组的异构集群示例。
from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 2)
示例异构集群的 env.instance_groups_dict
的输出应类似于以下内容。
{ "instance_group_1": { "hosts": [ "algo-2" ], "instance_group_name": "instance_group_1", "instance_type": "ml.c5.18xlarge" }, "instance_group_2": { "hosts": [ "algo-3", "algo-1" ], "instance_group_name": "instance_group_2", "instance_type": "ml.p3dn.24xlarge" } }
(可选)从资源配置 JSON 文件中读取实例组信息
如果您更喜欢以 JSON 格式检索环境变量,则可以直接使用资源配置 JSON 文件。默认情况下, SageMaker 训练实例中的 JSON 文件/opt/ml/input/config/resourceconfig.json
位于。
file_path = '/opt/ml/input/config/resourceconfig.json' config = read_file_as_json(file_path) print(json.dumps(config, indent=4, sort_keys=True))
注意事项
在使用异构集群功能时,请考虑以下项目。
-
所有实例组共享相同的 Docker 映像和训练脚本。因此,应修改训练脚本以相应地检测它所属的实例组和分叉执行。
-
SageMaker 本地模式下不支持异构群集功能。
-
异构集群训练作业的 Amazon CloudWatch 日志流未按实例组分组。您需要从日志中查明哪些节点属于哪个组。
-
异构集群功能可通过 SageMaker PyTorch
和TensorFlow 框架估算器类获得。支持的框架是 PyTorch v1.10 或更高版本以及 TensorFlow v2.6 或更高版本。要查找可用框架容器、框架版本和 Python 版本的完整列表,请参阅 Amazon 深度学习容器 GitHub 存储库中的SageMaker 框架 容器。 -
一个分布式训练策略只能应用于一个实例组。
示例、博客和案例研究
以下博客讨论了有关使用 SageMaker 异构集群训练的案例研究。
使用 Amazon SageMaker 异构集群提高模型训练的价格性能
(2022 年 10 月 27 日)