修改訓練指令碼以指派執行個體群組 - Amazon SageMaker

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

修改訓練指令碼以指派執行個體群組

使用先前章節中的異質叢集組態,您已為 SageMaker 訓練任務準備了訓練環境和執行個體。若要將執行個體群組進一步指派給特定訓練和資料處理任務,下個步驟為修改訓練指令碼。根據預設,訓練任務只會為所有節點建立訓練指令碼複本,不論執行個體的大小皆如此,而這可能導致效能的損失。

例如,如果您在將深度神經網路訓練指令碼傳遞至 SageMaker 估算器的entry_point引數時混合異質叢集中的GPU執行個體CPU和執行個體,則entry_point指令碼會複寫至每個執行個體。這表示,如果沒有適當的任務指派,CPU執行個體也會執行整個指令碼,並啟動專為GPU執行個體分散式訓練所設計的訓練任務。因此,您必須變更要卸載並在CPU執行個體上執行的特定處理函數。您可以使用 SageMaker 環境變數來擷取異質叢集的資訊,並讓特定程序相應地執行。

當您的訓練任務開始時,訓練指令碼會讀取包含異質叢集組態 SageMaker 的訓練環境資訊。組態包含目前執行個體群組、每個群組中目前的主機,以及目前主機所在的群組等資訊。

您可以在訓練任務的 SageMaker初始化階段以下列方式查詢執行個體群組資訊。

(建議) 使用 SageMaker 訓練工具組讀取執行個體群組資訊

使用SageMaker 訓練工具組程式庫提供的環境 Python 模組。工具組程式庫預先安裝在 TensorFlow 和 的SageMaker 架構容器中 PyTorch,因此在使用預先建置的容器時,您不需要額外的安裝步驟。這是擷取訓練指令碼中程式碼變更較少 SageMaker 的環境變數的建議方法。

from sagemaker_training import environment env = environment.Environment()

與一般 SageMaker 訓練和異質叢集相關的環境變數:

  • env.is_hetero — 無論是否已設定異質叢集,都會傳回布林值結果。

  • env.current_host — 傳回目前的主機。

  • env.current_instance_type — 傳回目前主機的執行個體類型。

  • env.current_instance_group — 傳回目前執行個體群組的名稱。

  • env.current_instance_group_hosts — 傳回目前執行個體群組中的主機清單。

  • env.instance_groups — 傳回用於訓練的執行個體群組名稱清單。

  • env.instance_groups_dict — 傳回訓練任務的整個異質叢集組態。

  • env.distribution_instance_groups – 傳回指派給 SageMaker 估算器類別distribution參數的執行個體群組清單。

  • env.distribution_hosts – 傳回屬於指派給 SageMaker 估算器類別distribution參數之執行個體群組的主機清單。

例如,請考慮下列包含兩個執行個體群組的異質叢集範例。

from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 2)

範例異質叢集 env.instance_groups_dict 的輸出格式應類似以下內容。

{ "instance_group_1": { "hosts": [ "algo-2" ], "instance_group_name": "instance_group_1", "instance_type": "ml.c5.18xlarge" }, "instance_group_2": { "hosts": [ "algo-3", "algo-1" ], "instance_group_name": "instance_group_2", "instance_type": "ml.p3dn.24xlarge" } }

(選用) 從資源組態JSON檔案讀取執行個體群組資訊

如果您偏好以 JSON 格式擷取環境變數,則可以直接使用資源組態JSON檔案。 SageMaker 訓練執行個體中的JSON檔案/opt/ml/input/config/resourceconfig.json預設為位於 。

file_path = '/opt/ml/input/config/resourceconfig.json' config = read_file_as_json(file_path) print(json.dumps(config, indent=4, sort_keys=True))