Создание типов экземпляров и управление ими для эффективного использования вычислительных ресурсов
Типы экземпляров — это концепция Машинного обучения 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
раздел, система использует тип экземпляра для создания развертывания.