在亚马逊上使用 xgBoost 算法 SageMaker - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊上使用 xgBoost 算法 SageMaker

XGBoost (eXtreme Gradient Boosting) 是梯度提升树算法的一种流行且高效的开源实施。梯度提升是一种监督学习算法,它试图通过组合来自一组更简单模型的多个估计值来准确预测目标变量。XGBoost 算法在机器学习竞赛中表现良好,原因如下:

  • 它可以很好地处理各种数据类型、关系和分布。

  • 您可以微调的超参数的种类。

您可以使用 XGBoost 来处理回归、分类(二元和多元)和排名问题。

您可以将新版本的 XGBoost 算法用作以下任一用途:

  • 亚马逊的 SageMaker 内置算法。

  • 用于在本地环境中运行训练脚本的框架。

与原始版本相比,此实现具有更小的内存占用、更好的日志记录、改进的超参数验证和更大的指标集。它提供了一个 XGBoostestimator,可以在托管 XGBoost 环境中运行训练脚本。当前版本的 SageMaker XGBoost 基于最初的 XGBoost 版本 1.0、1.2、1.3、1.5 和 1.7。

支持的版本

  • 框架(开源)模式:1.0-1、1.2-1、1.2-2、1.3-1、1.5-1、1.7-1

  • 算法模式:1.0-1、1.2-1、1.2-2、1.3-1、1.5-1、1.7-1

警告

由于需要计算容量, SageMaker XGBoost 的 1.7-1 版本与 P2 实例系列中的 GPU 实例不兼容,用于训练或推理。

重要

检索 SageMaker XGBoost 图像 URI 时,请勿使用:latest:1作为图像 URI 标签。您必须指定其中一个才能选择包含支持的版本要使用的本机 XGBoost 包版本的 SageMaker托管 XGBoost 容器。要查找迁移到 SageMaker XGBoost 容器中的软件包版本,请参阅 Docker 注册表路径和示例代码。然后选择你的 Amazon Web Services 区域,然后导航到 XGBoost(算法)部分

警告

XGBoost 0.90 版本已弃用。对 XGBoost 0.90 的安全更新或错误修复的支持已停止。我们强烈建议您将 XGBoost 版本升级到较新的版本之一。

注意

不支持 xgBoost v1.1。 SageMaker当测试输入的特征少于 LIBSVM 输入中的训练数据时,XGBoost 1.1 的运行预测功能就会中断。此功能已在 XGBoost v1.2 中恢复。可以考虑使用 SageMaker XGBoost 1.2-2 或更高版本。

如何使用 SageMaker XGBoost

