Пул узлов Google Kubernetes Engine не масштабируется автоматически с 0 узлов

Я пытаюсь запустить работу по машинному обучению в GKE, и мне нужно использовать графический процессор.

Я создал пул узлов с 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

Первоначально нет заданий, требующих графических процессоров, поэтому автоматическое масштабирование кластера правильно уменьшает пул узлов до 0.

Тем не менее, когда я создаю работу со следующей спецификацией

resources:
  requests:
    nvidia.com/gpu: "1"
  limits:
    nvidia.com/gpu: "1"

Вот полная конфигурация работы. (Обратите внимание, что эта конфигурация частично сгенерирована автоматически. Я также удалил некоторые переменные окружения, которые не имеют отношения к проблеме).

стручок застрял в ожидании Insufficient nvidia.com/gpu пока я вручную не увеличу пул узлов как минимум до 1 узла.

Это текущее ограничение пулов узлов GPU, или я что-то упустил?

1 ответ

Autoscaler поддерживает масштабирование пулов узлов графического процессора (в том числе от 0).

Одной из возможных причин этой проблемы является то, что вы включили автоматическую инициализацию узла и установили лимиты ресурсов (через пользовательский интерфейс или флаги gcloud, такие как --max-cpu, max-memory и т. Д.). Эти ограничения применяются ко ВСЕМ автоматическому масштабированию в кластере, включая пулы узлов, созданные вами вручную с включенным автоматическим масштабированием (см. Примечание в документации: https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning).

В частности, если вы включили NAP и хотите автоматически масштабировать пулы узлов с помощью графических процессоров, вам необходимо установить пределы ресурсов для графических процессоров, как описано в https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning.

Наконец, autoprovisioning также поддерживает графические процессоры, поэтому (при условии, что вы устанавливаете ограничения ресурсов, как описано выше), вам на самом деле не нужно создавать пул узлов для вашей рабочей нагрузки графического процессора - NAP создаст его автоматически.

===

Кроме того, для дальнейшего использования - если autoscaler не удается создать узлы для некоторых ваших модулей, вы можете попробовать отладить его с помощью событий autoscaler:

  • На твоем стручке (kubectl describe pod <your-pod>) должно быть одно из двух событий (это может занять минуту, пока они не появятся):
    • TriggeredScaleUp - это означает, что автоскалер решил добавить узел для этого модуля.
    • NotTriggerScaleUp - autoscaler обнаружил ваш модуль, но он не думает, что любой пул узлов может быть увеличен, чтобы помочь ему. В версии 1.12 и позже событие содержит список причин, по которым добавление узлов в разные пулы узлов не поможет модулю. Обычно это наиболее полезное событие для отладки.
  • kubectl get events -n kube-system | grep cluster-autoscaler предоставит вам события, описывающие все действия автоматического масштабирования (увеличение, уменьшение). Если попытка увеличения была предпринята, но по какой-то причине не удалась, то также будут события, описывающие это.

Обратите внимание, что события доступны в Кубернетесе только в течение 1 часа после их создания. Вы можете увидеть исторические события в Stackdriver, перейдя в пользовательский интерфейс и перейдя в Stackdriver->Logging->Logs и выбрав "GKE Cluster Operations" в раскрывающемся списке.

Наконец, вы можете проверить текущее состояние автоскалера, запустив kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system,

Другие вопросы по тегам