使用 SageMaker 託管的暖池進行訓練 - Amazon SageMaker

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

使用 SageMaker 託管的暖池進行訓練

SageMaker 受管理的暖集區可讓您在訓練工作完成後保留和重複使用佈建的基礎結構,以減少重複性工作負載的延遲,例如反覆實驗或連續執行許多工作。符合指定參數的後續訓練工作會在保留的暖集區基礎設施上執行,藉由減少佈建資源所花費的時間來加快啟動時間。

重要

SageMaker 受管暖集區是可計費的資源。如需詳細資訊,請參閱 帳單

運作方式

若要使用 SageMaker 受管暖集區並減少類似連續訓練工作之間的延遲,請建立指定其KeepAlivePeriodInSeconds值的訓練工作ResourceConfig。此值代表在暖集區中保留已設定的資源,以供後續訓練工作使用的持續時間 (以秒為單位)。如果您需要使用類似的組態執行數個訓練工作,您可以在不同的工作中使用專用的永久性快取目錄,來儲存和重複使用您的資訊,進一步減少延遲和應計費時間。

暖集區生命週期

  1. 建立 KeepAlivePeriodInSeconds 值大於 0 的初始訓練工作。當您執行第一個訓練工作時,這會以典型的啟動時間 “冷啟動” 一個叢集。

  2. 當第一個訓練工作完成時,佈建的資源會在 KeepAlivePeriodInSeconds 值指定的期間內,留在暖集區中保持作用狀態。只要叢集運作狀態良好且暖集區是在指定的 KeepAlivePeriodInSeconds 內,則暖集區狀態為 Available

  3. 暖集區會維持 Available,直到辨識出要重複使用的相符訓練工作,或者直到超過指定的 KeepAlivePeriodInSeconds 並終止。KeepAlivePeriodInSeconds 允許的最大時間長度為 3600 秒 (60 分鐘)。如果暖集區狀態為 Terminated,則此暖集區的生命週期結束。

  4. 如果暖集區辨識出規格相符 (例如執行個體計數或執行個體類型) 的第二個訓練工作,則暖集區會從第一個訓練工作移至第二個訓練工作,以供重複使用。第一個訓練工作暖集區的狀態變成 Reused。第一個訓練工作的暖集區生命週期結束。

  5. 重複使用暖集區的第二個訓練工作的狀態會變成 InUse。訓練工作完成之後,暖集區會在第二個訓練工作指定的 KeepAlivePeriodInSeconds 時間內保持 Available。暖集區可以接續用於後續相符訓練工作,最多至 28 天。

  6. 如果暖集區無法再重複使用,則暖集區狀態為 Terminated。如果使用者終止暖集區以更新修補程式,或超過指定的 KeepAlivePeriodInSeconds,則無法再使用暖集區。

如需暖池狀態選項的詳細資訊,請參閱 Amazon SageMaker API 參考WarmPoolStatus中的。

暖集區建立

如果初始訓練工作已順利完成,且 KeepAlivePeriodInSeconds 值大於 0,則會建立暖集區。如果您在叢集啟動後停止訓練工作,則仍會保留暖集區。如果訓練工作因演算法或用戶端錯誤而失敗,則仍會保留暖集區。如果訓練工作因任何其他可能會影響叢集健康狀態的原因而失敗,則不會建立暖集區。

若要驗證是否成功建立暖集區,請檢查訓練工作的暖集區狀態。如果成功佈建暖集區,則暖集區狀態為 Available。如果無法佈建暖集區,則暖集區狀態為 Terminated

符合的訓練任務

若要保留暖集區,它必須在 KeepAlivePeriodInSeconds 值指定的時間內,找到符合的訓練工作。如果下列值相同,則下一個訓練工作即完全相同:

  • RoleArn

  • ResourceConfig 值:

    • InstanceCount

    • InstanceType

    • VolumeKmsKeyId

    • VolumeSizeInGB

  • VpcConfig 值:

    • SecurityGroupIds

    • Subnets

  • EnableInterContainerTrafficEncryption

  • EnableNetworkIsolation

  • 如果您傳遞訓練工作的階段作業標籤,且在訓練工作TrueEnableSessionTagChaining設定為SessionChainingConfig,則相符的訓練工作也必須設定EnableSessionTagChaining為,True且具有相同的工作階段索引鍵。如需詳細資訊,請參閱 以屬性為基礎的存取控制 (ABAC),適用於多租戶訓練

