Amazon SageMaker HyperPod でのカスタム Kubernetes ラベルとテイントの設定 - Amazon SageMaker AI

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon SageMaker HyperPod でのカスタム Kubernetes ラベルとテイントの設定

Amazon SageMaker HyperPod クラスターと Amazon Elastic Kubernetes Service (Amazon EKS) オーケストレーターは、インスタンスグループ内のノードのカスタム Kubernetes ラベルとテイントをサポートします。ラベルとテイントは、ポッドの配置とリソース使用率をきめ細かく制御できる、Kubernetes の基本的なスケジューリングと組織メカニズムです。

ラベルは、Kubernetes オブジェクトにアタッチできるキーと値のペアであり、属性に基づいてリソースを整理して選択できます。テイントは、許容範囲と組み合わせて動作し、許容範囲が一致しないポッドをリピートすることでポッドのスケジュールに影響を与えるノード固有のプロパティです。これらのメカニズムを組み合わせることで、ワークロードを分離し、ハードウェア仕様に従って割り当て、最適なリソース使用率を確保できます。

一般的なユースケース

以下は、カスタムラベルとテイントが有益な一般的なシナリオです。

  • 高価なインスタンスでのシステムポッドの防止 - GPU インスタンスにテイントを適用して、システムポッドやその他の重要でないワークロードが高価なコンピューティングリソースを消費するのを防ぎます。

  • 既存のツールとの統合 - 組織が確立したインフラストラクチャパターンとノードアフィニティ設定に一致するラベルを適用する

ラベルとテイントの設定

クラスター設定の KubernetesConfigパラメータを使用して、インスタンスグループレベルでカスタム Kubernetes ラベルとテイントを設定できます。ラベルとテイントはインスタンスグループ内のすべてのノードに適用され、クラスターのライフサイクルを通じて保持されます。

KubernetesConfig パラメータは宣言型です。つまり、インスタンスグループのラベルとテイントの完全な目的の状態を指定します。次に、SageMaker HyperPod はノードの実際の状態を、この目的の状態と一致するように調整します。

  • ラベルまたはテイントの追加 - に新しいラベルまたはテイントKubernetesConfigと、保持する既存のラベルまたはテイントを含めます。

  • ラベルまたはテイントの更新 - 変更するラベルまたはテイントKubernetesConfigの の値を変更し、保持する他のすべての値を含めます。

  • ラベルまたはテイントの削除 - から削除するラベルまたはテイントを から省略しKubernetesConfig、保持するラベルまたはテイントのみを保持します。

ラベルとテイントを含むクラスターの作成

新しい SageMaker HyperPod クラスターを作成するときは、インスタンスグループ設定に KubernetesConfigパラメータを含めます。次の例は、カスタムラベルとテイントを使用してクラスターを作成する方法を示しています。

