

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

# XGBoost 演算法搭配 Amazon SageMaker AI
<a name="xgboost"></a>

[XGBoost](https://github.com/dmlc/xgboost) (eXtreme Gradient Boosting) 為一款熱門的有效率梯度提升樹演算法開放原始碼實作。梯度提升是監督式學習演算法，藉由結合一組較簡單模型的多個預估值，來嘗試精確預測目標變數。XGBoost 演算法在機器學習競賽中表現優異，原因如下：
+ 它能夠穩健地處理各種資料類型、關係、分佈。
+ 它擁有豐富的超參數可供微調。

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

您可以將新版本的 XGBoost 演算法用作：
+ Amazon SageMaker AI 內建演算法。
+ 在本機環境中執行訓練指令碼的架構。

相較於原始版本，此實作具有更小的記憶體使用量、更好的記錄、已改善的超參數驗證，以及更大的指標集。它提供 XGBoost `estimator`，可在受管 XGBoost 環境中執行訓練指令碼。SageMaker AI XGBoost 的目前版本是以原始 XGBoost 版本 1.0、1.2、1.3、1.5、1.7 和 3.0 為基礎。

如需 Amazon SageMaker AI XGBoost 演算法的詳細資訊，請參閱下列部落格文章：
+ [開放原始碼 Amazon SageMaker AI XGBoost 演算法容器簡介](https://aws.amazon.com/blogs/machine-learning/introducing-the-open-source-amazon-sagemaker-xgboost-algorithm-container/)
+ [Amazon SageMaker AI XGBoost 現在提供完全分散式 GPU 訓練](https://aws.amazon.com/blogs/machine-learning/amazon-sagemaker-xgboost-now-offers-fully-distributed-gpu-training/)

## 支援的版本
<a name="xgboost-supported-versions"></a>

如需詳細資訊，請參閱我們的[支援政策](https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-support-policy.html#pre-built-containers-support-policy-ml-framework)。
+ 架構 （開放原始碼） 模式：1.2-1、1.2-2、1.3-1、1.5-1、1.7-1、3.0-5
+ 演算法模式：1.2-1、1.2-2、1.3-1、1.5-1、1.7-1、3.0-5

**警告**  
由於所需的運算容量，SageMaker AI XGBoost 3.0-5 版與 P3 執行個體系列中用於訓練或推論的 GPU 執行個體不相容。

**警告**  
由於套件相容，SageMaker AI XGBoost 3.0-5 版不支援 SageMaker 除錯器。

**警告**  
由於所需的運算容量，SageMaker AI XGBoost 1.7-1 版與 P2 執行個體系列用於訓練或推論的 GPU 執行個體不相容。

**警告**  
網路隔離模式：請勿升級超過 25.2 版的 pip。較新版本可能會在模組安裝期間嘗試從 PyPI 擷取設定工具。

**重要**  
擷取 SageMaker AI XGBoost 映像 URI 時，請勿使用 `:latest` 或 `:1` 作為映像 URI 標記。您必須指定 [支援的版本](#xgboost-supported-versions) 其中之一，才能選擇由 SageMaker AI 管理的 XGBoost 容器，其中包含您要使用的原生 XGBoost 套件版本。若要尋找移轉至 SageMaker AI XGBoost 容器的套件版本，請參閱 [Docker 登錄檔路徑和範例程式碼](https://docs.aws.amazon.com/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths.html)。然後選擇您的 AWS 區域，然後導覽至 **XGBoost （演算法） **區段。

**警告**  
XGBoost 0.90 版本已停用。不再對 XGBoost 0.90 進行安全性更新或錯誤修正。強烈建議您將 XGBoost 版本升級至較新的版本之一。

**注意**  
SageMaker AI 不支援 XGBoost 1.1 版。當測試輸入的特徵少於 LIBSVM 輸入內的訓練資料時，XGBoost 1.1 執行預測的功能會中斷。這項功能在 XGBoost v1.2 已恢復。請考慮使用 SageMaker AI XGBoost 1.2-2 或更新的版本。

**注意**  
您可以使用 XGBoost 1.0-1 版，但並未正式支援。

## 適用於 XGBoost 演算法的 EC2 執行個體建議
<a name="Instance-XGBoost"></a>

SageMaker AI XGBoost 支援 CPU 和 GPU 訓練和推論。建議的執行個體取決於訓練和推論需求，以及 XGBoost 演算法的版本。請選擇以下選項，以取得詳細的資訊：
+ [CPU 訓練](#Instance-XGBoost-training-cpu)
+ [GPU 訓練](#Instance-XGBoost-training-gpu)
+ [分散式 GPU 訓練](#Instance-XGBoost-distributed-training-cpu)
+ [分散式 GPU 訓練](#Instance-XGBoost-distributed-training-gpu)
+ [Inference](#Instance-XGBoost-inference)

### 培訓
<a name="Instance-XGBoost-training"></a>

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

#### CPU 訓練
<a name="Instance-XGBoost-training-cpu"></a>

SageMaker AI XGBoost 1.0-1 或之前版本，僅使用 CPU 進行訓練。這是一個記憶體限制型 (相對於運算限制型) 的演算法。因此，一般用途的運算執行個體 (如 M5) 相較於運算最佳化執行個體 (如 C4)，是較好的選擇。此外，我們建議您在所選執行個體中需有足夠的總記憶體才可保留訓練資料。它支援使用磁碟空間來處理不符合主要記憶體的資料。這是 libsvm 輸入模式的核心外功能的結果。即使如此，將快取檔案寫入磁碟也會減慢演算法處理時間。

#### GPU 訓練
<a name="Instance-XGBoost-training-gpu"></a>

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

SageMaker AI XGBoost 1.2-2 版或更新的版本支援 P2、P3、G4dn 和 G5 GPU 執行個體系列。

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

SageMaker AI XGBoost 3.0-5 版或更新版本支援 G4dn 和 G5 GPU 執行個體系列。請注意，由於運算容量需求，3.0-5 版或更新版本不支援 P3 執行個體系列。

若要利用 GPU 訓練：
+ 將執行個體類型指定為其中一個 GPU 執行個體 （例如 G4dn) 
+ 在您現有的 XGBoost 指令碼中將 `tree_method` 超參數設定為 `gpu_hist`

### 分散式訓練
<a name="Instance-XGBoost-distributed-training"></a>

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

#### 分散式 GPU 訓練
<a name="Instance-XGBoost-distributed-training-cpu"></a>

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

##### 分割輸入資料予多個執行個體
<a name="Instance-XGBoost-distributed-training-divide-data"></a>

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

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

1. 建立您的[訓練輸入](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)時，請將分配參數設定為 `ShardedByS3Key`。使用此設定，如果在訓練任務中指定了 *n* 個執行個體，則每個執行個體在 S3 中取得的檔案數量約為 *1/n*。

#### 分散式 GPU 訓練
<a name="Instance-XGBoost-distributed-training-gpu"></a>

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

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

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

如果出現以下情況，則必須將輸入資料分割予全數的執行個體：
+ 您使用 XGBoost 1.2-2 版到 1.3-1 版。
+ 您不需要使用多 GPU 執行個體。

 如需詳細資訊，請參閱[分割輸入資料予多個執行個體](#Instance-XGBoost-distributed-training-divide-data)。

**注意**  
1.2-2 至 1.3-1 版的 SageMaker AI XGBoost 每個執行個體只使用一個 GPU，即使您選擇了多 GPU 執行個體亦然。

**用多 GPU 執行個體進行分散式訓練**

從 1.5-1 版開始，SageMaker AI XGBoost 以 [Dask](https://www.dask.org/) 提供分散式 GPU 訓練。使用 Dask，您可以在使用一個或多個多 GPU 執行個體時，用上所有的 GPU。在使用單一 GPU 執行個體時也可以使用 Dask。

使用下列步驟以 Dask 進行訓練：

1. 您可以省略[訓練輸入](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)中的 `distribution` 參數，或將其設定為 `FullyReplicated`。

1. 定義超參數時，請將 `use_dask_gpu_training` 設定為 `"true"`。

**重要**  
Dask 的分散式訓練僅支援 CSV 和 Parquet 輸入格式。如果您使用其他資料格式 (例如 LIBSVM 或 PROTOBUF)，則訓練工作會失敗。  
對於 Parquet 資料，請確保欄的名稱儲存為字串。名稱為其他資料類型的欄將無法載入。

**重要**  
Dask 的分散式訓練不支援管道模式。如果指定管道模式，則訓練工作會失敗。

以 Dask 訓練 SageMaker AI XGBoost 時，有些事項需要注意。請務必將您的資料分割成較小的檔案。Dask 讀取每個 Parquet 檔案時，將其視為一個分割區。每個 GPU 都有一個 Dask 工作者。因此檔案數量應大於 GPU 的總數 (執行個體數 \* 每個執行個體的 GPU 數)。有大量的檔案也會降低效能。如需詳細資訊，請參閱 [Dask 最佳實務](https://docs.dask.org/en/stable/best-practices.html)。

#### 輸出的變化
<a name="Instance-XGBoost-distributed-training-output"></a>

指定的超參數 `tree_method` 會決定用於 XGBoost 訓練的演算法。樹方法 `approx`、`hist` 和 `gpu_hist` 都是近似法，且使用草圖進行分位數計算。如需詳細資訊，請參閱 XGBoost 文件中的[樹方法](https://xgboost.readthedocs.io/en/stable/treemethod.html)一節。草圖是一種近似值演算法。因此，您可以預期模型會有變化，這取決於一些因素，例如選擇用於分散式訓練的工作者數量。變化的意義與資料有關。

### Inference
<a name="Instance-XGBoost-inference"></a>

SageMaker AI XGBoost 支援以 CPU 和 GPU 執行個體進行推論。如需用於推論之執行個體類型的相關資訊，請參閱 [Amazon SageMaker AI ML 執行個體類型](https://aws.amazon.com/sagemaker/pricing/)。