

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

# 在 Amazon SageMaker AI 中使用增量訓練
<a name="incremental-training"></a>

一段時間後，您可能會發現模型產生的推論不如過去那麼精準。使用增量訓練時，您可以使用現有模型的成品，並使用擴充的資料集來訓練新的模型。增量訓練可節省時間和資源。

使用增量訓練時，可執行下列作業：
+ 使用擴充的資料集訓練新模型，而該資料集包含先前訓練未掌握且會導致模型效能不佳的基礎模式。
+ 使用可從訓練任務中公開取得之熱門模型的模型成品或部分模型成品。您不需要從頭開始訓練新的模型。
+ 繼續之前停止的訓練任務。
+ 透過不同的超參數設定或使用不同的資料集，訓練多個版本的模型。

如需訓練任務的更多資訊，請參閱[使用 Amazon SageMaker 訓練模型](how-it-works-training.md)。

您可以使用 SageMaker AI 主控台或 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 增量訓練。

**重要**  
目前只有三種內建演算法支援累加式訓練：[物件偵測 - MXNet](object-detection.md)、[影像分類 - MXNet](image-classification.md)和[語意分割演算法](semantic-segmentation.md)。

**Topics**
+ [執行增量訓練 (主控台)](#incremental-training-console)
+ [執行增量訓練 (API)](#incremental-training-api)

## 執行增量訓練 (主控台)
<a name="incremental-training-console"></a>

若要完成此程序，您需要：
+ 儲存訓練資料的 Amazon Simple Storage Service (Amazon S3) 儲存貯體 URI。
+ 用來儲存工作輸出的 S3 儲存貯體 URI。
+ 儲存訓練程式碼的 Amazon 彈性容器登錄檔路徑。如需更多資訊，請參閱 [Docker 登錄檔路徑和範例程式碼](https://docs.aws.amazon.com/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths)。
+ S3 儲存貯體的 URL；您已在其中存放要用於增量訓練的模型成品。若要尋找模型成品的 URL，請參閱用來建立模型的訓練任務詳細資訊頁面。若要尋找詳細資訊頁面，請在 SageMaker AI 主控台中，選擇**推論**、選擇**模型**，然後選擇該模型。

若要重新啟動已停止的訓練任務，請使用存放在詳細資訊頁面中的模型成品 URL，就像您使用模型或已完成的訓練任務一樣。

**執行增量訓練 (主控台)**

1. 開啟 Amazon SageMaker AI 主控台，網址為 [https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在導覽窗格中，選擇**訓練**，然後選擇**訓練工作**。

1. 選擇**建立訓練工作**。

1. 提供訓練任務的名稱。名稱在 AWS 帳戶中的 AWS 區域內必須是唯一的。訓練任務名稱必須有 1 到 63 個字元。有效字元：a-z、A-Z、0-9 和 . : \+ = @ \_ % - (連字號)。

1. 選擇您想要使用的演算法。如需演算法的資訊，請參閱[Amazon SageMaker 中的內建演算法和預先訓練模型](algos.md)。

1. (選用) 針對 **Resource configuration (資源組態)**，請保留預設值或增加資源使用量，以縮短運算時間。

   1. (選用) 針對**執行個體類型**，選擇您想要使用的機器學習 (ML) 運算執行個體類型。在大部分的情況下，**ml.m4.xlarge** 就足夠。

   1. 針對 **Instance count (執行個體計數)**，使用預設值 1。

   1. (選用) 針對 **Additional volume per instance (GB) (每個執行個體的額外磁碟區 (GB))**，選擇您要佈建的機器學習 (ML) 儲存磁碟區大小。在大多數情況下，您可以使用預設值 1。如要使用大型資料集，請使用較大的大小。

1. 提供訓練資料集的輸入資料資訊。

   1. 針對 **Channel name (頻道名稱)**，可保留預設值 (**train**) 或輸入更有意義的訓練資料集名稱，例如 **expanded-training-dataset**。

   1. 針對 **InputMode**，選擇 **File (檔案)**。針對增量訓練，您需要使用檔案輸入模式。

   1. 針對 **S3 data distribution type (S3 資料分佈類型)**，選擇 **FullyReplicated**。這可讓每個機器學習 (ML) 運算執行個體在漸進訓練時使用擴充的資料集。

   1. 如果已擴展資料集是未壓縮形式，請將 **Compression type (壓縮類型)** 設定為 **None (無)**。如果已擴展資料集是使用 Gzip 壓縮，請將它設為 **Gzip**。

   1. (選用) 如果您使用的是檔案輸入模式，請將 **Content type (內容類型)** 保留空白。針對管道輸入模式，請指定適當的 MIME 類型。*內容類型*是資料的多用途網際網路郵件延伸 (MIME) 類型。

   1. 針對 **Record wrapper (記錄包裝函式)**，如果資料集是以 RecordIO 格式儲存，請選擇 **RecordIO**。如果您的資料集未儲存為 RecordIO 格式的檔案，請選擇 **None (無)**。

   1. 針對 **S3 資料類型**，如果資料集儲存為單一檔案，請選擇 **S3Prefix**。如果資料集是儲存為資料夾中的多個檔案，請選擇 **Manifest (資訊清單)**。

   1. 針對 **S3 location (S3 位置)**，請提供您存放已擴展資料集的 URL 路徑。

   1. 選擇**完成**。

1. 若要在訓練任務中使用模型成品，您需要新增一個新的頻道，並提供所需的模型成品資訊。

   1. 針對 **Input data configuration (輸入資料組態)**，請選擇 **Add channel (新增頻道)**。

   1. 針對 **Channel name (頻道名稱)**，輸入 **model** 以將此頻道識別為模型成品的來源。

   1. 針對 **InputMode**，選擇 **File (檔案)**。模型成品會儲存為檔案。

   1. 針對 **S3 data distribution type (S3 資料分佈類型)**，選擇 **FullyReplicated**。這表示每個機器學習 (ML) 運算執行個體都應使用所有模型成品以進行訓練。

   1. 針對 **Compression type (壓縮類型)**，選擇 **None (無)**，因為我們要將模型用於頻道。

   1. 將 **Content type (內容類型)** 保留空白。內容類型是資料的多用途網際網路郵件延伸 (MIME) 類型。針對模型成品，我們將其空白。

   1. 將 **Record wrapper (記錄包裝函式)** 設為 **None (無)**，因為模型成品不會存放為 RecordIO 格式。

   1. 針對 **S3 data type (S3 資料類型)**，如果您使用的是內建演算法或會將模型存放為單一檔案的演算法，請選擇 **S3Prefix**。如果您使用的演算法會將模型存放為多個檔案，請選擇 **Manifest (資訊清單)**。

   1. 針對 **S3 location (S3 位置)**，請提供您存放模型成品的 URL 路徑。一般而言，模型的儲存名稱為 `model.tar.gz`。若要尋找模型成品的 URL，請在導覽窗格中，選擇 **Inference (推論)**，然後選擇 **Models (模型)**。從模型清單，選擇模型以顯示其詳細資訊頁面。模型成品的 URL 會列在 **Primary container (主要容器)** 下方。

   1. 選擇**完成**。

1. 針對**輸出資料組態**，提供下列資訊：

   1. 針對 **S3 位置**，輸入您想要存放輸出資料的 S3 儲存貯體路徑。

   1. (選用) 針對 **Encryption key (加密金鑰)**，您可以新增 AWS Key Management Service (AWS KMS) 加密金鑰來加密靜態的輸出資料。提供金鑰 ID 或其 Amazon Resource Number (ARN)。如需更多資訊，請參閱 [KMS 受管加密金鑰](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html)。

1. (選用) 針對**標籤**，在訓練工作中新增一或多個標籤。*標籤*是您可以定義並指派給 AWS 資源的中繼資料。在這種情況下，您可以使用標籤協助管理您的訓練任務。標籤是由您定義的鍵和值構成。例如，您可能想要建立一個標籤，其含 **Project** 鍵和指出訓練任務相關專案的值，例如 **Home value forecasts**。

1. 選擇**建立訓練工作**。SageMaker AI 建立並執行訓練任務。

完成訓練任務之後，剛訓練好的模型成品即會存放在 **S3 output path (S3 輸出路徑)** 下方 (您之前在 **Output data configuration (輸出資料組態)** 欄位中提供此路徑)。若要部署模型以取得預測，請參閱[將模型部署至 Amazon EC2](ex1-model-deployment.md)。

## 執行增量訓練 (API)
<a name="incremental-training-api"></a>

此範例說明如何利用 SageMaker AI API 來訓練使用 SageMaker AI 影像分類演算法和 [Caltech 256 影像資料集](https://data.caltech.edu/records/nyy15-4j048)的模型，然後使用第一個模型來訓練新模型。其使用 Amazon S3 做為輸入和輸出來源。如需如何使用累加式訓練的更多詳細資訊，請參閱 [incremental training sample notebook](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/imageclassification_caltech/Image-classification-incremental-training-highlevel.html)。

**注意**  
我們在此範例的增量訓練中使用原始資料集，但您可以使用不同的資料集，例如包含新增範例的資料集。將新的資料集上傳至 S3，並依據用來訓練新模型的 `data_channels` 變數進行調整。

取得授予必要許可並初始化環境變數的 AWS Identity and Access Management (IAM) 角色：

```
import sagemaker
from sagemaker import get_execution_role

role = get_execution_role()
print(role)

sess = sagemaker.Session()

bucket=sess.default_bucket()
print(bucket)
prefix = 'ic-incr-training'
```

取得適用於影像分類演算法的訓練影像：

```
from sagemaker.amazon.amazon_estimator import get_image_uri

training_image = get_image_uri(sess.boto_region_name, 'image-classification', repo_version="latest")
#Display the training image
print (training_image)
```

下載訓練和驗證資料集，然後上傳到 Amazon Simple Storage Service (Amazon S3)：

```
import os
import urllib.request
import boto3

# Define a download function
def download(url):
    filename = url.split("/")[-1]
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)

# Download the caltech-256 training and validation datasets
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-train.rec')
download('http://data.mxnet.io/data/caltech-256/caltech-256-60-val.rec')

# Create four channels: train, validation, train_lst, and validation_lst
s3train = 's3://{}/{}/train/'.format(bucket, prefix)
s3validation = 's3://{}/{}/validation/'.format(bucket, prefix)

# Upload the first files to the train and validation channels
!aws s3 cp caltech-256-60-train.rec $s3train --quiet
!aws s3 cp caltech-256-60-val.rec $s3validation --quiet
```

定義訓練超參數：

```
# Define hyperparameters for the estimator
hyperparams = { "num_layers": "18",
                "resize": "32",
                "num_training_samples": "50000",
                "num_classes": "10",
                "image_shape": "3,28,28",
                "mini_batch_size": "128",
                "epochs": "3",
                "learning_rate": "0.1",
                "lr_scheduler_step": "2,3",
                "lr_scheduler_factor": "0.1",
                "augmentation_type": "crop_color",
                "optimizer": "sgd",
                "momentum": "0.9",
                "weight_decay": "0.0001",
                "beta_1": "0.9",
                "beta_2": "0.999",
                "gamma": "0.9",
                "eps": "1e-8",
                "top_k": "5",
                "checkpoint_frequency": "1",
                "use_pretrained_model": "0",
                "model_prefix": "" }
```

建立估算器物件，並使用訓練和驗證資料集來訓練第一個模型：

```
# Fit the base estimator
s3_output_location = 's3://{}/{}/output'.format(bucket, prefix)
ic = sagemaker.estimator.Estimator(training_image,
                                   role,
                                   instance_count=1,
                                   instance_type='ml.p2.xlarge',
                                   volume_size=50,
                                   max_run=360000,
                                   input_mode='File',
                                   output_path=s3_output_location,
                                   sagemaker_session=sess,
                                   hyperparameters=hyperparams)

train_data = sagemaker.inputs.TrainingInput(s3train, distribution='FullyReplicated',
                                        content_type='application/x-recordio', s3_data_type='S3Prefix')
validation_data = sagemaker.inputs.TrainingInput(s3validation, distribution='FullyReplicated',
                                             content_type='application/x-recordio', s3_data_type='S3Prefix')

data_channels = {'train': train_data, 'validation': validation_data}

ic.fit(inputs=data_channels, logs=True)
```

若要使用模型來漸進訓練其他模型，請建立新的估算器物件，並針對 `model_uri` 輸入引數，使用模型成品 (在此範例中為 `ic.model_data`)：

```
# Given the base estimator, create a new one for incremental training
incr_ic = sagemaker.estimator.Estimator(training_image,
                                        role,
                                        instance_count=1,
                                        instance_type='ml.p2.xlarge',
                                        volume_size=50,
                                        max_run=360000,
                                        input_mode='File',
                                        output_path=s3_output_location,
                                        sagemaker_session=sess,
                                        hyperparameters=hyperparams,
                                        model_uri=ic.model_data) # This parameter will ingest the previous job's model as a new channel
incr_ic.fit(inputs=data_channels, logs=True)
```

完成訓練任務之後，剛訓練好的模型成品即會存放在 `S3 output path` 下方 (您之前在 `Output_path` 中提供此路徑)。若要部署模型以取得預測，請參閱[將模型部署至 Amazon EC2](ex1-model-deployment.md)。