{ "ClusterName": "my-cluster", "InstanceGroups": [{ "InstanceGroupName": "worker-group-1", "InstanceType": "ml.p4d.24xlarge", "InstanceCount": 4, "LifeCycleConfig": { "SourceS3Uri": "s3://my-bucket/lifecycle-config.sh", "OnCreate": "on-create.sh" }, "ExecutionRole": "arn:aws:iam::123456789012:role/HyperPodExecutionRole", "ThreadsPerCore": 1, "KubernetesConfig": { "Labels": { "env": "prod", "team": "ml-training", "gpu-type": "a100" }, "Taints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }, { "key": "dedicated", "value": "ml-workloads", "effect": "NoExecute" }] } }], "VpcConfig": { "SecurityGroupIds": ["sg-0123456789abcdef0"], "Subnets": ["subnet-0123456789abcdef0", "subnet-0123456789abcdef1"] }, "Orchestrator": { "Eks": { "ClusterArn": "arn:aws:eks:us-west-2:123456789012:cluster/my-eks-cluster" } } }

この例では、以下のようになっています:

  • ラベル - env=prod、、 team=ml-trainingの 3 つのカスタムラベルが適用されます。 gpu-type=a100

  • テイント - 不要なポッドスケジューリングを防ぐように 2 つのテイントが設定されています

既存のクラスターのラベルとテイントの更新

UpdateCluster API を使用して、既存のクラスターのラベルとテイントを変更できます。次の例は、インスタンスグループの KubernetesConfig を更新する方法を示しています。

{ "ClusterName": "my-cluster", "InstanceGroups": [{ "InstanceGroupName": "worker-group-1", "KubernetesConfig": { "Labels": { "env": "prod", "team": "ml-training", "gpu-type": "a100", "cost-center": "ml-ops" }, "Taints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }] } }] }

ラベルとテイントを更新すると、SageMaker HyperPod はインスタンスグループ内のすべてのノードに変更を適用します。サービスは、DescribeClusterAPI を使用してモニタリングできる現在の状態から目的の状態への移行を管理します。

ラベルとテイントアプリケーションのモニタリング

SageMaker HyperPod にはAPIs が用意されています。

クラスターレベルのステータスの確認

DescribeCluster API を使用して、インスタンスグループレベルでラベルとテイントの現在の状態と必要な状態を表示します。次の例は、レスポンス構造を示しています。

{ "ClusterName": "my-cluster", "ClusterStatus": "InService", "InstanceGroups": [{ "InstanceGroupName": "worker-group-1", "InstanceType": "ml.p4d.24xlarge", "CurrentInstanceCount": 4, "TargetInstanceCount": 4, "KubernetesConfig": { "CurrentLabels": { "env": "prod", "team": "ml-training", "gpu-type": "a100" }, "DesiredLabels": { "env": "prod", "team": "ml-training", "gpu-type": "a100" }, "CurrentTaints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }], "DesiredTaints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }] } }] }

CurrentLabelsCurrentTaintsと一致するDesiredLabelsDesiredTaints、インスタンスグループ内のすべてのノードに指定された設定が適用されます。異なる場合、クラスターは変更を適用中です。

個々のノードのステータスの確認

ノードレベルの詳細については、 DescribeClusterNode API を使用して個々のノードのラベルとテイント設定を確認します。次の例は、レスポンス構造を示しています。

{ "NodeDetails": { "InstanceId": "i-0123456789abcdef0", "InstanceGroupName": "worker-group-1", "InstanceType": "ml.p4d.24xlarge", "InstanceStatus": { "Status": "Running", "Message": "Node is healthy" }, "LifeCycleConfig": { "SourceS3Uri": "s3://my-bucket/lifecycle-config.sh", "OnCreate": "on-create.sh" }, "LaunchTime": 1699564800.0, "KubernetesConfig": { "CurrentLabels": { "env": "prod", "team": "ml-training", "gpu-type": "a100" }, "DesiredLabels": { "env": "prod", "team": "ml-training", "gpu-type": "a100" }, "CurrentTaints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }], "DesiredTaints": [{ "key": "gpu", "value": "true", "effect": "NoSchedule" }] } } }

ノードレベルのモニタリングは、ラベルやテイントが特定のノードに正しく適用されていない場合や、特定のインスタンスの設定を検証する必要がある場合のトラブルシューティングに役立ちます。

予約済みプレフィックス

特定のプレフィックスはシステム用に予約されており、カスタムラベルやテイントには使用しないでください。以下のプレフィックスが予約されています。

  • kubernetes.io/ - Kubernetes コアコンポーネント用に予約

  • k8s.io/ - Kubernetes コアコンポーネント用に予約

  • sagemaker.amazonaws.com/ - SageMaker HyperPod 用に予約済み

  • eks.amazonaws.com/ - Amazon EKS 用に予約済み

  • k8s.aws/ - Amazon EKS 用に予約済み

  • karpenter.sh/ - Karpenter 自動スケーリング用に予約

これらのプレフィックスを持つラベルとテイントはシステムコンポーネントによって管理されるため、カスタム値で上書きしないでください。