這些值都必須相同,暖集區才能移至後續的訓練工作供重複使用。

暖集區最長上限持續時間

單一訓練任務的 KeepAlivePeriodInSeconds 上限為 3600 秒 (60 分鐘),暖集區叢集可繼續執行連續訓練任務的時間最長上限為 28 天。

每個後續訓練工作也必須指定一個 KeepAlivePeriodInSeconds 值。當暖集區移至下一個訓練工作時,它會承襲該訓練工作中 ResourceConfig 內指定的新 KeepAlivePeriodInSeconds 值。通過這種方式,您可以讓暖集區從一個訓練工作移至下一個,最多可以維持 28 天。

如果 KeepAlivePeriodInSeconds 未指定,則暖集區會在訓練工作完成後結束。

使用持久性快取

當您建立暖池時,會在磁碟區上 SageMaker 裝載一個特殊目錄,該目錄將在整個溫暖池的生命週期中持續存在。此目錄也可用於儲存您要在其他工作中重複使用的資料。

對於需要以下條件的作業,與單獨使用暖集區相比,使用持久性快取可以減少延遲和應計費時間:

  • 以相似的組態多次互動

  • 累加式訓練工作

  • 超參數最佳化

例如,您可以在持久性快取目錄中設置 pip 快取目錄,藉此避免在重複執行時下載相同的 Python 相依性。此目錄的內容完全由您負責管理。以下是您可以放進持久性快取中的資料類型範例,以助於減少延遲和應計費時間。

  • 由 pip 管理的相依性。

  • 由 conda 管理的相依性。

  • 檢查點資訊

  • 訓練期間產生的一切其他資訊。

持久性快取的位置為 /opt/ml/sagemaker/warmpoolcache。環境變數 SAGEMAKER_MANAGED_WARMPOOL_CACHE_DIRECTORY 指向持久性快取目錄的位置。

下列程式碼範例會示範如何設定暖集區,並使用持久性快取來儲存 pip 相依性,以便在後續作業中使用。後續工作必須在參數 keep_alive_period_in_seconds 指定的時間範圍內執行。

import sagemakerfrom sagemaker import get_execution_rolefrom sagemaker.tensorflow import TensorFlow # Creates a SageMaker session and gets execution role session = sagemaker.Session() role = get_execution_role() # Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='2.2', py_version='py37', job_name='my-training-job-1', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 1, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, environment={"PIP_CACHE_DIR": "/opt/ml/sagemaker/warmpoolcache/pip"} )

在先前的程式碼範例中,使用環境參數匯出環境變數 PIP_CACHE_DIRECTORY 以指向目錄 /opt/ml/sagemaker/warmpoolcache/pip。匯出此環境變數將變更 pip 將快取儲存至新地點的位置。您在持久性快取目錄中建立的一切目錄 (包括巢狀目錄) 都可以在後續的訓練執行期間重複使用。在先前的代碼範例中,名為 pip 的目錄被更改為預設位置,以快取使用 pip 安裝的一切相依性。

您也可以使用環境變數從 Python 訓練指令碼中存取持久性快取位置,如下列程式碼範例所示。

import os import shutil if __name__ == '__main__': PERSISTED_DIR = os.environ["SAGEMAKER_MANAGED_WARMPOOL_CACHE_DIRECTORY"] # create a file to be persisted open(os.path.join(PERSISTED_DIR, "test.txt"), 'a').close() # create a directory to be persisted os.mkdir(os.path.join(PERSISTED_DIR, "test_dir")) # Move a file to be persisted shutil.move("path/of/your/file.txt", PERSISTED_DIR)

帳單

SageMaker 受管暖集區是可計費的資源。擷取訓練工作的暖集區狀態,以檢查暖集區的應計費時間。您可以透過使用 Amazon SageMaker 控制台或直接透過 DescribeTrainingJobAPI 命令來檢查暖池狀態。如需詳細資訊,請參閱 Amazon SageMaker API 參考資料WarmPoolStatus中的。

注意

在參數 KeepAlivePeriodInSeconds 指定的時間結束後,暖集區和持久性快取都會關閉,內容並將遭到刪除。

