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

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

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

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

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

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

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

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

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

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

Тип экземпляра по умолчанию специально использует минимальные ресурсы. Чтобы обеспечить выполнение всех рабочих нагрузок машинного обучения с соответствующими ресурсами (например, ресурсами 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"

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

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

Создание типа пользовательского экземпляра должно соответствовать следующим параметрам и правилам определения, иначе не удается:

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

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

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 (v2), укажите его имя как часть раздела свойств resources в YAML-файле задания. Рассмотрим пример.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
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 (v2), укажите его имя в свойстве instance_type в YAML-файле развертывания. Рассмотрим пример.

$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
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 для развертывания модели.

Important

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

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

Используйте раздел resources, чтобы определить потребление ресурсов и лимит для развертываний модели. Рассмотрим пример.

$schema: https://azuremlschemas.azureedge.net/latest/kubernetesOnlineDeployment.schema.json
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 определение ресурса должно быть допустимым и соответствовать следующим правилам. Недопустимое определение ресурса приводит к сбою развертывания модели.

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

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

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

Дальнейшие действия