GKEで機械学習ジョブを実行しようとしていますが、GPUを使用する必要があります。
this walkthrough で説明されているように、Tesla K80でノードプールを作成しました。
最小ノードサイズを0に設定し、オートスケーラーが自分のジョブに基づいて必要なノード数を自動的に決定することを望みました。
gcloud container node-pools create [POOL_NAME] \
--accelerator type=nvidia-tesla-k80,count=1 --zone [COMPUTE_ZONE] \
--cluster [CLUSTER_NAME] --num-nodes 3 --min-nodes 0 --max-nodes 5 \
--enable-autoscaling
最初は、GPUを必要とするジョブはないため、クラスターオートスケーラーはノードプールを0に正しく縮小します。
しかし、以下の仕様でジョブを作成すると
resources:
requests:
nvidia.com/gpu: "1"
limits:
nvidia.com/gpu: "1"
これが完全なジョブ設定です 。 (この構成は部分的に自動生成されることに注意してください。この問題に関係のないいくつかの環境変数も削除しました)。
ポッドはInsufficient nvidia.com/gpu
ノードプールを手動で少なくとも1つのノードに増やすまで。
これはGPUノードプールの現在の制限ですか、それとも何か見落としがありましたか?
オートスケーラーは、GPUノードプールのスケーリングをサポートしています(0を含む)。
この問題の考えられる理由の1つは、Node Auto-Provisioningを有効にし、リソース制限を設定した場合(UIまたは--max-cpu、max-memoryなどのgcloudフラグを介して)である場合)です。制限は、自動スケーリングを有効にして手動で作成したノードプールを含む、クラスター内のすべての自動スケーリングに適用されます(ドキュメントのメモを参照: https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto -provisioning#resource_limits )。
特に、NAPを有効にしていて、GPUでノードプールを自動スケーリングする場合は、 https://cloud.google.com/kubernetesで説明されているように、GPUのリソース制限を設定する必要があります。 -engine/docs/how-to/node-auto-provisioning#gpu_limits 。
最後に、自動プロビジョニングはGPUもサポートしているため、(上記のようにリソース制限を設定した場合)実際にGPUワークロード用のノードプールを作成する必要はありません-NAPによって自動的に作成されます。
===
また、将来の参考のために、オートスケーラーが一部のポッドのノードの作成に失敗した場合は、オートスケーラーイベントを使用してそれをデバッグすることができます。
kubectl describe pod <your-pod>
)には、2つのイベントのいずれかが表示されます(表示されるまでに1分かかる場合があります):kubectl get events -n kube-system | grep cluster-autoscaler
は、すべてのオートスケーラーアクション(スケールアップ、スケールダウン)を説明するイベントを提供します。スケールアップが試行されたが、何らかの理由で失敗した場合は、それを説明するイベントも含まれます。イベントは、作成後1時間のみKubernetesで使用できることに注意してください。 UIに移動し、Stackdriver-> Logging-> Logsに移動して、ドロップダウンで[GKE Cluster Operations]を選択すると、Stackdriverで履歴イベントを表示できます。
最後に、kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system
を実行して、オートスケーラーの現在のステータスを確認できます。