暖集區資源限制

若要開始使用,您必須先要求提高 SageMaker 受管暖集區的服務限制。暖集區的預設資源限制為 0。

如果使用指定 KeepAlivePeriodInSeconds 的方式建立訓練工作,但並未要求提高暖集區限制,則在完成訓練工作後暖集區不會保留。只有當暖集區限制有足夠的資源時,才會建立暖集區。建立暖集區之後,當移至相符的訓練工作或 KeepAlivePeriodInSeconds 過期 (如果暖集區狀態為 ReusedTerminated) 時,就會釋放資源。

請求增加暖集區配額

使用 AWS Service Quotas 主控台要求增加暖池配額。

注意

所有暖池執行個體使用量都會計入您的 SageMaker 訓練資源限制。增加暖集區資源限制並不會提高執行個體限制,而是會將您的資源限制的子集配置給暖集區訓練。

  1. 開啟 AWS Service Quotas 主控台

  2. 在左側導覽面板上,選擇 AWS 服務

  3. 搜索並選擇 Amazon SageMaker

  4. 搜尋關鍵字 warm pool 以查看全部可用的暖集區服務配額。

  5. 尋找您要增加暖集區配額的執行個體類型,選取該執行個體類型的暖集區服務配額,然後選擇 請求配額增加

  6. 變更配額值 內輸入您請求的執行個體限制數目。新的值必須大於目前的 已套用的配額值

  7. 選擇 請求

您可以為每個帳戶保留的執行個體數目有限制,這依照執行個體類型。您可以在 AWS Service Quotas 主控台中檢查資源限制,或直接使用 list-service-quotas AWS CLI 命令來檢查資源限制。如需 AWS Service Quotas 的更多資訊,請參閱 Service Quotas 使用者指南中的請求增加配額

您還可以使用 AWS 支援中心 請求增加暖集區配額。如需根據區域提供的可用執行個體類型清單,請參閱 Amazon SageMaker 定價,然後選擇隨需定價表中的訓練

如何使用 SageMaker 受管理的暖池

您可以透 SageMaker 過 SageMaker Python SDK、Amazon SageMaker 主控台或透過低階 API 使用受管暖集區。管理員可以選擇性地使用 sagemaker:KeepAlivePeriod 條件索引鍵,進一步限制特定使用者或群組的 KeepAlivePeriodInSeconds 範圍。

使用開 SageMaker Python 套件

使用 SageMaker Python SDK 建立、更新或終止暖池。

注意

此功能可在 SageMaker Python 開發套件 v2.110. 0 及更新版本中使用。

建立暖集區

若要建立暖池,請使用 SageMaker Python SDK 建立keep_alive_period_in_seconds值大於 0 的估算器,然後呼叫。fit()訓練工作完成時,會保留一個暖集區。如需有關訓練指令碼和估算器的詳細資訊,請參閱使用 SageMaker Python SDK 訓練模型。如果您的指令碼尚未建立暖集區,請參閱暖集區建立取得可能的問題說明。

import sagemaker from sagemaker import get_execution_role from sagemaker.tensorflow import TensorFlow # Creates a SageMaker session and gets execution role session = sagemaker.Session() role = get_execution_role() # Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='2.2', py_version='py37', job_name='my-training-job-1', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 1, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, ) # Starts a SageMaker training job and waits until completion estimator.fit('s3://my_bucket/my_training_data/')

接下來,建立第二個相符的訓練工作。在這個範例中,我們建立 my-training-job-2 以進行實驗,它具有與 my-training-job-1 符合的所有必要的屬性,但有一個不同的超參數。第二個訓練工作重複使用暖集區,並且比第一個訓練工作更快啟動。下列程式碼範例使用 Tensorflow 估算器。暖池功能可與在 Amazon 上執行的任何訓練演算法搭配使用 SageMaker。如需哪些屬性必須符合的更多資訊,請參閱符合的訓練任務

# Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='py37', py_version='pyxy', job_name='my-training-job-2', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 2, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, ) # Starts a SageMaker training job and waits until completion estimator.fit('s3://my_bucket/my_training_data/')

檢查兩個訓練工作的暖集區狀態,以確認 my-training-job-1 的暖集區為 Reused,而 my-training-job-2 的為InUse

注意

