本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
修改訓練指令碼以指派執行個體群組
使用先前章節中的異質叢集組態,您已為 SageMaker 訓練任務準備了訓練環境和執行個體。若要將執行個體群組進一步指派給特定訓練和資料處理任務,下個步驟為修改訓練指令碼。根據預設,訓練任務只會為所有節點建立訓練指令碼複本,不論執行個體的大小皆如此,而這可能導致效能的損失。
例如,如果您在將深度神經網路訓練指令碼傳遞至 SageMaker 估算器的entry_point
引數時混合異質叢集中的GPU執行個體CPU和執行個體,則entry_point
指令碼會複寫至每個執行個體。這表示,如果沒有適當的任務指派,CPU執行個體也會執行整個指令碼,並啟動專為GPU執行個體分散式訓練所設計的訓練任務。因此,您必須變更要卸載並在CPU執行個體上執行的特定處理函數。您可以使用 SageMaker 環境變數來擷取異質叢集的資訊,並讓特定程序相應地執行。
當您的訓練任務開始時,訓練指令碼會讀取包含異質叢集組態 SageMaker 的訓練環境資訊。組態包含目前執行個體群組、每個群組中目前的主機,以及目前主機所在的群組等資訊。
您可以在訓練任務的 SageMaker初始化階段以下列方式查詢執行個體群組資訊。
(建議) 使用 SageMaker 訓練工具組讀取執行個體群組資訊
使用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))