Создание типов экземпляров и управление ими для эффективного использования вычислительных ресурсов

Типы экземпляров — это концепция Машинного обучения Azure, которая позволяет ориентироваться на определенные типы вычислительных узлов для рабочих нагрузок обучения и вывода. Например, в виртуальной машине Azure тип экземпляра имеет тип STANDARD_D2_V3. В этой статье описано, как создавать типы экземпляров и управлять ими для требований к вычислениям.

В кластерах Kubernetes типы экземпляров представлены в пользовательском определении ресурсов (CRD), установленном с расширением Машинное обучение Azure. Два элемента в расширении Машинное обучение Azure представляют типы экземпляров:

  • Используйте nodeSelector , чтобы указать, на каком узле должен выполняться модуль pod. Узел должен иметь соответствующую метку.
  • В разделе ресурсов можно задать вычислительные ресурсы (ЦП, память и GPU NVIDIA) для модуля pod.

Если при развертывании расширения Машинное обучение Azure указать поле nodeSelector, nodeSelector поле будет применяться ко всем типам экземпляров. Это означает следующее.

  • Для каждого создаваемого типа экземпляра указанное nodeSelector поле должно быть подмножеством указанного nodeSelector расширения поля.
  • Если вы используете тип nodeSelectorэкземпляра, рабочая нагрузка будет выполняться на любом узле, который соответствует как указанному nodeSelector расширению полю, так и по указанному nodeSelector типу экземпляра.
  • Если вы используете тип экземпляра без nodeSelector поля, рабочая нагрузка будет выполняться на любом узле, который соответствует указанному nodeSelector расширению поле.

Создание типа экземпляра по умолчанию

По умолчанию вызывается тип defaultinstancetype экземпляра при присоединении кластера Kubernetes к рабочей области Машинное обучение Azure. Ниже приведено определение:

resources:
  requests:
    cpu: "100m"
    memory: "2Gi"
  limits:
    cpu: "2"
    memory: "2Gi"
    nvidia.com/gpu: null

Если поле не применяется nodeSelector , модуль pod можно запланировать на любом узле. Модули pod рабочей нагрузки назначаются по умолчанию с 0,1 ядра ЦП, 2 ГБ памяти и 0 GPU для запроса. Ресурсы, используемые модулями pod рабочей нагрузки, ограничены 2 ядрами ЦП и 8 ГБ памяти.

Тип экземпляра по умолчанию специально использует несколько ресурсов. Чтобы обеспечить выполнение всех рабочих нагрузок машинного обучения с соответствующими ресурсами (например, ресурс GPU), настоятельно рекомендуется создавать пользовательские типы экземпляров.

Помните следующие моменты о типе экземпляра по умолчанию:

  • defaultinstancetype не отображается как InstanceType пользовательский ресурс в кластере при выполнении команды kubectl get instancetype, но он отображается во всех клиентах (пользовательском интерфейсе, Azure CLI, SDK).
  • defaultinstancetype можно переопределить определение типа пользовательского экземпляра с тем же именем.

Создание типа пользовательского экземпляра

Чтобы создать новый тип экземпляра, создайте новый настраиваемый ресурс для типа экземпляра CRD. Например:

kubectl apply -f my_instance_type.yaml

Ниже приведено содержимое my_instance_type.yaml:

apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceType
metadata:
  name: myinstancetypename
spec:
  nodeSelector:
    mylabel: mylabelvalue
  resources:
    limits:
      cpu: "1"
      nvidia.com/gpu: 1
      memory: "2Gi"
    requests:
      cpu: "700m"
      memory: "1500Mi"

Предыдущий код создает тип экземпляра с помеченным поведением:

  • Модули pod запланированы только на узлах с меткой mylabel: mylabelvalue.
  • Модули Pod назначают запросы 700m ресурсов для ЦП и 1500Mi памяти.
  • Модули Pod назначаются ограничения 1 ресурсов ЦП, 2Gi памяти и 1 GPU NVIDIA.

Создание пользовательских типов экземпляров должно соответствовать следующим параметрам и правилам определения или завершается ошибкой:

Параметр Обязательно или необязательно Description
name Обязательное поле Строковые значения, которые должны быть уникальными в кластере.
CPU request Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Вы можете указать ЦП в милликорях; например, 100m. Вы также можете указать его в качестве полных чисел. Например, выражение "1" будет эквивалентно 1000m.
Memory request Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Можно указать память в виде полного числа и суффикса; например, 1024Mi для 1024 мебибайт (MiB).
CPU limit Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Вы можете указать ЦП в милликорях; например, 100m. Вы также можете указать его в качестве полных чисел. Например, выражение "1" будет эквивалентно 1000m.
Memory limit Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Можно указать память в виде полного числа и суффикса; Например, 1024Mi для 1024 МиБ.
GPU Необязательно Целые значения, которые можно указать только в limits разделе.
Дополнительные сведения см. в документации по Kubernetes.
nodeSelector Необязательно Сопоставление строковых ключей и значений.

Можно также создать несколько типов экземпляров одновременно:

kubectl apply -f my_instance_type_list.yaml

Ниже приведено содержимое my_instance_type_list.yaml:

