使用 XGBoost 算法與 Amazon SageMaker - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 XGBoost 算法與 Amazon SageMaker

XGBoost (eXtreme Gradient Boosting) 為一款熱門的有效率梯度提升樹演算法開放原始碼實作。梯度增強是一種監督式學習演算法,可透過組合一組簡單模型中的多個估計值來準確預測目標變數。XGBoost 演算法在機器學習競賽中表現良好,原因如下:

  • 它對各種數據類型,關係,分佈的強大處理。

  • 您可以微調的各種超參數。

您可以使用 XGBoost 為問題進行迴歸、分類 (二進位和多類) 和排名。

您可以使用新版本的 XGBoost 演算法,做為下列其中一項:

  • Amazon SageMaker 內置算法。

  • 在本機環境中執行訓練指令碼的架構。

此實作具有較小的記憶體佔用量、更好的記錄功能、改進的超參數驗證,以及比原始版本更大的指標集。它提供了一個 XGBoostestimator,可在受管理的 XGBoost 環境中執行訓練指令碼。目前的版本是 SageMaker 基於原始版本 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-Managed XgBoost 容器。若要尋找遷移至 SageMaker XgBoost 容器的套件版本,請參閱 Docker 登錄路徑和範例程式碼。然後選擇您的 AWS 區域,然後導航到 XGBoost(算法)部分。

警告

XGBoost 0.90 版本已停用。不再對 XGBoost 0.90 進行安全性更新或錯誤修正。我們強烈建議您將 XGBoost 版本升級到其中一個較新的版本。

注意

在上不支援 XG 升壓 1.1 版。 SageMaker當測試輸入的功能少於 LIBSVM 輸入中的訓練資料時,XGBoost 1.1 具有中斷的功能來執行預測。這項功能在 XGBoost v1.2 已恢復。考慮使用 1.2-2 或更 SageMaker 高版本。

如何使用 SageMaker

透過 SageMaker,您可以使用 XGBoost 做為內建演算法或架構。當 XGBoost 做為架構時,您可以擁有更多彈性,並可存取更進階的案例,因為您可以自訂自己的訓練指令碼。以下各節將說明如何搭配 SageMaker Python 開發套件使用 有關如何從 Amazon SageMaker 工作室經典用戶界面使用 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如果使用 Amazon SageMaker 開發套件版本 1,請使用 get_image_uri API。若要確定 image_uris.retrieve API 找到正確的 URI,請參閱內建演算法的一般參數。然後xgboost從內置算法圖像 URI 和可用區域的完整列表中查找。

    指定 XGBoost 影像 URI 之後,請使用 XGBoost 容器使用估算程式 API 建構估算器,並啟動訓練工作。 SageMaker 這個 XGBoost 內建演算法模式不會納入您自己的 XGBoost 訓練指令碼中,並且會直接在輸入資料集上執行。

    重要

    當您擷取 SageMaker XGBoost 映像檔 URI 時,請勿使用:latest或作:1為映像檔 URI 標記。您必須指定其中一個,支援的版本以選擇具有您要使用的原生 XGBoost 套件版本的 SageMaker-Managed XgBoost 容器。若要尋找遷移至 SageMaker XgBoost 容器的套件版本,請參閱 Docker 登錄路徑和範例程式碼。然後選擇您的 AWS 區域,然後導航到 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

  • 應用程式/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 保存模組將模型序列化/取消序列化。

注意

在開放原始碼 XGBoost 中使用 SageMaker XGBoost 模型時,請留意各種版本。1.3-1 版及更新的版本使用 XGBoost 內部二進位格式,而之前的版本使用 Python 保存模組。

若要在開放原始碼 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)
若要在開放原始碼 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 支援 CPU 和 GPU 的訓練和推論。建議的執行個體取決於訓練和推論需求,以及 XGBoost 演算法的版本。請選擇以下選項,以取得詳細的資訊:

培訓

此演算法 SageMaker 支援 CPU 和 GPU 訓練。

CPU 訓練

SageMaker XG 升壓 1.0-1 或更早版本僅使用 CPU 進行訓練。這是一個記憶體限制型 (相對於運算限制型) 的演算法。因此,一般用途的運算執行個體 (如 M5) 相較於運算最佳化執行個體 (如 C4),是較好的選擇。此外,我們建議您在所選執行個體中需有足夠的總記憶體才可保留訓練資料。它支持使用磁盤空間來處理不適合主存儲器的數據。這是 libsvm 輸入模式可用 out-of-core功能的結果。即便如此,寫入快取檔案到磁碟會減慢演算法的處理時間。

GPU 訓練

SageMaker 1.2-2 版或更新版本支援 GPU 訓練。雖然每個執行個體的成本較高,但 GPU 的訓練速度更快,更具成本效益。

