使用内置分布式 XGBoost 算法进行训练

使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍了内置分布式 XGBoost 算法的工作原理及使用方法。

概览

内置分布式 XGBoost 算法是 XGBoost 算法的封装容器,可在 AI Platform Training 上兼容运行。

该算法允许您同时使用多个虚拟机训练大型数据集,这一点不同于单副本内置 XGBoost 算法。此算法还允许您使用 GPU 执行训练,从而加快训练过程。

AI Platform Training 会根据您提供的数据集和模型参数,使用分布式 XGBoost 算法执行训练。目前的实现基于 XGBoost 0.81 版本。

限制

使用内置分布式 XGBoost 算法进行训练时不支持以下功能

  • 预处理。此算法不支持自动预处理。您必须手动准备训练和验证数据,并将其纳入符合下文中设置输入数据的格式相关部分所述要求的单独文件组中。
  • 单副本训练。此算法旨在使用多个虚拟机执行训练。如果您想使用单独一个虚拟机执行训练,请使用单副本内置 XGBoost 算法

支持的机器类型

只要配置符合以下要求,您就可以将任何 AI Platform Training 规模层级或有效的机器类型组合与此算法搭配使用:

  • 指定主工作器和至少一个工作器。
  • 为实现最佳性能,请为主工作器和工作器指定相同的机器类型。
  • 请勿指定任何参数服务器。
  • 确保您指定的虚拟机的总内存量超过训练数据总文件大小至少 20%。这能保证虚拟机将所有训练数据加载到内存中,并使用其余的内存执行训练。
  • 如果您使用的是 GPU,请确保每个虚拟机仅使用一个 GPU,并为主工作器和工作器使用相同类型的 GPU。务必保证您指定的机器类型支持 GPU 配置
  • 请勿使用 TPU。

设置输入数据的格式

内置的分布式 XGBoost 算法适用于数值型表格数据。数据集的每一行表示一个实例,数据集的每一列表示一个特征值。目标列表示您要预测的值

准备 CSV 文件

您输入的数据必须是采用 UTF-8 编码的一个或多个 CSV 文件。每个文件都必须符合以下要求:

  • 这些 CSV 文件不得包含标题行。如果您的 CSV 文件带有注明各列标签的标题行,请将各文件中的这种首行移除。
  • 目标列必须是第一列。
  • 对于分类训练作业,目标列可以包含非数值型值。所有其他列只能包含数值数据。
  • 对于回归训练作业,您应将目标值归一化,使每个值都介于 0 和 1 之间。所有其他列只能包含数值数据。

拆分数据以执行分布式训练

如需在提交训练作业时提供多个 CSV 文件中的数据,请在您为 training_data_pathvalidation_data_path 参数指定的 Cloud Storage 路径中使用通配符。为了满足上一部分中所述的需求,所有 CSV 文件都必须使用相同的列架构。

内置分布式 XGBoost 算法可通过以下方式之一在多个虚拟机之间分配训练数据:

  • 如果 CSV 文件的数量大于或等于虚拟机数量,则该算法按轮换顺序,以文件为单位分配数据。 换句话说,主工作器加载第一个 CSV 文件,第一个工作器加载第二个 CSV 文件,然后依此类推。这种分配方法循环分配文件,保证每个虚拟机都加载大致相同数量的文件。

  • 如果 CSV 文件的数量小于虚拟机的数量,则该算法按轮换顺序,以实例为单位分配数据。换句话说,主工作器会加载各 CSV 文件的第一行,第一个工作器加载各 CSV 文件的第二行,然后依此类推。这种分配方法循环分配实例,保证每个虚拟机都加载大致相同数量的实例。

如果您指定了 validation_data_path 参数,则该算法还会以下面的一种方式加载验证数据。不过请注意,该算法会分别加载训练数据和验证数据。举例来说,如果您提供了许多训练数据文件,但只提供了一个验证数据文件,该算法可能会以文件为单位加载训练数据,并以实例为单位加载验证数据。

为了获得最佳性能,请将训练数据划分为多个符合以下准则的 CSV 文件:

  • 每个文件均小于 1 GB。
  • 各文件中包含的实例数大致相同。
  • 文件数可被虚拟机总数整除。例如,如果您使用主工作器和两个工作器执行训练,则文件数应该是 3 的倍数。

检查 Cloud Storage 存储桶权限

要存储数据,请使用用于运行 AI Platform Training 作业的同一 Google Cloud 项目中的 Cloud Storage 存储桶。否则,需要向 AI Platform Training 授予对存储数据的 Cloud Storage 存储桶的访问权限

使用 GPU