apiVersion: amlarc.azureml.com/v1alpha1
kind: InstanceTypeList
items:
  - metadata:
      name: cpusmall
    spec:
      resources:
        requests:
          cpu: "100m"
          memory: "100Mi"
        limits:
          cpu: "1"
          nvidia.com/gpu: 0
          memory: "1Gi"

  - metadata:
      name: defaultinstancetype
    spec:
      resources:
        requests:
          cpu: "1"
          memory: "1Gi" 
        limits:
          cpu: "1"
          nvidia.com/gpu: 0
          memory: "1Gi"

В предыдущем примере создаются два типа экземпляров: cpusmall и defaultinstancetype. Это defaultinstancetype определение переопределяет defaultinstancetype определение, созданное при присоединении кластера Kubernetes к рабочей области Машинное обучение Azure.

Если вы отправляете рабочую нагрузку обучения или вывода без типа экземпляра, она используется defaultinstancetype. Чтобы указать тип экземпляра по умолчанию для кластера Kubernetes, создайте тип экземпляра с именем defaultinstancetype. Он автоматически распознается как значение по умолчанию.

Выбор типа экземпляра для отправки задания обучения

Чтобы выбрать тип экземпляра для задания обучения с помощью Azure CLI (версии 2), укажите его имя в разделе resources свойств в yamL задания. Например:

command: python -c "print('Hello world!')"
environment:
  image: library/python:latest
compute: azureml:<Kubernetes-compute_target_name>
resources:
  instance_type: <instance type name>

В предыдущем примере замените <Kubernetes-compute_target_name> имя целевого объекта вычислений Kubernetes. Замените <instance type name> именем типа экземпляра, который требуется выбрать. Если свойство не указано instance_type , система использует defaultinstancetype для отправки задания.

Выбор типа экземпляра для развертывания модели

Чтобы выбрать тип экземпляра для развертывания модели с помощью Azure CLI (версии 2), укажите его имя для instance_type свойства в yamL развертывания. Например:

name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model: 
  path: ./model/sklearn_mnist_model.pkl
code_configuration:
  code: ./script/
  scoring_script: score.py
instance_type: <instance type name>
environment: 
  conda_file: file:./model/conda.yml
  image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest

В предыдущем примере замените <instance type name> на имя типа экземпляра, который требуется выбрать. Если свойство не указано instance_type , система использует defaultinstancetype для развертывания модели.

Важно!

Для развертывания модели MLflow запрос ресурсов требует не менее 2 ядер ЦП и 4 ГБ памяти. В противном случае развертывание завершится ошибкой.

Проверка раздела ресурсов

Вы можете использовать resources раздел для определения запроса ресурсов и ограничения развертываний модели. Например:

name: blue
app_insights_enabled: true
endpoint_name: <endpoint name>
model: 
  path: ./model/sklearn_mnist_model.pkl
code_configuration:
  code: ./script/
  scoring_script: score.py
environment: 
  conda_file: file:./model/conda.yml
  image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
resources:
  requests:
    cpu: "0.1"
    memory: "0.2Gi"
  limits:
    cpu: "0.2"
    #nvidia.com/gpu: 0
    memory: "0.5Gi"
instance_type: <instance type name>

Если вы используете раздел, допустимое resources определение ресурсов должно соответствовать следующим правилам. Недопустимое определение ресурса приводит к сбою развертывания модели.

Параметр Обязательно или необязательно Description
requests:
cpu:
Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Вы можете указать ЦП в милликорях; например, 100m. Вы также можете указать его в полных числах. Например, выражение "1" будет эквивалентно 1000m.
requests:
memory:
Обязательное поле Строковые значения, которые не могут быть нулевыми или пустыми.
Можно указать память в виде полного числа и суффикса; Например, 1024Mi для 1024 МиБ.
Память не может быть меньше 1 МБ.
limits:
cpu:
Дополнительные
(требуется только в том случае, если требуется GPU)
Строковые значения, которые не могут быть нулевыми или пустыми.
Вы можете указать ЦП в милликорях; например, 100m. Вы также можете указать его в полных числах. Например, выражение "1" будет эквивалентно 1000m.
limits:
memory:
Дополнительные
(требуется только в том случае, если требуется GPU)
Строковые значения, которые не могут быть нулевыми или пустыми.
Можно указать память в виде полного числа и суффикса; например, 1024Mi для 1024 МиБ.
limits:
nvidia.com/gpu:
Дополнительные
(требуется только в том случае, если требуется GPU)
Целые значения, которые не могут быть пустыми и могут быть указаны только в limits разделе.
Дополнительные сведения см. в документации по Kubernetes.
Если требуется только ЦП, можно опустить весь limits раздел.

Тип экземпляра необходим для развертывания модели. Если вы определили resources раздел, и он будет проверен на основе типа экземпляра, правила приведены следующим образом:

  • При допустимом resource определении раздела ограничения ресурсов должны быть меньше ограничений типа экземпляра. В противном случае развертывание завершится ошибкой.
  • Если тип экземпляра не определен, система использует defaultinstancetype для проверки с помощью resources раздела.
  • Если вы не определите resources раздел, система использует тип экземпляра для создания развертывания.

Следующие шаги