借助 SageMaker,您可以将 XGBoost 用作内置算法或框架。当 XGBoost 作为框架时,您可以更灵活地访问更高级的场景,因为您可以自定义自己的训练脚本。以下各节介绍如何将 XGBoost 与 Pyth SageMaker on 软件开发工具包配合使用。有关如何通过 Amazon SageMaker Studio Classic 用户界面使用 XGBoost 的信息,请参阅。SageMaker JumpStart

  • 使用 XGBoost 作为框架

    使用 XGBoost 作为框架来运行可以将附加数据处理合并到训练作业中的自定义训练脚本。在以下代码示例中, SageMaker Python SDK 将 XGBoost API 作为框架提供。其功能与 SageMaker 提供其他框架 API 的方式类似 TensorFlow,例如 MxNet 和。 PyTorch

    import boto3 import sagemaker from sagemaker.xgboost.estimator import XGBoost from sagemaker.session import Session from sagemaker.inputs import TrainingInput # initialize hyperparameters hyperparameters = { "max_depth":"5", "eta":"0.2", "gamma":"4", "min_child_weight":"6", "subsample":"0.7", "verbosity":"1", "objective":"reg:squarederror", "num_round":"50"} # set an output path where the trained model will be saved bucket = sagemaker.Session().default_bucket() prefix = 'DEMO-xgboost-as-a-framework' output_path = 's3://{}/{}/{}/output'.format(bucket, prefix, 'abalone-xgb-framework') # construct a SageMaker XGBoost estimator # specify the entry_point to your xgboost training script estimator = XGBoost(entry_point = "your_xgboost_abalone_script.py", framework_version='1.7-1', hyperparameters=hyperparameters, role=sagemaker.get_execution_role(), instance_count=1, instance_type='ml.m5.2xlarge', output_path=output_path) # define the data type and paths to the training and validation datasets content_type = "libsvm" train_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'train'), content_type=content_type) validation_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'validation'), content_type=content_type) # execute the XGBoost training job estimator.fit({'train': train_input, 'validation': validation_input})

    有关使用 SageMaker XGBoost 作为框架的 end-to-end 示例,请参阅 Amazon xgBoost 的回归 SageMaker

  • 使用 XGBoost 作为内置算法

    使用 XGBoost 内置算法构建 XGBoost 训练容器,如以下代码示例所示。你可以使用 API 自动发现 XGBoost 内置算法的图像 URI。 SageMaker image_uris.retrieve如果使用亚马逊 SageMaker Python 软件开发工具包版本 1,请使用 get_image_uri API。要确保 image_uris.retrieve API 找到正确的 URI,请参阅内置算法的常用参数。然后xgboost从内置算法图像 URI 和可用区域的完整列表中查找。

    指定 XGBoost 图像 URI 后,使用 XGBoost 容器使用 Estimator API 构造估算器并启动训练作 SageMaker 业。此 XGBoost 内置算法模式不包含您自己的 XGBoost 训练脚本,而是直接在输入数据集上运行。

    重要

    检索 SageMaker XGBoost 图像 URI 时,请勿使用:latest:1作为图像 URI 标签。您必须指定其中一个才能选择包含支持的版本要使用的本机 XGBoost 包版本的 SageMaker托管 XGBoost 容器。要查找迁移到 SageMaker XGBoost 容器中的软件包版本,请参阅 Docker 注册表路径和示例代码。然后选择你的 Amazon Web Services 区域,然后导航到 XGBoost(算法)部分

    import sagemaker import boto3 from sagemaker import image_uris from sagemaker.session import Session from sagemaker.inputs import TrainingInput # initialize hyperparameters hyperparameters = { "max_depth":"5", "eta":"0.2", "gamma":"4", "min_child_weight":"6", "subsample":"0.7", "objective":"reg:squarederror", "num_round":"50"} # set an output path where the trained model will be saved bucket = sagemaker.Session().default_bucket() prefix = 'DEMO-xgboost-as-a-built-in-algo' output_path = 's3://{}/{}/{}/output'.format(bucket, prefix, 'abalone-xgb-built-in-algo') # this line automatically looks for the XGBoost image URI and builds an XGBoost container. # specify the repo_version depending on your preference. xgboost_container = sagemaker.image_uris.retrieve("xgboost", region, "1.7-1") # construct a SageMaker estimator that calls the xgboost-container estimator = sagemaker.estimator.Estimator(image_uri=xgboost_container, hyperparameters=hyperparameters, role=sagemaker.get_execution_role(), instance_count=1, instance_type='ml.m5.2xlarge', volume_size=5, # 5 GB output_path=output_path) # define the data type and paths to the training and validation datasets content_type = "libsvm" train_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'train'), content_type=content_type) validation_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'validation'), content_type=content_type) # execute the XGBoost training job estimator.fit({'train': train_input, 'validation': validation_input})

    有关如何将 XGBoost 设置为内置算法的更多信息,请参阅以下笔记本示例。

XGBoost 算法的输入/输出接口

梯度提升对表格数据进行操作,其中行表示观察、一个列表示目标变量或标签,其余列表示特征。

XGBoost 的 SageMaker 实现支持以下用于训练和推理的数据格式:

  • text/libsvm(默认)

  • text/csv

  • application/x-parquet

  • application/x-recordio-protobuf

注意

关于训练和推理输入,有几个事项需要注意:

  • 为了提高性能,我们建议使用带文件模式的 XGBoost,在这种模式下,来自 Amazon S3 的数据存储在训练实例卷上。

  • 对于使用列式输入的训练,算法会假定目标变量(标签)是第一列。对于推理,算法会假定输入没有标签列。

  • 对于 CSV 数据,输入不应有标题记录。

  • 对于 LIBSVM 训练,算法假定标签列后面的列包含特征的索引值对,索引从零开始。因此,每一行的格式为:<label> <index0>:<value0> <index1>:<value1>。

  • 有关实例类型和分布式训练的信息,请参阅 XGBoost 算法的 EC2 实例推荐