SageMaker XgBoost 1.2-2 版或更新版本支援 P2、P3、G4 DN 和 G5 GPU 執行個體系列。

SageMaker 升級版本 1.7-1 或更新版本支援 P3、G4DN 和 G5 GPU 執行個體系列。請注意,由於運算容量需求,1.7-1 版或更新的版本不支援 P2 執行個體系列。

若要充分利用 GPU 訓練:

  • 將執行個體類型指定為其中一個 GPU 執行個體 (例如 P3)

  • 在現有的 XGBoost 指令碼gpu_hist中將tree_method超參數設定為

分散式訓練

SageMaker XGBoost 支援 CPU 和 GPU 執行個體進行分散式訓練。

分散式 GPU 訓練

若要在多個執行個體上執行 CPU 訓練,請將估算器的參數 instance_count 設定為大於 1 的值。輸入資料必須分割予全數的執行個體。

分割輸入資料予多個執行個體

使用以下步驟分割輸入資料:

  1. 將輸入資料分解成較小的檔案。檔案數目至少應等於用於分散式訓練的執行個體總數。使用多個較小的檔案 (而不是一個大型檔案) 也會減少訓練工作資料下載時間。

  2. 建立分佈參數時 TrainingInput,請將分佈參數設定為ShardedByS3Key。這樣,如果在訓練任務中指定了 n 個執行個體,則每個執行個體會獲得 S3 中檔案數目的大約 1/ n

分散式 GPU 訓練

您可以將分散式訓練用於單一 GPU 或多 GPU 執行個體。

單一 GPU 執行個體分散式訓練

SageMaker 1.2-2 至 1.3-1 版僅支援單 GPU 執行個體訓練。這表示即使您選取了一個多 GPU 執行個體,每個執行個體也只會使用一個 GPU。

在下列情況下,您必須將輸入資料分割在執行個體總數之間:

  • 您可以使用 1.2-2 到 1.3-1 的版本。

  • 您不需要使用多 GPU 執行個體。

如需詳細資訊,請參閱 分割輸入資料予多個執行個體

注意

SageMaker XGBoost 的 1.2-2 到 1.3-1 版本只會在每個執行個體使用一個 GPU,即使您選擇了多 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 總數 (執行個體計數 * 每個執行個體的 GPU 數目)。有大量的檔案也會降低效能。如需詳細資訊,請參閱 Dask 最佳實務

輸出的變化

指定的超參數 tree_method 會決定用於 XGBoost 訓練的演算法。樹方法 approxhistgpu_hist 都是近似法,且使用草圖進行分位數計算。如需詳細資訊,請參閱 XGBoost 文件中的樹方法一節。草圖是一種近似值演算法。因此,您可以預期模型會有變化,這取決於一些因素,例如選擇用於分散式訓練的工作者數量。變化的意義與資料有關。

Inference

SageMaker XgBoost 支援用於推論的 CPU 和 GPU 執行個體。如需用於推論的執行個體類型的詳細資訊,請參閱 Amazon SageMaker ML 執行個體類型

樣本筆記本

下表概述了解決 Amazon SageMaker XGBoost 演算法不同使用案例的各種範例筆記本。

筆記本標題 Description

如何建立一個自訂的容器?

本筆記本向您展示如何使用 Amazon SageMaker Batch 轉換來建立自訂的 XGBoost 容器。

使用 Parquet 以 XGBoost 進行迴歸

此筆記本展示如何使用 Parquet 中的鮑魚資料集來訓練 XGBoost 模型。

如何訓練和託管多類別分類模型?

此筆記本說明如何使用 MNIST 資料集來訓練和託管多類別分類模型。

如何訓練一個客戶流失預測模型?

此筆記本說明如何訓練模型以預測手機客戶流失,以便找出不滿意的客戶。

用於 XGBoost 訓練的 Amazon SageMaker 託管現貨基礎設施簡介

此筆記本說明如何使用 Spot 執行個體以 XgBoost 容器進行訓練。

如何使用 Amazon 調試 SageMaker 器對 XGBoost 培訓任務進行除錯?

本筆記本說明如何使用 Amazon De SageMaker buter 監控訓練任務,以使用內建的偵錯規則偵測不一致之處。

如需如何建立及存取 Jupyter 筆記本執行個體 (您可以用來執行中範例) 的指示 SageMaker,請參閱。Amazon SageMaker 筆記本實建立筆記本執行個體並開啟之後,請選擇 [SageMaker範例] 索引標籤以查看所有 SageMaker 範例的清單。使用線性學習演算法模組化範例筆記本的主題位於 Amazon 演算法簡介一節。若要開啟筆記本,請選擇其使用標籤,然後選擇建立複本

如需有關 Amazon SageMaker XGBoost 演算法的詳細資訊,請參閱下列部落格文章: