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 camponodeSelector
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 camponodeSelector
especificado por la extensión y el camponodeSelector
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 camponodeSelector
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 personalizadoInstanceType
en el clúster cuando se ejecute el comandokubectl 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 y1500Mi
para memoria. - A los pods se les asignan límites de recursos de
1
para CPU,2Gi
para memoria y1
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ónresources
. - Si no define la sección
resources
, el sistema usa el tipo de instancia para crear la implementación.