Criar e gerenciar tipos de instâncias para uma utilização eficiente dos recursos de computação
Os tipos de instância são um conceito do Azure Machine Learning que permite direcionar determinados tipos de nós de computação para cargas de trabalho de treinamento e inferência. Por exemplo, em uma máquina virtual do Azure, um tipo de instância seria STANDARD_D2_V3
. Este artigo ensina como criar e gerenciar tipos de instância para seus requisitos de computação.
Nos clusters do Kubernetes, os tipos de instâncias são representados em uma definição de recurso personalizada (CDR) que é instalada com a extensão do Azure Machine Learning. Dois elementos na extensão do Azure Machine Learning representam os tipos de instâncias:
- Use o nodeSelector para especificar em qual nó um pod deve ser executado. O nó deve ter um rótulo correspondente.
- Na seção recursos, você pode definir os recursos de computação (CPU, memória e GPU NVIDIA) para o pod.
Se você especificar um nodeSelector ao implantar a extensão do Azure Machine Learning, o campo nodeSelector
será aplicado a todos os tipos de instâncias. Isso significa que:
- Para cada tipo de instância que você criar, o campo de
nodeSelector
especificado deve ser um subconjunto do camponodeSelector
especificado pela extensão. - Se você usar um tipo de instância com
nodeSelector
, a carga de trabalho será executada em qualquer nó que corresponda tanto ao camponodeSelector
especificado pela extensão quanto ao camponodeSelector
especificado pelo tipo de instância. - Se você usar um tipo de instância sem um campo
nodeSelector
, a carga de trabalho será executada em qualquer nó que corresponda ao camponodeSelector
especificado pela extensão.
Criar um tipo de instância padrão
Por padrão, um tipo de instância denominada defaultinstancetype
é criada quando você anexa um cluster do Kubernetes a um workspace do Azure Machine Learning. Confira a definição:
resources:
requests:
cpu: "100m"
memory: "2Gi"
limits:
cpu: "2"
memory: "2Gi"
nvidia.com/gpu: null
Se você não aplicar um campo nodeSelector
, o pod pode ser agendado em qualquer nó. Recursos padrão com 0,1 núcleos de CPU, 2 GB de memória e 0 GPU por solicitação são atribuídos aos pods da carga de trabalho. Os recursos que os pods da carga de trabalho usam são limitados a 2 núcleos de CPU e 8 GB de memória.
O tipo de instância padrão usa poucos recursos intencionalmente. Para garantir que todas as cargas de trabalho de machine learning sejam executadas com recursos apropriados (por exemplo, um recurso de GPU), é altamente recomendável que você crie tipos de instância personalizados.
Tenha em mente os seguintes pontos sobre o tipo de instância padrão:
- O
defaultinstancetype
não aparece como um recursoInstanceType
personalizado no cluster quando você está executando o comandokubectl get instancetype
, mas aparece em todos os clientes (interface do usuário, CLI do Azure, SDK). - O
defaultinstancetype
pode ser substituído pela definição de um tipo de instância personalizado que tenha o mesmo nome.
Criar um tipo de instância padrão
Para criar um novo tipo de instância, crie um novo recurso personalizado para o tipo de instância CRD. Por exemplo:
kubectl apply -f my_instance_type.yaml
Aqui temos o conteúdo 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"
O código anterior cria um tipo de instância com o comportamento rotulado:
- Os pods são agendados somente em nós que tenham o rótulo
mylabel: mylabelvalue
. - Solicitações de recursos de
700m
para CPU e1500Mi
para a memória são atribuídas aos pods. - Limites de recursos de
1
para CPU,2Gi
para memória e1
para GPU NVIDIA são atribuídos aos pods.
A criação de tipos de instância personalizadas deve cumprir os seguintes parâmetros e regras de definição (caso contrário, a criação falha):
Parâmetro | Obrigatório ou opcional | Descrição |
---|---|---|
name |
Obrigatório | Valores de cadeia de caracteres, que devem ser exclusivos em um cluster. |
CPU request |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a CPU em milinúcleos; por exemplo, 100m . Você também pode especificá-la como números inteiros. Por exemplo, "1" é equivalente a 1000m . |
Memory request |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a memória como um número inteiro + sufixo, por exemplo, 1024Mi para 1.024 mebibytes (MiB). |
CPU limit |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a CPU em milinúcleos; por exemplo, 100m . Você também pode especificá-la como números inteiros. Por exemplo, "1" é equivalente a 1000m . |
Memory limit |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a memória como um número completo + sufixo; por exemplo, 1024Mi para 1024 MiB. |
GPU |
Opcional | Valores inteiros, que podem ser especificados somente na seção limits . Para obter mais informações, consulte a documentação do Kubernetes. |
nodeSelector |
Opcional | Mapa de chaves e valores de cadeia de caracteres. |
Também é possível criar vários tipos de instâncias de uma vez:
kubectl apply -f my_instance_type_list.yaml
Aqui temos o conteúdo 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"
O exemplo anterior cria dois tipos de instância: cpusmall
e defaultinstancetype
. Essa definição de defaultinstancetype
substitui a definição de defaultinstancetype
que foi criada quando você anexou o cluster do Kubernetes ao workspace do Azure Machine Learning.
Se você enviar uma carga de trabalho de treinamento ou inferência sem um tipo de instância, ela usará o defaultinstancetype
. Para especificar um tipo de instância padrão para um cluster do Kubernetes, crie um tipo de instância com o nome defaultinstancetype
. Ele é reconhecido automaticamente como o padrão.
Selecionar um tipo de instância para enviar um trabalho de treinamento
Para selecionar um tipo de instância para um trabalho de treinamento usando a CLI do Azure (v2), especifique o respectivo nome como parte da seção de propriedades de resources
no YAML do trabalho. Por exemplo:
command: python -c "print('Hello world!')"
environment:
image: library/python:latest
compute: azureml:<Kubernetes-compute_target_name>
resources:
instance_type: <instance type name>
No exemplo anterior, substitua <Kubernetes-compute_target_name>
pelo nome do destino de computação do seu Kubernetes. Substitua <instance type name>
pelo nome do tipo de instância que você quer gerenciar. Se você não especificar uma propriedade instance_type
, o sistema usará defaultinstancetype
para enviar o trabalho.
Selecionar um tipo de instância para implantar um modelo
Para selecionar um tipo de instância para uma implantação de modelo usando a CLI do Azure (v2), especifique seu nome para a propriedade instance_type
no YAML de implantação. Por exemplo:
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
No exemplo anterior, substitua <instance type name>
pelo nome do tipo de instância que você quer gerenciar. Se você não especificar uma propriedade instance_type
, o sistema usará defaultinstancetype
para implantar o modelo.
Importante
Para a implantação do modelo do MLflow, a solicitação de recurso requer pelo menos 2 núcleos de CPU e 4 GB de memória. Caso contrário, a implantação falhará.
Validação da seção de recursos
Você pode usar a seção resources
para definir a solicitação de recurso e o limite de suas implantações de modelo. Por exemplo:
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>
Se você usar a seção resources
, uma definição de recurso válida precisará cumprir as regras a seguir. Uma definição de recurso inválida faz com que a implantação do modelo falhe.
Parâmetro | Obrigatório ou opcional | Descrição |
---|---|---|
requests: cpu: |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a CPU em milinúcleos; por exemplo, 100m . Você também pode especificá-la em números inteiros. Por exemplo, "1" é equivalente a 1000m . |
requests: memory: |
Obrigatório | Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a memória como um número completo + sufixo; por exemplo, 1024Mi para 1024 MiB. A memória não pode ter menos de 1 MB. |
limits: cpu: |
Opcional (necessário somente quando você precisa de GPU) |
Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a CPU em milinúcleos; por exemplo, 100m . Você também pode especificá-la em números inteiros. Por exemplo, "1" é equivalente a 1000m . |
limits: memory: |
Opcional (necessário somente quando você precisa de GPU) |
Valores de cadeia de caracteres, que não podem ser zero nem estar vazios. Você pode especificar a memória como um número inteiro + sufixo, por exemplo, 1024Mi para 1.024 MiB. |
limits: nvidia.com/gpu: |
Opcional (necessário somente quando você precisa de GPU) |
Valores inteiros, que não podem estar vazios e só podem ser especificados na seção limits . Para obter mais informações, consulte a documentação do Kubernetes. Se precisar apenas da CPU, você poderá omitir a seção limits inteira. |
O tipo de instância é obrigatório para a implantação de modelos. Se você definiu a seção resources
e ela será validada com relação ao tipo de instância, as regras serão as seguintes:
- Com uma definição válida da seção
resource
, os limites de recursos devem ser menores do que os limites de tipo de instância. Caso contrário, a implantação falhará. - Se você não definir um tipo de instância, o sistema usará
defaultinstancetype
para a validação com a seçãoresources
. - Se você não definir a seção
resources
, o sistema usará o tipo de instância para criar a implantação.