正如前文有关机器类型的部分所述,内置分布式 XGBoost 算法支持为每个虚拟机使用一个 GPU 执行训练。

为了利用 GPU 的优势,请在提交训练作业时将 tree_method 超参数设置为 gpu_exactgpu_hist

详细了解 XGBoost 对 GPU 的支持

提交分布式 XGBoost 训练作业

本部分介绍了如何提交内置分布式 XGBoost 训练作业。请使用 Google Cloud 控制台或 Google Cloud CLI 提交您的作业。

如需详细了解超参数以及您可以为此算法调整的其他参数,请参阅内置分布式 XGBoost 算法参考文档

以下示例假设您要训练一个人口普查数据分类器,您已将这些数据拆分为 3 个训练数据文件和 3 个验证数据文件:

  • train-0.csv
  • train-1.csv
  • train-2.csv
  • eval-0.csv
  • eval-1.csv
  • eval-2.csv

假设这些文件都不带标题行,并且您已将它们上传到 Cloud Storage。该示例创建了一个使用 3 个虚拟机的训练作业,每个虚拟机都使用一个 NVIDIA Tesla P100 GPU。此作业将在 us-central1 区域中运行。

Google Cloud 控制台

  1. 转到 Google Cloud 控制台中的 AI Platform Training 作业页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练

  3. 创建新的训练作业页面上,打开请选择一种算法下拉列表,从中选择分布式 XGBoost。点击下一步

  4. 训练数据部分的下拉列表中选择使用存储在一个 Cloud Storage 目录中的多个文件。使用目录路径字段选择包含训练文件的 Cloud Storage 目录。在通配符名称字段中,输入 train-*.csv

  5. 验证数据(可选) (Validation data (Optional)) 部分的下拉列表中选择使用存储在一个 Cloud Storage 目录中的多个文件。 使用目录路径字段选择包含验证文件的 Cloud Storage 目录。在通配符名称字段中,输入 eval-*.csv

  6. 训练输出部分中,使用输出目录字段在 Cloud Storage 存储桶中单独选择一个目录来存储训练输出。点击下一步

  7. 为您的训练作业自定义算法参数,或者保留默认值。如需详细了解参数,请点击 Google Cloud 控制台中的链接并参阅内置分布式 XGBoost 参考文档。点击下一步

  8. 作业 ID 字段中输入您选择的名称。从区域下拉列表中选择 us-central1

    容量层级下拉列表中,选择 CUSTOM。在自定义集群配置部分中,从主类型下拉列表和工作器类型下拉列表中选择 standard_p100。在工作器计数字段中,输入 2。点击完成

  9. 作业页面中,点击新作业的 ID 以查看其作业详细信息页。然后点击查看日志以查看训练日志。

gcloud 工具

  1. 为您的作业设置环境变量,将 BUCKET 替换为 Cloud Storage 存储桶的名称,并将 DATA_DIRECTORY 替换为存储桶中数据所在目录的路径:

    # Specify the Docker container for your built-in algorithm selection.
    IMAGE_URI='gcr.io/cloud-ml-algos/xgboost_dist:latest'
    
    # Specify the Cloud Storage wildcard paths to your training and validation data.
    TRAINING_DATA='gs://BUCKET/DATA_DIRECTORY/train-*.csv'
    VALIDATION_DATA='gs://BUCKET/DATA_DIRECTORY/eval-*.csv'
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME='census'
    ALGORITHM='xgboost_dist'
    MODEL_TYPE='classification'
    DATE='date '+%Y%m%d_%H%M%S''
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_${MODEL_TYPE}"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://BUCKET/algorithm_training/${MODEL_NAME}/${DATE}"
    
  2. 使用 gcloud ai-platform jobs training submit 命令提交训练作业:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=us-central1 \
      --master-image-uri=$IMAGE_URI \
      --job-dir=$JOB_DIR \
      --scale-tier=CUSTOM \
      --master-machine-type=n1-standard-4 \
      --master-accelerator count=1,type=nvidia-tesla-p100 \
      --worker-machine-type=n1-standard-4 \
      --worker-count=2 \
      --worker-accelerator count=1,type=nvidia-tesla-p100 \
      -- \
      --training_data_path=$TRAINING_DATA \
      --validation_data_path=$VALIDATION_DATA \
      --objective=binary:logistic \
      --tree_method=gpu_hist
    
  3. 使用 gcloud 查看日志,从而监控训练作业的状态。请参阅 gcloud ai-platform jobs describegcloud ai-platform jobs stream-logs

    gcloud ai-platform jobs describe ${JOB_ID}
    gcloud ai-platform jobs stream-logs ${JOB_ID}
    

后续步骤