对于 CSV 训练输入模式,算法可用的总内存必须能够容纳训练数据集。可用内存总量的计算公式为Instance Count * the memory available in the InstanceType。对于 libsvm 训练输入模式,它不是必需的,但我们建议使用它。

对于 v1.3-1 及更高版本, SageMaker XGBoost 使用以 XGBoost 内部二进制格式保存模型。Booster.save_model以前的版本使用 Python pickle 模块对模型进行序列化/反序列化。

注意

在开源 XGBoost 中使用 SageMaker XGBoost 模型时,请注意版本。版本 1.3-1 及更高版本使用 XGBoost 内部二进制格式,而之前的版本使用 Python pickle 模块。

在开源 xgBoost 中使用使用 SageMaker xgBoost v1.3-1 或更高版本训练的模型
  • 使用以下 Python 代码:

    import xgboost as xgb xgb_model = xgb.Booster() xgb_model.load_model(model_file_path) xgb_model.predict(dtest)
在开源 XGBoost 中使用使用以前版本的 SageMaker XGBoost 训练过的模型
  • 使用以下 Python 代码:

    import pickle as pkl import tarfile t = tarfile.open('model.tar.gz', 'r:gz') t.extractall() model = pkl.load(open(model_file_path, 'rb')) # prediction with test data pred = model.predict(dtest)
使用实例权重支持区分标记数据点的重要性
  • SageMaker XGBoost 允许客户通过为每个实例分配权重值来区分已标记数据点的重要性。对于 text/libsvm 输入,客户可以通过在标签之后附加权重值,将权重值分配给数据实例。例如,label:weight idx_0:val_0 idx_1:val_1...。对于 text/csv 输入,客户需要在参数中打开 csv_weights 标志,并将权重值附加到标签之后的列中。例如:label,weight,val_0,val_1,...

XGBoost 算法的 EC2 实例推荐

SageMaker XGBoost 支持 CPU 和 GPU 训练和推理。实例建议取决于训练和推理需求,以及 XGBoost 算法的版本。有关更多信息,请选择以下选项之一:

训练

SageMaker XGBoost 算法支持 CPU 和 GPU 训练。

CPU 训练

SageMaker XGBoost 1.0-1 或更早版本只能使用 CPU 进行训练。它是一种内存限制型(而不是计算限制型)算法。因此,通用计算实例(例如 M5)是比计算优化的实例(例如 C4)更适合的选择。此外,我们建议您在选定的实例中有足够的总内存来保存训练数据。它支持使用磁盘空间来处理不适合主存储器的数据。这是 libsvm 输入模式中提供的 out-of-core功能的结果。即便如此,将缓存文件写入磁盘也会减慢算法处理时间。

GPU 训练

SageMaker XGBoost 1.2-2 或更高版本支持 GPU 训练。尽管每实例成本较高,但 GPU 训练的速度更快,因此更经济高效。

SageMaker xgBoost 版本 1.2-2 或更高版本支持 P2、P3、G4dN 和 G5 GPU 实例系列。

SageMaker xgBoost 版本 1.7-1 或更高版本支持 P3、G4dN 和 G5 GPU 实例系列。请注意,由于计算容量要求,1.7-1 或更高版本不支持 P2 实例系列。

要利用 GPU 训练,请执行以下操作:

  • 将实例类型指定为 GPU 实例之一(例如 P3)

  • 在现有 XGB tree_method oost 脚gpu_hist本中将超参数设置为

分布式训练

SageMaker XGBoost 支持 CPU 和 GPU 实例进行分布式训练。

分布式 CPU 训练

要在多个实例上运行 CPU 训练,请将估算器的 instance_count 参数设置为大于 1 的值。输入数据必须按照实例总数进行划分。

在实例之间划分输入数据

使用以下步骤划分输入数据:

  1. 将输入数据分解成较小的文件。文件数量至少应等于用于分布式训练的实例数。相比一个大文件,使用多个较小的文件还可以缩短训练作业的数据下载时间。

  2. 创建时 TrainingInput,将分布参数设置为ShardedByS3Key。这样,如果训练作业中指定了 n 个实例,则每个实例将获得大约 S3 中文件数量的 1/ n

分布式 GPU 训练

您可以使用单 GPU 或多 GPU 实例进行分布式训练。