訓練任務名稱有日期/時間尾碼。範例訓練任務名稱 my-training-job-1my-training-job-2 應以實際的訓練任務名稱取代。您可以透過命令 estimator.latest_training_job.job_name 來擷取實際的訓練任務名稱。

session.describe_training_job('my-training-job-1') session.describe_training_job('my-training-job-2')

describe_training_job 的結果會提供指定的訓練任務的所有更多資訊。尋找 WarmPoolStatus 屬性以檢視關於訓練任務暖集區的資訊。您的輸出應該類似以下範例內容:

# Warm pool status for training-job-1 ... 'WarmPoolStatus': {'Status': 'Reused', 'ResourceRetainedBillableTimeInSeconds': 1000, 'ReusedByName': my-training-job-2} ... # Warm pool status for training-job-2 ... 'WarmPoolStatus': {'Status': 'InUse'} ...

更新暖集區

當訓練工作完成且暖集區狀態為 Available 時,您可以更新 KeepAlivePeriodInSeconds 的值。

session.update_training_job(job_name, resource_config={"KeepAlivePeriodInSeconds":3600})

終止暖集區

若要手動終止暖集區,請將 KeepAlivePeriodInSeconds 的值設定為 0。

session.update_training_job(job_name, resource_config={"KeepAlivePeriodInSeconds":0})

當暖集區超過指定的 KeepAlivePeriodInSeconds 值或叢集有修補程式更新時,就會自動終止。

使用 Amazon SageMaker 控制台

透過主控台,您可以建立暖集區、釋放暖集區,或檢查特定訓練工作的暖集區狀態和應計費時間。您還可以查看哪些相符的訓練任務重複使用了暖集區。

  1. 開啟 Amazon 主 SageMaker 控台,然後從導覽窗格中選擇 [訓練任務]。如果適用,每個訓練工作的暖集區狀態會顯示在 暖集區狀態 欄內,而使用中暖集區的剩餘時間則會顯示在 剩餘時間 欄內。

  2. 若要從主控台建立使用暖集區的訓練工作,請選擇 建立訓練任務。接著,在設定訓練工作資源時,請務必指定 保持作用期間 欄位的值。此值必須是介於 1 到 3600 之間的整數,表示持續時間,以秒為單位。

  3. 若要從主控台釋放暖集區,請選取特定的訓練工作,然後從 動作 下拉式功能表選擇 發佈叢集

  4. 若要查看暖集區的更多資訊,請選擇一個訓練任務名稱。在工作詳細資料頁面中,向下捲動至 暖集區狀態 區段,尋找暖集區狀態、剩餘時間 (若暖集區狀態為 Available)、暖集區計費秒數,以及重複使用暖集區的訓練工作名稱 (若暖集區狀態為 Reused)。

使用低階 API SageMaker

搭配 SageMaker API 或 AWS CLI 使用 SageMaker 受管理的暖集區。

SageMaker API

透過下列指令使用 SageMaker API 設定 SageMaker 受管理的暖池:

AWS CLI

使用 AWS CLI 使用下列命令設定 SageMaker 受管理的暖集區:

IAM 條件索引鍵

管理員可以選擇性地使用sagemaker:KeepAlivePeriod條件索引鍵,進一步KeepAlivePeriodInSeconds限制特定使用者或群組的限制。 SageMaker 受管理暖池的KeepAlivePeriodInSeconds值限制為 3600 秒 (60 分鐘),但系統管理員可以視需要降低此限制。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceKeepAlivePeriodLimit", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob" ], "Resource": "*", "Condition": { "NumericLessThanIfExists": { "sagemaker:KeepAlivePeriod": 1800 } } } ] }

如需詳細資訊,請參閱服務授權參考 SageMaker中的 Amazon 條件金鑰

考量事項

使用 SageMaker 受管理的暖池時,請考慮下列項目。

  • SageMaker 受管理的暖池無法與異質叢集訓練搭配使用。

  • SageMaker 受管暖集區無法與競價型執行個體搭配使用。

  • SageMaker 受管暖池的KeepAlivePeriodInSeconds值限制為 3600 秒 (60 分鐘)。

  • 如果暖集區持續成功符合指定 KeepAlivePeriodInSeconds 數值的訓練工作,叢集最多只能繼續執行 28 天。