Share via


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 campo nodeSelector 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 campo nodeSelector especificado pela extensão quanto ao campo nodeSelector 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 campo nodeSelector 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 recurso InstanceType personalizado no cluster quando você está executando o comando kubectl 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 e 1500Mi para a memória são atribuídas aos pods.
  • Limites de recursos de 1 para CPU, 2Gi para memória e 1 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ção resources.
  • Se você não definir a seção resources, o sistema usará o tipo de instância para criar a implantação.

Próximas etapas