使用单 GPU 实例进行分布式训练

SageMaker XGBoost 版本 1.2-2 至 1.3-1 仅支持单 GPU 实例训练。这意味着即使您选择多 GPU 实例,每个实例也只能使用一个 GPU。

在以下情况下,您必须将输入数据除以实例总数:

  • 你使用 XGBoost 版本 1.2-2 到 1.3-1。

  • 您无需使用多 GPU 实例。

有关更多信息,请参阅 在实例之间划分输入数据

注意

即使您选择多 GPU 实例, SageMaker XGBoost 的 1.2-2 到 1.3-1 版本也只能为每个实例使用一个 GPU。

使用多 GPU 实例进行分布式训练

从版本 1.5-1 开始, SageMaker XGBoost 通过 Dask 提供分布式 GPU 训练。通过 Dask,您可以在使用一个或多个多 GPU 实例时使用所有 GPU。使用单 GPU 实例时,Dask 也可以使用。

通过以下步骤使用 Dask 进行训练:

  1. 要么省略您的中的distribution参数,要TrainingInput么将其设置为。FullyReplicated

  2. 定义超参数时,请将 use_dask_gpu_training 设置为 "true"

重要

使用 Dask 进行分布式训练时,仅支持 CSV 和 Parquet 输入格式。如果您使用其他数据格式,例如 LIBSVM 或 PROTOBUF,则训练作业将失败。

对于 Parquet 数据,请确保按照字符串格式保存列名。列名使用其他数据类型的列将无法加载。

重要

使用 Dask 进行分布式训练不支持管道模式。如果指定了管道模式,则训练作业将失败。

使用 Dask 训练 SageMaker XGBoost 时,需要注意一些注意事项。请确保将数据拆分成较小的文件。Dask 将每个 Parquet 文件作为一个分区读取。每个 GPU 都有一个 Dask 工作线程。因此,文件数应大于 GPU 的总数(实例数 x 每个实例的 GPU 数量)。文件数量过大也会降低性能。有关更多信息,请参阅 Dask 最佳实践

输出中的变化

指定的 tree_method 超参数决定了用于 XGBoost 训练的算法。树方法 approxhistgpu_hist 都是近似方法,使用 Sketching 进行分位数计算。有关更多信息,请参阅 XGBoost 文档中的树方法。Sketching 是一种近似算法。因此,根据各种因素(例如为分布式训练选择的工作线程数),预期模型中会出现变化。变化的重要性取决于数据。

推理

SageMaker XGBoost 支持 CPU 和 GPU 实例进行推理。有关用于推理的实例类型的信息,请参阅 Amazon SageMaker ML 实例类型

XGBoost 示例笔记本电脑

下表概述了各种示例笔记本,这些笔记本解决了 Amazon SageMaker XGBoost 算法的不同用例。

笔记本标题 描述

如何创建自定义 XGBoost 容器?

本笔记本向您展示了如何使用 Amazon Batc SageMaker h Transform 构建自定义 XGBoost 容器。

使用 Parquet 通过 XGBoost 进行回归

本笔记本演示如何使用 Parquet 格式的 Abalone 数据集来训练 XGBoost 模型。

如何训练和托管多元分类模型?

本笔记本展示了如何使用 MNIST 数据集训练和托管多元分类模型。

如何训练客户流失预测模型?

本笔记本演示了如何训练模型来预测移动客户流失,以确定不满意的客户。

适用于 XGBoost 培训的 Amazon SageMaker 托管 Spot 基础设施简介

本笔记本演示如何使用竞价型实例训练 XGBoost 容器。

如何使用 Amazon SageMaker 调试器调试 XGBoost 训练作业?

本笔记本向您展示如何使用 Amazon SageMaker Debugger 监控训练作业,以使用内置调试规则检测不一致之处。

有关如何创建和访问可用于在中运行示例的 Jupyter 笔记本实例的说明 SageMaker,请参阅。Amazon SageMaker 笔记本实例创建并打开笔记本实例后,选择 “SageMaker示例” 选项卡以查看所有 SageMaker 示例的列表。使用线性学习算法的主题建模示例笔记本位于 Amazon 算法简介部分中。要打开笔记本,请选择其使用选项卡,然后选择创建副本

有关 Amazon SageMaker XGBoost 算法的更多信息,请参阅以下博客文章: