Compartir a través de


Creación y administración de tipos de instancia para un uso eficaz de los recursos de proceso

Los tipos de instancias son un concepto de Azure Machine Learning que le permite concentrarse en determinados tipos de nodos de proceso para cargas de trabajo de entrenamiento e inferencia. Por ejemplo, en una máquina virtual de Azure, un tipo de instancia es STANDARD_D2_V3. En este artículo se explica cómo crear y administrar tipos de instancia para los requisitos de cálculo.

En los clústeres de Kubernetes, los tipos de instancias se representan en una definición de recursos personalizados (CRD) que se instala con la extensión de Azure Machine Learning. Dos elementos de la extensión de Azure Machine Learning representan los tipos de instancia:

  • Use nodeSelector para especificar en qué nodo debe ejecutarse un pod. El nodo debe tener una etiqueta correspondiente.
  • En la sección Recursos, puede definir los recursos de proceso (CPU, memoria y GPU de NVIDIA) del pod.

Si especifica un campo nodeSelector al implementar la extensión de Azure Machine Learning, el campo nodeSelector se aplicará a todos los tipos de instancia. Esto significa que:

  • Para cada tipo de instancia que cree, el campo nodeSelector especificado debe ser un subconjunto del campo nodeSelector especificado por la extensión.
  • Si usa un tipo de instancia con nodeSelector, la carga de trabajo se ejecutará en cualquier nodo que coincida con el campo nodeSelector especificado por la extensión y el campo nodeSelector especificado por el tipo de instancia.
  • Si usa un tipo de instancia sin un campo nodeSelector, la carga de trabajo se ejecutará en cualquier nodo que coincida con el campo nodeSelector especificado por la extensión.

Creación de un tipo de instancia predeterminado

De manera predeterminada, se crea un tipo de instancia denominado defaultinstancetype al asociar un clúster de Kubernetes a un área de trabajo de Azure Machine Learning. Esta es la definición:

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

Si no aplica un campo nodeSelector, el pod se puede programar en cualquier nodo. A los pods de la carga de trabajo se les asignan recursos predeterminados con 0,1 núcleos de CPU, 2 GB de memoria y 0 GPU para la solicitud. Los recursos que usan los pods de la carga de trabajo están limitados a 2 núcleos de CPU y 8 GB de memoria.

El tipo de instancia predeterminado usa a propósito pocos recursos. Para asegurarse de que todas las cargas de trabajo de aprendizaje automático se ejecutan con recursos adecuados (por ejemplo, recurso de GPU), se recomienda encarecidamente crear tipos de instancia personalizados.

Tenga en cuenta los siguientes puntos en relación con el tipo de instancia predeterminado:

  • defaultinstancetype no aparece como un recurso personalizado InstanceType en el clúster cuando se ejecute el comando kubectl get instancetype, pero sí aparece en todos los clientes (interfaz de usuario, CLI de Azure, SDK).
  • defaultinstancetype se puede invalidar con la definición de un tipo de instancia personalizado que tenga el mismo nombre.

Creación de un tipo de instancia personalizado

Para crear un nuevo tipo de instancia, cree un nuevo recurso personalizado para el tipo de instancia CRD. Por ejemplo:

kubectl apply -f my_instance_type.yaml

Estos son los contenidos de 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"

El código anterior crea un tipo de instancia con el comportamiento etiquetado:

  • Los pods solo se programan en nodos que tienen la etiqueta mylabel: mylabelvalue.
  • A los pods se les asignan solicitudes de recursos de 700m para CPU y 1500Mi para memoria.
  • A los pods se les asignan límites de recursos de 1 para CPU, 2Gi para memoria y 1 para CPU de NVIDIA.

La creación de tipos de instancia personalizados debe cumplir los siguientes parámetros y reglas de definición, o se produce un error:

Parámetro Obligatorio u opcional Descripción
name Obligatorio Valores de cadena, que deben ser únicos en un clúster.
CPU request Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la CPU en millicores; por ejemplo, 100m. También puede especificarlo como números completos. Por ejemplo, "1" es equivalente a 1000m.
Memory request Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la memoria como un número completo y un sufijo; por ejemplo, 1024Mi para 1024 mebibytes (MiB).
CPU limit Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la CPU en millicores; por ejemplo, 100m. También puede especificarlo como números completos. Por ejemplo, "1" es equivalente a 1000m.
Memory limit Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la memoria como un número completo y un sufijo; por ejemplo, 1024Mi para 1024 MiB.
GPU Opcionales Valores enteros, que solo se pueden especificar en la sección limits.
Para obtener más información, consulte la documentación de Kubernetes.
nodeSelector Opcionales Asignación de claves y valores de cadena.

También es posible crear varios tipos de instancia a la vez:

kubectl apply -f my_instance_type_list.yaml

Estos son los contenidos de 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"

En el ejemplo anterior se crean dos tipos de instancia: cpusmall y defaultinstancetype. Esta definición defaultinstancetype invalida la definición defaultinstancetype creada cuando adjuntó el clúster de Kubernetes al área de trabajo de Azure Machine Learning.

Si envía una carga de trabajo de entrenamiento o inferencia sin un tipo de instancia, se usa defaultinstancetype. Para especificar un tipo de instancia predeterminado para un clúster de Kubernetes, cree un tipo de instancia con el nombre defaultinstancetype. Se reconoce automáticamente como valor predeterminado.

Selección de un tipo de instancia para enviar un trabajo de entrenamiento

Para seleccionar un tipo de instancia para un trabajo de entrenamiento con la CLI de Azure (v2), especifique su nombre como parte de la sección de propiedades resources en el YAML del trabajo. Por ejemplo:

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

En el ejemplo anterior, reemplace <Kubernetes-compute_target_name> por el nombre del destino de proceso de Kubernetes. Reemplace <instance type name> por el nombre del tipo de instancia que desea seleccionar. Si no especifica una propiedad instance_type, el sistema usa defaultinstancetype para enviar el trabajo.

Selección de un tipo de instancia para implementar un modelo

Para seleccionar un tipo de instancia para una implementación de modelo mediante la CLI de Azure (v2), especifique su nombre para la propiedad instance_type en el YAML de implementación. Por ejemplo:

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

En el ejemplo anterior, reemplace <instance type name> por el nombre del tipo de instancia que desea seleccionar. Si no especifica una propiedad instance_type, el sistema usa defaultinstancetype para implementar el modelo.

Importante

Para la implementación de modelo de MLflow, la solicitud de recursos requiere al menos 2 núcleos de CPU y 4 GB de memoria. De lo contrario, se producirá un error en la implementación.

Validación de la sección de recursos

Puede usar la sección resources para definir la solicitud de recursos y el límite de las implementaciones de modelo. Por ejemplo:

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>

Si usa la sección resources, una definición de recurso válida debe cumplir las reglas siguientes. Una definición de recurso no válida hace que se produzca un error en la implementación del modelo.

Parámetro Obligatorio u opcional Descripción
requests:
cpu:
Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la CPU en millicores; por ejemplo, 100m. También puede especificarlo en números completos. Por ejemplo, "1" es equivalente a 1000m.
requests:
memory:
Obligatorio Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la memoria como un número completo y un sufijo; por ejemplo, 1024Mi para 1024 MiB.
La memoria no puede ser inferior a 1 MB.
limits:
cpu:
Opcional
(necesario solo cuando se necesita GPU)
Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la CPU en millicores; por ejemplo, 100m. También puede especificarlo en números completos. Por ejemplo, "1" es equivalente a 1000m.
limits:
memory:
Opcional
(necesario solo cuando se necesita GPU)
Valores de cadena, que no pueden ser cero o estar vacíos.
Puede especificar la memoria como un número completo y un sufijo; por ejemplo, 1024Mi para 1024 MiB.
limits:
nvidia.com/gpu:
Opcional
(necesario solo cuando se necesita GPU)
Valores enteros, que no pueden estar vacíos y solo se pueden especificar en la sección limits.
Para obtener más información, consulte la documentación de Kubernetes.
Si solo requiere CPU, puede omitir toda la sección limits.

El tipo de instancia es necesario para la implementación de modelo. Si ha definido la sección resources y se validará con el tipo de instancia, las reglas son las siguientes:

  • Con una definición de sección resource válida, los límites de recursos deben ser menores que los límites de tipo de instancia. De lo contrario, se producirá un error en la implementación.
  • Si no define un tipo de instancia, el sistema usa defaultinstancetype para la validación con la sección resources.
  • Si no define la sección resources, el sistema usa el tipo de instancia para crear la implementación.

Pasos siguientes